THMMY.gr

Μαθήματα Βασικού Κύκλου => Δομημένος Προγραμματισμός => Topic started by: xarxarias on May 26, 2009, 10:31:22 am



Title: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 26, 2009, 10:31:22 am
 
Εργασία F

Προκειμένου να ληφθούν στοιχεία που αφορούν τις διακυμάνσεις της θερμοκρασίας σε μια περιοχή του πλανήτη, εγκαθίσταται ένας αριθμός μετεωρολογικών σταθμών. Κάθε σταθμός διαθέτει έναν αριθμό αισθητήρων (ο αριθμός των αισθητήρων μπορεί να διαφέρει από σταθμό σε σταθμό) που τοποθετούνται έτσι ώστε να καλύπτεται μια μεγάλη περιοχή γύρο από τον σταθμό και οι οποίοι καταγράφουν την τιμή της θερμοκρασίας για μια δεδομένη στιγμή.

Για να ελεγχθεί η συχνότητα εμφάνισης ακραίων τιμών για την θερμοκρασία  μια δεδομένη στιγμή διαβάζονται οι ενδείξεις των αισθητήρων κάθε σταθμού και δημιουργείται ο πίνακας result με 3 στήλες. Στην   πρώτη στήλη του πίνακα καταχωρείται ο αύξων αριθμός του σταθμού, στη δεύτερη ο αριθμός των αισθητήρων του που σημείωσαν θερμοκρασία κάτω από ένα ελάχιστο αποδεκτό όριο και στη τρίτη ο αριθμός των αισθητήρων που σημείωσαν θερμοκρασία πάνω από ένα μέγιστο όριο. Στον πίνακα καταχωρούνται μόνον οι σταθμοί για τους οποίους στους αισθητήρες τους  σημειώθηκε υπέρβαση ενός τουλάχιστον από τα δύο όρια που έχουν τεθεί

Να γραφεί το πρόγραμμα στο οποίο να ορίζεται η συνάρτηση extrem η οποία δέχεται, μέσα από τα ορίσματά της, τον πίνακα temp, δυο διαστάσεων, ο οποίος διαθέτει μια γραμμή για κάθε σταθμό στην οποία είναι καταχωρημένες οι τιμές της θερμοκρασίας που σημείωσαν οι αισθητήρες του σταθμού.  Η συνάρτηση να δεσμεύει δυναμικά την ελάχιστη απαιτούμενη μνήμη για τη δημιουργία του πίνακα result στον οποίο και να καταχωρεί τις αντίστοιχες τιμές. Ως επιστρεφόμενη τιμή της συνάρτησης να είναι ο πίνακας result που αυτή δημιούργησε.

Η συνάρτηση main του προγράμματος να διαβάζει την ελάχιστή και τη μέγιστη αποδεκτή θερμοκρασία και τον αριθμό των σταθμών. Να διαβάζει  για κάθε σταθμό τον αριθμό των αισθητήρων που διαθέτει και να δεσμεύει δυναμικά την ελάχιστη απαιτούμενη μνήμη για τη δημιουργία του πίνακα temp. Στη συνέχεια, αφού διαβάσει για κάθε σταθμό τις τιμές της θερμοκρασίας που σημείωσαν οι αισθητήρες του να καλεί τη συνάρτηση extrem για να σχηματίσει τον πίνακα result τον οποίο και να εκτυπώνει.
 
Βοηθητικές παρατηρήσεις
 
Για τους επιπλέον πίνακες που ενδεχόμενα θα χρειαστείτε η μνήμη να δεσμεύεται δυναμικά.
Η δέσμευση μνήμης για τον πίνακα  result να γίνεται ανακατανέμοντας τη μνήμη που δεσμεύτηκε ώστε να προστίθεται μια νέα γραμμή στον πίνακα όταν  διαπιστωθεί ότι υπάρχει νέος σταθμός με υπέρβαση των ορίων στη θερμοκρασία.
Οι γραμμές του πίνακα temp να έχουν μήκος όσος είναι ο αριθμός των αισθητήρων που διαθέτει ο αντίστοιχος σταθμός.
 


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 26, 2009, 11:46:13 am
F@ck me....κιόλας?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ΡΕΣΑΛΤΟ on May 26, 2009, 14:40:20 pm
ελα αυτη ειναι σοβαρη ασκηση... :o
τουλαχιστον ετσι νομιζω με μια αναγνωση.
θελει τετρις αντι για πινακες και realloc.

καλη δυναμη :D :D


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: nasia!! on May 26, 2009, 19:46:18 pm
Nαι,μας είπε σήμερα πως η προηγούμενη είχε μόνο να κάνουμε την recur σαν δύσκολο κομμάτι και δεν είχε κάτι από δυναμική καταχώρηση μνήμης ουσιαστικά,οπότε αυτή η άσκηση έχει! ;)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 27, 2009, 20:47:54 pm

Εργασία F
....
Κάθε σταθμός διαθέτει έναν αριθμό αισθητήρων (ο αριθμός των αισθητήρων μπορεί να διαφέρει από σταθμό σε σταθμό) που τοποθετούνται έτσι ώστε να καλύπτεται μια μεγάλη περιοχή γύρο από τον σταθμό και οι οποίοι καταγράφουν την τιμή της θερμοκρασίας για μια δεδομένη στιγμή.

Κάποιος ονειρεύεται γύρους. :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 27, 2009, 22:25:34 pm

Εργασία F


Βοηθητικές παρατηρήσεις
 
Για τους επιπλέον πίνακες που ενδεχόμενα θα χρειαστείτε η μνήμη να δεσμεύεται δυναμικά.
Η δέσμευση μνήμης για τον πίνακα  result να γίνεται ανακατανέμοντας τη μνήμη που δεσμεύτηκε ώστε να προστίθεται μια νέα γραμμή στον πίνακα όταν  διαπιστωθεί ότι υπάρχει νέος σταθμός με υπέρβαση των ορίων στη θερμοκρασία.
Οι γραμμές του πίνακα temp να έχουν μήκος όσος είναι ο αριθμός των αισθητήρων που διαθέτει ο αντίστοιχος σταθμός.
 
Ο temp είναι 2χ2 πίνακας όμως οι γραμμές του δεν θα έχουν το ίδο μέγεθος,άρα η δομή αυτή δεν θα είναι πίνακας.Θα πρέπει εμείς να συμπληρώσουμε στοιχεία του "πίνακα" ώστε αυτός να γίνει ορθογώνιος?Ιδέες?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 27, 2009, 22:35:51 pm
Μάλλον εκεί είναι η ουσία της άσκησης,εμείς θέλουμε να δεσμεύει μόνο όση μνήμη χρειάζεται δημιουργώντας κατά κάποιο τρόπο "σκαλάκια" στον 2χ2 πίνακα?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 27, 2009, 23:10:27 pm
Μάλλον εκεί είναι η ουσία της άσκησης,εμείς θέλουμε να δεσμεύει μόνο όση μνήμη χρειάζεται δημιουργώντας κατά κάποιο τρόπο "σκαλάκια" στον 2χ2 πίνακα?

ναι

ο πίνακας μπορεί να είναι της μορφής

χ χ χ χ χ χ
χ χ χ
χ χ χ χ χ χ χ χ
χ χ  χ χ χ χ
χ χ
...

μπορείς να το κάνεις κάπως έτσι
Code:
#include <stdio.h>


int main()
{
    int **pin,stiles[10],i;
   
    for(i=0;i<10;i++){
        printf("Posous aisthitires exei o %d?",i);
        scanf("%d",&stiles[i]);
    }
   
    pin=(int**)malloc(10*sizeof(int*));
   
    for(i=0;i<10;i++)
        pin[i]=(int*)malloc(stiles[i]*sizeof(int));
}
   


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 27, 2009, 23:36:43 pm
Και για 2διάστατο πίνακα κάτι του στυλ:
Code:
temp=(float**)malloc(n*sizeof(float));
for (i=0;i<n;i++){
        temp[i]=(float*)malloc(sensors[i]*sizeof(float));
        for(j=0;j<sensors[i];j++){
                         printf("\nDwse thermokrasia tou aisthhthra %d tou %d stathmou: ",j,i+1);
                         scanf("%f",&temp[i][j]);
        }
}
?
edit:βασικά η απορία μου είναι αν μπορώ να βάλω στην 2η loop μεταβλητό j(δεν το χω ξαναδεί)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 27, 2009, 23:47:42 pm
 Tι πάει να πει invalid preprocessing directive #include?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 28, 2009, 00:07:35 am

edit:βασικά η απορία μου είναι αν μπορώ να βάλω στην 2η loop μεταβλητό j(δεν το χω ξαναδεί)

Μπορείς και επιβάλλεται κιόλας στο συγκεκριμένο παράδειγμα


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Sonic on May 28, 2009, 01:23:03 am

edit:βασικά η απορία μου είναι αν μπορώ να βάλω στην 2η loop μεταβλητό j(δεν το χω ξαναδεί)

για την ακριβεια το j ειναι παντα μεταβλητο, απο την τιμη Ν1 μεχρι καποια τιμη Ν2 με καποιο βημα Κ :D.
απλα το Ν2 τωρα θα εξαρταται απο το i αλλα θα ειναι σταθερο καθε φοαρα που θα αρχιζει μια επαναληψη του j (ισο π.χ. με Ν2[3] για i=3).


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: erotokritos on May 28, 2009, 20:27:48 pm
μεσα στη main καλω την συναρτηση καπωσ ετσι   y=extrem(temp,aist,max,min)   ;
 μου βγαζει σφαλμα   invalid types `int[int]' for array subscript

εχει κανεισ καμια ιδεα?
με ποιον τροπο επιστρεφεισ απο τη συναρτηση extrem τον πινακα result?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Sonic on May 28, 2009, 20:33:37 pm
δεν ειναι αναγκη να επιστρεψεις πινακα(για την ακριβεια δεν ξερω και πως).δοκιμασε να επιστρεφει pointer σε pointer(**p) π.χ.
Code:
int **p;
p=result(...);


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: erotokritos on May 28, 2009, 21:33:01 pm
ευχαριστω πολυ!!τελικα δουλεψε ετσι!!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 28, 2009, 22:44:56 pm
Ερώτησις:Όταν έχω δεσμεύσει δυναμικά έναν 2χ2 πίνακα χρησιμοποιώντας την ιδέα με τον πίνακα από pointers και στο τέλος του προγράμματος θέλω να αποδεσμεύσω από την μνήμη αυτόν τον πίνακα(τον 2χ2),πρέπει να αποδεσμεύσω πρώτα τους pointers στις γραμμές του πίνακα και μετά τον pointer σε pointer?Δηλαδή να κάνω κάτι τέτοιο?:
Code:
p=(float**)malloc(stathmoi*sizeof(float));
for(i=0;i<stathmoi;i++){
    p[i]=(float*)malloc(sensors[i]*sizeof(float));
}                                           //μέχρι εδώ δέσμευση κατά τα γνωστά
for(i=0;i<stathmoi;i++){
    free(p[i]);                           //όμως και εδώ έτσι?(και μάλιστα με ανάποδη σειρά?)
}
free(p);

?

edit:είναι δηλαδή το ίδιο σκεπτικό με τις συναρτήσεις τελικών /αρχικών συνθηκών από παράγουσες κλάσεις όπως κάναμε στην C++(νταξ μακριά το πάω)?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 28, 2009, 22:57:24 pm
Αφήστε το έψαξα και είναι όντως έτσι.Δείτε εδ (http://www.codeproject.com/KB/cpp/pointertopointer.aspx).Tα εξηγεί άψογα :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 29, 2009, 00:00:25 am
Emfanever, τι ακριβώς ρε συ σημαίνει αυτό:

Quote
pin=(int**)malloc(10*sizeof(int*));

Αυτό το (int**) πριν τη μαλοκ δηλαδή τι κάνει? δε μπορώ να το βρω στις σημειώσεις.. thanx!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: gate4 on May 29, 2009, 00:12:26 am
δηλωσα τον result σαν μονοδιαστατο και με την realloc καθε φορα αυξανεται τρεις θεσεις
siz=3*malloc(sizeof(int))
result=(int*)malloc(siz)
......
.....
siz=siz+3*sizeof(int)
result=realloc(result,siz)

oμως ζηταει νχ3 πινακα  :???:  με realloc καμια ιδεα πως δημιουργειται ο nx3 πινακας?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on May 29, 2009, 00:15:54 am
μπορουμε μεσα στη for που δεσμευουμαι δυναμικα μνημη για τον temp να βαλουμε και την scanf για να διαβασει τις τιμες κατευθιαν?
Η πρεπει να κανω και αλλο loop?


ok το βρηκα.γινεται


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 29, 2009, 00:18:42 am
+ επίσης πώς γίνεται το λουπ να κρατάει μέχρι όσους αισθητήρες έχω, εφόσον ο αριθμός δεν είναι σταθερός? με πίνακα sensors μου βγάζει error int(int), κάτι τέτοιο..!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: gate4 on May 29, 2009, 00:21:10 am
+ επίσης πώς γίνεται το λουπ να κρατάει μέχρι όσους αισθητήρες έχω, εφόσον ο αριθμός δεν είναι σταθερός? με πίνακα sensors μου βγάζει error int(int), κάτι τέτοιο..!

?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on May 29, 2009, 00:24:10 am
+ επίσης πώς γίνεται το λουπ να κρατάει μέχρι όσους αισθητήρες έχω, εφόσον ο αριθμός δεν είναι σταθερός? με πίνακα sensors μου βγάζει error int(int), κάτι τέτοιο..!

?

βαλε τον αριθμο των αισθητηρων σε ενα πινακα.μετα οταν θα δεσμευσεις δυναμικα μνημη για τον temp βαζεις για παραδειγμα στο loop for (i=0 ; i<sensors ; i++)
Υπαρχει και σε προηφουμενο post


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 29, 2009, 00:27:04 am
το είδα απλά μου το έβγαλε έρρορ ο κομπάιλερ, γι αυτό.. θα το ψάξω και αύριο.. γαμώ τις εργασίες :P


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 00:41:09 am
Emfanever, τι ακριβώς ρε συ σημαίνει αυτό:

Quote
pin=(int**)malloc(10*sizeof(int*));

Αυτό το (int**) πριν τη μαλοκ δηλαδή τι κάνει? δε μπορώ να το βρω στις σημειώσεις.. thanx!

επειδή η malloc επιστρέφει void  και εγώ δήλωσα το pin  int**,  κάνω "type casting" αλλιώς θα βγάλει πρόβλημα στην ισότητα


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Sonic on May 29, 2009, 00:58:55 am
 μια ερωτηση:
Code:
if((p=malloc(n*sizeof(int *)))==NULL){
    printf("oxi arketh mnhmh gia katanomh\n");
    exit(1);
}

αν οντως η malloc δεν μπορεσει να κατανεμει μνημη(και αρα θα μπει στην if) τι μπορω να κανω..?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 01:42:29 am
μπορείς να βάλεις μια while που να ελέγχει αν επιστρέφει null


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 12:09:43 pm
Guys,αν θέλω να κάνω realloc σε δυσδιάστατο πίνακα ,μπορώ να κάνω realloc μόνο για το 1ο επίπεδο pointer(pointer to pointer)?Δηλαδή ας πούμε:
Code:
float **p,**lol;
p=(float**)malloc(n*sizeof(float));
for(i=0;i<n;i++) p[i]=(float*)malloc(sensors[i]*sizeof(float)); //δέσμευση κατά τα γνωστά
lol=(float**)realloc(p,max_trexa_gureve);                            //γίνεται αυτό??

Επίσης,όταν λέει ότι κάθε σταθμός έχει έναν συγκεκριμένο αριθμό αισθητήρων,αυτοί οι αισθητήρες μετρούν διαφορετική θερμοκρασία?Είναι πολύ βασικό αυτο.


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on May 29, 2009, 13:46:53 pm
στην extrem ο result που θελω να επιστεφει ειναι διπλος poionter ετσι?
Πως θα τον επιστεψω?
return **result ειναι σωστο?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 14:37:17 pm
Όχι,return result; είναι το σωστό.Το διπλό αστεράκι το βάζεις μόνο όταν θέλεις να το δηλώσεις ή να πάρεις την τιμή του.Εσύ ούτε την τιμή του θέλεις ούτε να το (ξανά)δηλώσεις.Θέλεις την διεύθυνση,τον ίδιο τον pointer δλδ,άρα στην return τον βάζεις(τον pointer) σκέτο.


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on May 29, 2009, 15:22:18 pm
Οταν τον βαζω
return result;
μου βγαζει compile error : invalid conversion  from `int**' to `int'


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: gate4 on May 29, 2009, 15:39:49 pm
πρεπει να το επιστρεψει σαν pointer δοκιμασε int** extrem(...) πως το εκανες με δισδιαστατο result?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on May 29, 2009, 15:57:56 pm
Ετσι το δηλωσα:
int extrem(.............)
{
    int **result....
..........................
....................
.....................
return **result
}

Ετσι δε μου βγαζει compile error αλλα πρεπει να ειναι σωστο


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: gate4 on May 29, 2009, 16:10:40 pm
Ετσι το δηλωσα:
int** extrem(.............)
{
    int **result....
..........................
....................
.....................
return result
}

Ετσι δε μου βγαζει compile error αλλα πρεπει να ειναι σωστο

se mena sto return *result bgazei error sto compile ekei pou kano klisi tis sinartisis..int *extrem(..) kai return result den bgazei

δηλωσα τον result σαν μονοδιαστατο και με την realloc καθε φορα αυξανεται τρεις θεσεις
siz=3*malloc(sizeof(int))
result=(int*)malloc(siz)
......
.....
siz=siz+3*sizeof(int)
result=realloc(result,siz)

oμως ζηταει νχ3 πινακα  :???:  με realloc καμια ιδεα πως δημιουργειται ο nx3 πινακας?



Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 16:32:33 pm
γιατί να χρησιμοποιήσετε realloc? με malloc δε γίνεται?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 17:05:14 pm
γιατί να χρησιμοποιήσετε realloc? με malloc δε γίνεται?
Δεν θέλει να κάνεις realloc κάθε φορά που βρίσκει έναν σταθμό που ξεπερνάει τα όρια της θερμοκρασίας?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 17:10:53 pm
γιατί να χρησιμοποιήσετε realloc? με malloc δε γίνεται?
Δεν θέλει να κάνεις realloc κάθε φορά που βρίσκει έναν σταθμό που ξεπερνάει τα όρια της θερμοκρασίας?

Ναι πράγματι δε το είχα διαβάσει!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: diutinus on May 29, 2009, 19:34:59 pm
Εγώ αυτό με το realloc έκανα το εξής:

Όρισα result (1ο επίπεδο - γραμμές) με κ=0 γραμμές (περισσότερο χάριν οργανώσεως)

Έκανα for-loop κ τσεκαρα για πόσους σταθμούς υπήρχε off-limit τιμή

Κάθε φορά έκανα realloc με μέγεθος κ++

Στο τέλος, malloc δεύτερο επίπεδο, στήλες.

Θ μπορούσε να γίνει κ χωρίς realloc νομίζω: Τσέκαρε με λουπ, κάθε φορά κ++, στο τέλος malloc me κ γραμμές.
Αλλά λογικά θέλει να δει χρήση της malloc, οπότε... :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 20:07:30 pm
Εγώ αυτό με το realloc έκανα το εξής:

Όρισα result (1ο επίπεδο - γραμμές) με κ=0 γραμμές (περισσότερο χάριν οργανώσεως)

Έκανα for-loop κ τσεκαρα για πόσους σταθμούς υπήρχε off-limit τιμή

Κάθε φορά έκανα realloc με μέγεθος κ++

Στο τέλος, malloc δεύτερο επίπεδο, στήλες.

Θ μπορούσε να γίνει κ χωρίς realloc νομίζω: Τσέκαρε με λουπ, κάθε φορά κ++, στο τέλος malloc me κ γραμμές.
Αλλά λογικά θέλει να δει χρήση της malloc, οπότε... :)
Πολύ σωστή παρατήρηση αυτή


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 20:34:11 pm
Για τη χρήση της realloc πρεπει να έχουμε κάνει ενα malloc πρώτα ή δε χρειάζεται??


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 20:40:36 pm
E ναι ρε,αλλιώς που θα δείχνει ο pointer(1ο όρισμα της realloc)?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 21:24:36 pm
Λεω και εγω γιατι δε δουλεύει..Παιζει να επιστρέφει NULL αν δεν είναι ήδη δηλωμένη..


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: gate4 on May 29, 2009, 21:30:35 pm
code for extrem


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 21:33:04 pm
Μα για σκέψου το λίγο:ανακατανομή μιας μνήμης που δεν έχεις...κατανέμει.



Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 21:46:59 pm
Ειπα μπας και θεωρουσε στανταρ οτι έχει κατανεμημένη μια θέση στη μνήμη..Βλακεία όντος..Αλλά το ΄πρόβλημα δε το γλίτωσα..

Έχοντας με τι malloc δώσει μόνο μιά θέση στη result
Code:
         if (malloc(sizeof(int*))==NULL)
         {
         printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
         exit(1);
          result=(int**)malloc(sizeof(int*));
         }
,έτσι ώστε να υπάρχει μια αρχική κατανόμή, και ενώ είμαι ήδη στην επανάληψη για i=0;i<n;i++ (γραμμές τou temp)  κάνω το εξής:
Code:
           if (sum1!=0 || sum2!=0)
           {
            k+=1;
            if (realloc(result,(u++)*sizeof(int*))==NULL)
            {
             printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
             getch();
             exit(1);
            }
            result=(int**)realloc(result,(u++)*sizeof(int*));

όπου sum1 sum2 το πλήθος των μεγαλυτερων και μικρότερων των ορίων θερμοκρασιών στη i γραμμή του πίνακα temp.
Το k ειναι ενας ασχετος μετρητης ενώ το u έχει την αρχική τιμή 0..
Δυστυχώς, η realloc επιστρέφει NULL..καμιά ιδέα?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 21:54:25 pm
Ειπα μπας και θεωρουσε στανταρ οτι έχει κατανεμημένη μια θέση στη μνήμη..Βλακεία όντος..Αλλά το ΄πρόβλημα δε το γλίτωσα..

Έχοντας με τι malloc δώσει μόνο μιά θέση στη result,έτσι ώστε να υπάρχει μια αρχική κατανόμή, και ενώ είμαι ήδη στην επανάληψη για i=0;i<n;i++ (γραμμές τou temp)  κάνω το εξής:
Code:
           if (sum1!=0 || sum2!=0)
           {
            k+=1;
            if (realloc(result,(u++)*sizeof(int*))==NULL)
            {
             printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
             getch();
             exit(1);
            }
            result=(int**)realloc(result,(u++)*sizeof(int*));
            printf("%d",sum1);
            getch();

όπου sum1 sum2 το πλήθος των μεγαλυτερων και μικρότερων των ορίων θερμοκρασιών στη i γραμμή του πίνακα temp.
΄
Δυστυχώς, η realloc επιστρέφει NULL..καμιά ιδέα?
Μάλλον φταίει ο u++.Nα υποθέσω ότι είναι pointer?Περίπλοκο τρόπο βρήκες για να εκφράσεις το μέγεθος.Άκου μια ιδέα: κάνε ένα sum κάθε φορά που βρίσκεις ότι ενας σταθμός έχει αισθητήρες που ξεπερνάν τα όρια(
Code:
int n=0;
for(...)
for(...)
if (temp[i][j]>max)n+=1;
if (temp[i][j]<min) n+=1;
)
Και μετά να κάνεις realloc με το n.Αν το n==0 τότε επιστρέφεις τον pointer της malloc.Αλλίως επιστρέφεις τον pointer της realloc(αφού αν το n==0,μόνο τότε θα γίνεται ανακατανομή)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 22:07:47 pm
O u είναι ένας απλός integer. Η λογική μου είναι η εξής..:

Αν στον i σταθμό έχουμε τιμές που ξεπερνάν ή τα πάνω ή τα κάτω όρια(δηλαδή sum1,sum2!=0)
τότε με χρήση της realloc πρόσθεσε στην result μια γραμμή.
Στη συνέχεια στη νέα γραμμή,δημιούργησε τις στήλες...Παραθέτω ολόκληρο τον κώδικα της συνάρτησης:           

m o πίνακας με το πλήθος των θερμοκρασιών των σταθμών,κ ένας μετρητής...


Code:
void extrem(int **temp,int **result,int n,int *m,int tempmin,int tempmax,int k)
{
         int i=0,j=0,sum1,sum2,u=0;
         k=0;
         if (malloc(sizeof(int*))==NULL)
         {
         printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
         exit(1);
         }
         result=(int**)malloc(sizeof(int*));
         for (i=0;i<n;i++)
         {
             sum1=0;
             sum2=0;

             for (j=0;j<m[i];j++)
             {
                 if (temp[i][j]>tempmax)
                 sum1+=1;
                 if (temp[i][j]<tempmin)
                 sum2+=1;
             }
            printf("%d",sum1);
            getch();
           if (sum1!=0 || sum2!=0)
           {
            k+=1;
            if (realloc(result,(u++)*sizeof(int*))==NULL)
            {
             printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
             getch();
             exit(1);
            }
            result=(int**)realloc(result,(u++)*sizeof(int*));
            printf("%d",sum1);
            getch();
           
            if (malloc(3*sizeof(int))==NULL)
            {
             printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
             exit(1);
            }
            *(result+k-1)=(int*)malloc(3*sizeof(int));
            result[i][0]=i+1;
            printf("%d",result[i][0]);
            getch();
            result[i][1]=sum2;
            result[i][2]=sum1;
           }
         }
}



Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 22:12:53 pm
Ειπα μπας και θεωρουσε στανταρ οτι έχει κατανεμημένη μια θέση στη μνήμη..Βλακεία όντος..Αλλά το ΄πρόβλημα δε το γλίτωσα..

Έχοντας με τι malloc δώσει μόνο μιά θέση στη result
Code:
         if (malloc(sizeof(int*))==NULL)
         {
         printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
         exit(1);
          result=(int**)malloc(sizeof(int*));
         }
,έτσι ώστε να υπάρχει μια αρχική κατανόμή, και ενώ είμαι ήδη στην επανάληψη για i=0;i<n;i++ (γραμμές τou temp)  κάνω το εξής:
Code:
           if (sum1!=0 || sum2!=0)
           {
            k+=1;
            if (realloc(result,(u++)*sizeof(int*))==NULL)
            {
             printf("Den iparxei diathesimi mnimi gia tin ektelesi tou programmatos");
             getch();
             exit(1);
            }
            result=(int**)realloc(result,(u++)*sizeof(int*));

όπου sum1 sum2 το πλήθος των μεγαλυτερων και μικρότερων των ορίων θερμοκρασιών στη i γραμμή του πίνακα temp.
Το k ειναι ενας ασχετος μετρητης ενώ το u έχει την αρχική τιμή 0..
Δυστυχώς, η realloc επιστρέφει NULL..καμιά ιδέα?

Υπάρχει μια μικρή πιθανότητα να φταίει το u++  και συγκεκριμένα ότι το ++ είναι μετά το u. Δοκίμασε το ++u . Τι τιμή έχει αρχικά το u?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 22:14:17 pm
Aπό τα ορίσματα έχει τιμη 0..


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 22:17:41 pm
Ναι.. Αυτό έφτεγε..!Ωραίος!!Και τώρα που ξεπεράσαμε αυτο το εμπόδιο....Crashaρει!!!Αυτο θα το παλέψω μόνος μου..λογικά είναι στην επιστροφή απ τη συνάρτηση στη  main...


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 22:21:14 pm
Aπό τα ορίσματα έχει τιμη 0..

Δλδ , όταν για πρώτη φορά κάνει u++ στη realloc έχει τιμή 0?

αν είναι έτσι    

realloc(result,(u++)*sizeof(int*))      

τότε ,την πρώτη φορά γίνεται ουσιαστικά realloc(result,0*sizeof(int*), επειδή το u++ σημαίνει ότι η αύξηση στο u θα γίνει μετά από την πράξη στην οποία χρησιμοποιείται το u.

αν βάλεις ++u τότε θα γίνει realloc(result,1*sizeof(int*)

αλλά και πάλι δεν έχει νόημα γιατί το μέγεθος είναι ίδιο με το μέγεθος που έχει ήδη ο result (δλδ 1*sizeof(int*))

καλύτερα ξεκίνα με u =1 και κάντο ++u


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 22:26:29 pm
subscripted value is neither array nor pointer:
Code:
if(j==1) printf("\nArithmos aisthhthrwn me megalh thermokrasia tou %d STATHMOU : %d",i,extrem[i][1]);
Ξέρει κανείς τι παίζει?Emfa? :P


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 22:28:21 pm
Δεν βγάζω απ έξω την πρώτη επανάληψη, οπότε είναι προτιμότερο να κάνω την ίδια κατανομή της μνήμης δυο φορές, παρά να γράφω 15 γραμμές κώδικα..

Πάντος, σχεδόν δουλεύει!!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 22:29:24 pm
subscripted value is neither array nor pointer:
Code:
if(j==1) printf("\nArithmos aisthhthrwn me megalh thermokrasia tou %d STATHMOU : %d",i,extrem[i][1]);
Ξέρει κανείς τι παίζει?Emfa? :P
σε αυτή τη γραμμή δε βλέπω λάθος... ίσως είναι κάπου αλλού... μπορεί το σφάλμα να είναι 1-2 γράμμες πάνω κάτω

edit: το extrem συνάρτηση δεν πρέπει να είναι (σύμφωνα με την εκφώνηση)?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on May 29, 2009, 22:52:26 pm
από τη στιγμή που η extrem είναι συνάρτηση , γιατί γράφεις extrem [i ][1] σαν να είναι pointer to pointer?

ίσως κάτι της μορφής (extrem(ορίσματα...)) [i ][1]  να δούλευε

αλλά καλύτερα γράψε πχ

int ** temp;

temp= extrem (ορίσματα )

και μετά στην printf βάλε temp[i ][1]


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 29, 2009, 22:55:03 pm
Ok ρε φίλε,είσαι μεγάλος τελικά :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on May 29, 2009, 23:27:44 pm
Ρε παιδιά, μήπως ο πίνακας result πρεπει να ειναι τριπλός και όχι διπλός pointer?Για κάποιο λόγω, όλα δουλεύουν άψογα, αλλά το return[j] όταν πάω να το τυπώσω απο τη main,κάνει το πρόγραμμα να σταματάει τη λειτουργία του(απλά να κλείνει χωρίς να βγάλει error αλλά και δεν τρέχει ότι εντολές ακολουθούν την return...)Tι μπορεί να παίζει?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: gate4 on May 30, 2009, 15:40:52 pm
καλω p=extrem(......)
t:temp
m:arithmos stathmwn
a:pinakas me ton arithmo aisthitirwn

Code:
int** extrem(float min,float max,float **t,int m,int *a) {

int i,j,pla,plb,q,u=1,c=0;
int **result;
result=(int**)malloc(sizeof(int*)*1);
result[0]=(int*)malloc(sizeof(int)*3);
for(i=0;i<m;i++) {
pla=0;
plb=0;
q=0; 
for(j=0;j<a[i];j++) {
if(t[i][j]<min) {
pla=pla+1;
q=1;}
if(t[i][j]>max) {
plb=plb+1;
q=1;}
}
if(q==1) {                  //q=1 :brethike stathmos poy yperbainei ta oria thermokrasias 
if (realloc(result,(u+1)*sizeof(int*))==NULL)
{
printf("\n Den iparxei diathesimi mnimi");
getch();
exit(1);
}
result=(int**)realloc(result,(u+1)*sizeof(int*)); //prosthiki mias epipleon grammis
if (malloc(3*sizeof(int))==NULL){
printf("Den iparxei diathesimi mnimi");
getch();
exit(1);}
u=u+1;
result[c+1]=(int*)malloc(3*sizeof(int));
result[c][0]=i+1;                                  
result[c][1]=pla;
result[c][2]=plb;
c=c+1;
result[c][0]=-100;    // gemizei thn parapanw grammi me -100,teleutaia grammi tou result
result[c][1]=-100;
result[c][2]=-100;                                                                                                    
}
}
return result;
}

crash....pou einai to lathos?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Sonic on May 30, 2009, 19:38:27 pm
σε καποια  σημεια απλα καλεις τη (m/re)alloc χωρις να εκχωρεις αυτο που θα σου επιστρεψει σε μια μεταβλητη. ενω σε αλλα καλεις τη (m/re)alloc χωρις συνθηκη ελεγχου,δηλ. ακομα και αν η malloc δεν καταφερει να βρει μημη εσυ συνεχιζεις απτοητος..! επισης στη realloc η προηγουμενη θεση μνημης (pointer) μπαινει ως δευτρερο ορισμα.


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 30, 2009, 19:55:22 pm

σε καποια  σημεια απλα καλεις τη (m/re)alloc χωρις να εκχωρεις αυτο που θα σου επιστρεψει σε μια μεταβλητη. ενω σε αλλα καλεις τη (m/re)alloc χωρις συνθηκη ελεγχου,δηλ. ακομα και αν η malloc δεν καταφερει να βρει μημη εσυ συνεχιζεις απτοητος..! επισης στη realloc η προηγουμενη θεση μνημης (pointer) μπαινει ως δευτρερο ορισμα.
Πρώτο όρισμα,το δεύτερο είναι για το νέο μέγεθος


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: diutinus on May 30, 2009, 21:14:07 pm
Μήπως επιστρέφει διεύθυνση μνήμης αντί για τιμή;; (Δλδ κάτι στραβό με τα αστεράκια;) Γιατί κ σ'εμένα έκανε κάτι κουφά στην αρχή.

Και μπαι δε γουέη ρε παιδιά, σόρυ αλλα υπάρχει και το edit. Δε χρειάζονται σαράντα συνεχόμενα ποστς, απλά γίνεται χαώδες το τόπικ και δύσκολο να το παρακολουθήσει κάποιος  :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 30, 2009, 22:26:20 pm
Η εντολή

Code:
temp=extrem(temp,min,max,n,sensors);

καλεί πρώτα την extrem με όρισμα τον temp και μετά επιστρέφει την τιμή της στον temp,
σωστά?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Αθηρ on May 31, 2009, 15:16:35 pm
Paidakia exw oloklhrwsei ton kwdika alla ta apotelesmata pou mou vgazei otan epistrefw ton pinaka result stin main den einai swsta alla alampournezika...oi dhlwseis pou exw kanei einai swstes tis koitaksa ksana kai ksana...i diadikasia me tin opoia apothikevo ta apotelesmata ston pinaka einai epishs swsth tin koitaksa epishs ksana kai ksana again n again!Ti mporei na ftaiei?Isws kati me kapoion pointer?i kati me dynamikh katanomh?An kapoios parousiase to idio provlhma kai to elyse parakalw as epikoinwnhsei mazi mou i as postarei telospadwn...


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 31, 2009, 19:59:05 pm
αν παραβλέψω το γεγονός ότι τρέχει λάθος.. ξέρει κανείς στο τέλος πως εκτυπώνουμε τον πίνακα με τα στοιχεία σε στοίχιση;; δηλαδή να είναι κάπως όμορφο, όχι απλά 3 τιμές σε κάθε γραμμή...κι επίσης κατά τη δημιουργία του result πώς ακριβώς θα ξέρουμε πόσους αισθητήρες να ψάχνει κάθε φορά, εφόσον ο αριθμός δεν είναι σταθερός αλλά αλλάζει μέσα σε λουπ στη main?? :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 31, 2009, 20:25:52 pm
αν παραβλέψω το γεγονός ότι τρέχει λάθος.. ξέρει κανείς στο τέλος πως εκτυπώνουμε τον πίνακα με τα στοιχεία σε στοίχιση;; δηλαδή να είναι κάπως όμορφο, όχι απλά 3 τιμές σε κάθε γραμμή...κι επίσης κατά τη δημιουργία του result πώς ακριβώς θα ξέρουμε πόσους αισθητήρες να ψάχνει κάθε φορά, εφόσον ο αριθμός δεν είναι σταθερός αλλά αλλάζει μέσα σε λουπ στη main?? :)
Για την όμορφη εκτύπωση μπορείς να κάνεις κάτι τέτοιο:
Code:
printf("\n\n\n---KATASTATIKOS PINAKAS STATHMWN---\n\n\n");
for (i=0;i<n;i++){
                         printf("\nAYXON ARITHMOS PINAKA : %d  ",i);
                         printf("\nArithmos aisthhthrwn me megalh thermokrasia tou %d STATHMOU : %d",i,temp[i][1]);
                         printf("\nArithmos aisthhthrwn me xamhlh thermokrasia tou %d STATHMOU : %d",i,temp[i][2]);  
}
Όσο για το πως θα ξέρεις πόσους αισθητήρες...κτλ αυτό είναι εύκολο,δημιουργείς έναν πίνακα με στοιχεία τον αριθμό αισθητήρων για κάθε σταθμό π.χ:
Code:
int *sensors;
sensors=(int*)malloc(n*sizeof(int));
for (i=0;i<n;i++){
        printf("\nDwse arithmo aisthhthrwn gia ton %d statmho : ",i+1);
        scanf("%d",&sensors[i]);
  }
Και μετά περνάς τον pointer του πίνακα (sensors)σαν όρισμα της συνάρτησης και κάνεις τις πράξεις σου :)
Code:
float **extrem(float **temp,float min,float max,int n,int *sensors);        //πρότυπο
extrem(temp,min,max,n,sensors);                                                   //κλήση

edit:στον κώδικα που έγραψα ο πίνακας temp[ i ][ j ] είναι ο result που επιστρέφει η extrem δηλαδή έχω κάνει κάπου το εξής:
Code:
temp=extrem(temp,min,max,n,sensors);
To οποίο παίζει να δημιουργεί ψιλολαθάκια γιατί μάλλον μου βγάζει διευθύνσεις μνήμης αντί για αριθμό σταθμών που υπερβαίνουν τα όρια(το -14071737 δεν είναι λογικός αριθμός σταθμών που υπερβαίνουν τα όρια μάλλον...).Καμιά ιδέα?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 31, 2009, 20:45:05 pm
θενξ φίλε αλλά και πάλι δεν τη βλέπω να τρέχει. κάτι θα παίζει λογικά με τους πίνακες και τις αποθηκεύσεις γιατί δε μου βγάζει κάν αποτέλεσμα παρ'όλες τις getchar και τα return που έβαλα. δεν έχω ιδέα για το δικό σου το πρόβλημα...!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 31, 2009, 20:49:38 pm
getchar γιατί?

edit:διάβαζε τα πάντα με την scanf.Δεν μπορώ να φανταστώ που θα μπορούσε να σου χρησιμεύσει η getchar εδώ...


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: i_am_batman on May 31, 2009, 22:37:02 pm
Εχω μια απορία..Όταν μια συνάρτηση δεν γυρνάει κάποια τιμή, δηλώνεται void function().'Oταν γυρνάει ακέραιο, int function κ.ο.κ.'Oταν γυρνάει διεύθυνση, πώς δηλώνεται;


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Αθηρ on May 31, 2009, 23:11:32 pm
int **extrem(ορισματα)
{int **result

μπλαμπλα

return result;} Ετσι επιστρεφει τον (πινακα) result σαν διευθυνση και οχι σαν τιμη απο τη στιγμη που ο result ειναι pointer σε pointer.Ετσι τουλαχιστον το εχω εγω!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 31, 2009, 23:39:47 pm
getch(); εννοούσα, για να μην κλείσει το πρόγραμμα και να δω αποτελέσματα (έτσι είπε ο Κορτέσης ότι κάνουμε συνήθως, και μου δουλεύει γενικά). Αφού επιστρέψουμε τον result σαν διεύθυνση όμως, πώς θα εκτυπωθούν τα περιεχόμενά του;;;


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 31, 2009, 23:45:31 pm
Μα αν επιστρέψεις την διεύθυνσή του μπορείς να έχεις πρόσβαση και στον ίδιο τον πίνακα(στην main δλδ).


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on May 31, 2009, 23:49:28 pm
δηλαδή η extrem επιστρέφει τη διεύθυνση του πίνακα, και η main τι κάνει? δεν τρέχω απλά την extrem μέσα στη main? την χρησιμοποιώ κάπως αλλιώς??


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on May 31, 2009, 23:56:44 pm
 Η main εκτυπώνει τον πίνακα του οποίου την διεύθυνση επιστρέφει η extrem(επειδή έτσι λέει η άσκηση,δεν θα χρειαζόταν pointer αν μπορούσαμε να εκτυπώνουμε μέσα από την extrem)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on June 01, 2009, 00:53:03 am

ίσως κάτι της μορφής (extrem(ορίσματα...)) [i ][1]  να δούλευε

αλλά καλύτερα γράψε πχ

int ** temp;

temp= extrem (ορίσματα )

και μετά στην printf βάλε temp[i ][1]

σωστό.. αλλά μου βγάζει incompatible types in assignment.. επειδή την έχω δηλώσει float την extrem, το έκανα


float ** temp;

temp= extrem (ορίσματα )

printf  temp[i ][1]

καμιά ιδέα κανείς..?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on June 01, 2009, 01:12:08 am
σου βγάζει πάλι μετά από αυτό error? αν ναι σε ποια γραμμή ακριβώς?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: stergiosjo on June 01, 2009, 01:33:11 am
Επειδη η συναρτηση extrem επιστρεφει τον result που εχει δηλωθει ετσι: **result
η δηλωση της στη main θα πρεπει να ειναι ετσι?:
float **extrem(float **temp,float min,float max,int n,int *sensors);


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on June 01, 2009, 01:35:11 am
νομίζω γενικά όταν τις καλείς μες στη main δε βάζεις τα αστεράκια


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on June 01, 2009, 01:38:11 am
Επειδη η συναρτηση extrem επιστρεφει τον result που εχει δηλωθει ετσι: **result
η δηλωση της στη main θα πρεπει να ειναι ετσι?:
float **extrem(float **temp,float min,float max,int n,int *sensors);

ναι


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: stergiosjo on June 01, 2009, 01:39:23 am
SORRY..... εννοουσα στη δηλωση της εξω απο τη main οχι οταν την καλεις.....

αρα σωστα το χω γραμμενο?


εδιτ: thnx emfa


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on June 01, 2009, 01:49:48 am
Να ρωτήσω...Θέλω η συνάρτηση να επιστρέφει τον πίνακα result χωρίς τη χρήση του return(δηλαδή η συνάρτηση είναι void και επιστρέφει τιμές με αναφορά...)..Ενώ νομίζω οτί τα κάνω όλα σωστά (όλα τα malloc, realloc,παραπανίσιοι πίνακες κτλ δουλεύουν μιά χαρά), όταν πάω να διαβάσω τη result μεσα στη main , κλείνει το πρόγραμμα..Έχω περάσει τη result ώς διπλό pointer στη συνάρτηση, και της έχω δώσει τιμές...αλλα yok!!!δε λεει να δουλέψει..


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ectoras on June 01, 2009, 01:55:00 am
Να ρωτήσω...Θέλω η συνάρτηση να επιστρέφει τον πίνακα return χωρίς τη χρήση του return(δηλαδή η συνάρτηση είναι void και επιστρέφει τιμές με αναφορά...)..Ενώ νομίζω οτί τα κάνω όλα σωστά (όλα τα malloc, realloc,παραπανίσιοι πίνακες κτλ δουλεύουν μιά χαρά), όταν πάω να διαβάσω τη return μεσα στη main , κλείνει το πρόγραμμα..Έχω περάσει τη return ώς διπλό pointer στη συνάρτηση, και της έχω δώσει τιμές...αλλα yok!!!δε λεει να δουλέψει..
που σας μάθαν να προγραμματίζεται; pointer σε δομημένο προγραμματισμό που ακούστηκε;θα τα διαβάσει κανένας programmer και θα του πέσουν τα μαλλιά


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: diutinus on June 01, 2009, 02:02:24 am
Του Κορτέση του έχουν ήδη πέσει μερικά, οπότε λογικό να τα θέλει έτσι  :) Αν και, αλήθεια, πια εναλλακτική λύση υπάρχει...;


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ectoras on June 01, 2009, 02:12:03 am
Του Κορτέση του έχουν ήδη πέσει μερικά, οπότε λογικό να τα θέλει έτσι  :) Αν και, αλήθεια, πια εναλλακτική λύση υπάρχει...;
να το λύσεις βασισμένος στη λογική του δομημένου προγραμματισμού και όχι σε ντεμεκ δομημένου


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: diutinus on June 01, 2009, 02:56:08 am
Ναι, χαίρω πολύ, απλά επειδή οι περισσότεροι από εμάς τώρα μαθαίνουμε, ρώτησα έτσι για να το έχουμε υπ όψιν..  :)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ectoras on June 01, 2009, 03:36:22 am
Ναι, χαίρω πολύ, απλά επειδή οι περισσότεροι από εμάς τώρα μαθαίνουμε, ρώτησα έτσι για να το έχουμε υπ όψιν..  :)

για να περάσεις το μάθημα κάντο με pointer, γτ είναι λιγο πυροβολημένος, αλλίως κάνε κλάσεις και αντικείμενα και όλα κάντα αναγωγή εκεί. κράτα στο μυαλό σου τη λογική η c και η c++ έχουν πεθάνει αλλά σε βοηθάν για να καταλάβεις άλλες γλώσσες


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on June 01, 2009, 03:52:46 am
Ναι, χαίρω πολύ, απλά επειδή οι περισσότεροι από εμάς τώρα μαθαίνουμε, ρώτησα έτσι για να το έχουμε υπ όψιν..  :)

για να περάσεις το μάθημα κάντο με pointer, γτ είναι λιγο πυροβολημένος, αλλίως κάνε κλάσεις και αντικείμενα και όλα κάντα αναγωγή εκεί. κράτα στο μυαλό σου τη λογική η c και η c++ έχουν πεθάνει αλλά σε βοηθάν για να καταλάβεις άλλες γλώσσες

είναι c ,όχι c++, δεν έχουν κλάσεις και αντικείμενα..


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Grecs on June 01, 2009, 05:31:29 am
Ελεος στις σημειωσεις γιατι δεν εχει πως κανεις realloc σε δισδιαστατο πινακα?
Ξερει κανεις πως αυξανουμε μονο γραμμες?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: pmousoul on June 01, 2009, 07:01:31 am

Δεν ξέρω εάν βοηθάει, αλλά θυμάμαι ότι όσων διαστάσεων και εάν είναι ένας πίνακας στην μνήμη του υπολογιστή αποθηκεύεται σειριακά, π.χ. :

εάν έχεις έναν πίνακα a 2x2 :

τότε στην μνήμη αποθηκεύεται ως (δεν θυμάμαι ακριβώς) :

address k :a(1,1),
address k + 1 :a(1,2),
address k + 2 :a(2,1),
address k + 3 :a(2,2)

δηλ. εάν εσύ γνωρίζεις την διεύθυνση μνήμης του a (το a σε πίνακα είναι ο pointer στo πρώτο του στοιχείο και μετά ακολουθούν τα υπόλοιπα στην σειρά με έναν συγκεκριμένο τρόπο όπως τον περιέγραψα πιο πάνω - στο περίπου - μπορεί η σειρά να είναι λίγο διαφορετική.. αλλά πλήρως καθορισμένη) μπορείς να δεσμέυσεις την μνήμη που χρειάζεσαι και να παίξεις άφοβα μπάλα!

έχει και τρία χρόνια να ασχοληθώ και δεν τα θυμάμαι πολύ καλά..


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 11:28:40 am
Επίσης μπορείς να χρησιμοποιήσεις τον Pointer κανονικά σαν να ήταν το όνομα του πίνακα.Π.χ.:
Code:
int *p;
p=(int*)malloc(n*sizeof(int));
p[3]=5;


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: xarxarias on June 01, 2009, 13:04:42 pm
Να ρωτήσω...Θέλω η συνάρτηση να επιστρέφει τον πίνακα result χωρίς τη χρήση του return(δηλαδή η συνάρτηση είναι void και επιστρέφει τιμές με αναφορά...)..Ενώ νομίζω οτί τα κάνω όλα σωστά (όλα τα malloc, realloc,παραπανίσιοι πίνακες κτλ δουλεύουν μιά χαρά), όταν πάω να διαβάσω τη result μεσα στη main , κλείνει το πρόγραμμα..Έχω περάσει τη result ώς διπλό pointer στη συνάρτηση, και της έχω δώσει τιμές...αλλα yok!!!δε λεει να δουλέψει..

Σοβαρά,κανείς δεν ξέρει πώς γίνεται??


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Emfanever on June 01, 2009, 13:09:57 pm
Να ρωτήσω...Θέλω η συνάρτηση να επιστρέφει τον πίνακα return χωρίς τη χρήση του return(δηλαδή η συνάρτηση είναι void και επιστρέφει τιμές με αναφορά...)..Ενώ νομίζω οτί τα κάνω όλα σωστά (όλα τα malloc, realloc,παραπανίσιοι πίνακες κτλ δουλεύουν μιά χαρά), όταν πάω να διαβάσω τη return μεσα στη main , κλείνει το πρόγραμμα..Έχω περάσει τη return ώς διπλό pointer στη συνάρτηση, και της έχω δώσει τιμές...αλλα yok!!!δε λεει να δουλέψει..

Σοβαρά,κανείς δεν ξέρει πώς γίνεται??

μήπως εννοείς result αντι για return ? Αν δε δείξεις κωδικα  δε μπορούμε να σε βοηθήσουμε!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: diutinus on June 01, 2009, 13:56:01 pm
Ελεος στις σημειωσεις γιατι δεν εχει πως κανεις realloc σε δισδιαστατο πινακα?
Ξερει κανεις πως αυξανουμε μονο γραμμες?


Αν αυξήσεις μόνο τις γραμμές, τα κελιά στις στήλες τω νέων γραμμών δε θα έχουν δεσμευτεί. Οπότε πρέπει κάθε φορά που κάνεις "οριζόντιο" realloc να κάνεις και ένα κάθετο malloc. Εγώ προσωπικά για να το αποφύγω αυτό, έκανα έλεγχο κάνοντας μόνο οριζόντιο realloc, και μετά που ήξερα το πλήθος των σειρών, έκανα ένα ωραίο κάθετο malloc.


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: antonios on June 01, 2009, 14:59:05 pm
Να ρωτήσω κάτι....
Μέσα στην main, όταν καλέσουμε την extrem, τι ορίσματα θα δώσουμε??
Είναι σωστό αυτό π.χ.???

**result=extrem(temp, &aisthi, n, min, max);


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: stergiosjo on June 01, 2009, 16:51:12 pm
Να ρωτήσω κάτι....
Μέσα στην main, όταν καλέσουμε την extrem, τι ορίσματα θα δώσουμε??
Είναι σωστό αυτό π.χ.???

**result=extrem(temp, &aisthi, n, min, max);

Οχι δεν ειναι σωστο ετσι......
Κοιτα στα πιο παλια ποστ νομιζω στη σελ 4 τα ποστ του emfanever......


Κατι αλλο....
εχω δηλωσει την extrem ετσι:
int **extrem (int **temp, int *sensors int min, int max, int n);
και μου βγαζει μυνημα: syntax error before "int"
Χρησιμοποιω dev....
ξερει κανεις τι φταιει?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 16:55:23 pm
Να ρωτήσω κάτι....
Μέσα στην main, όταν καλέσουμε την extrem, τι ορίσματα θα δώσουμε??
Είναι σωστό αυτό π.χ.???

**result=extrem(temp, &aisthi, n, min, max);

Οχι δεν ειναι σωστο ετσι......
Κοιτα στα πιο παλια ποστ νομιζω στη σελ 4 τα ποστ του emfanever......


Κατι αλλο....
εχω δηλωσει την extrem ετσι:
int **extrem (int **temp, int *sensors int min, int max, int n);
και μου βγαζει μυνημα: syntax error before "int"
Χρησιμοποιω dev....
ξερει κανεις τι φταιει?
Kάπου εκεί ανάμεσα λείπει ένα κόμμα

Παιδιά εσείς πως καλέσατε την συνάρτηση?Βάλατε την επιστρεφόμενη τιμή της σε κανέναν pointer και μετά πήρατε αυτόν τον pointer για να τυπώστε τα στοιχεία του πίνακα?Η εντολή :
Code:
temp=extrem(temp,min,max,n,sensors);
είναι σωστή σαν λογική?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: stergiosjo on June 01, 2009, 17:04:05 pm
Μπραβο ρε merlin!!!! Γαμω την παρατηρητικοτητα μου.......

ναι ειναι σωστη αυτη η λογικη αλλλα αντι για temp bale allo onoma...
πχ εγω το εκανα ετσι:
int **p;
p=extrem(temp, sensors, min, max, n);
for (i=0; i<n; i++)
                         {
                             printf("%d", p[1], p[2], p[3]);
                         }

edit: δεν εμφανιζονται σωστα οι πινακεσ στη printf.... den ξερω γιατι..


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 17:08:08 pm
Αφού ρε ο p είναι pointer to pointer και εσύ του έχεις βάλει μόνο μία διάσταση...


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ΡΕΣΑΛΤΟ on June 01, 2009, 17:11:08 pm
error: invalid operands of types `int*' and `unsigned int' to binary `operator*'|

 result=(int**)realloc(result,k*sizeof(int));

σε ετουτη την εντολη


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 17:14:29 pm
Η realloc δεν θέλει typecasting .Εσύ έχεις κάνει κάτι σαν...remalloc.
Η realloc είναι έτσι:
Code:
result=realloc(result,new_size);      // στο new size βάζεις αριθμό,μεταβλητή κτλ


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ΡΕΣΑΛΤΟ on June 01, 2009, 17:18:55 pm
ε πως δε θελει ορισμα με sizeof....
και παλι το ιδιο βγαζει


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 17:23:09 pm
Δοκίμασε να βάλεις k*sizeof(int*);


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: ΡΕΣΑΛΤΟ on June 01, 2009, 17:25:33 pm
(κ*) διοτι το k ηταν pointer....
σκατα στα αστερακια....
ευχαριστω παντως!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: theo_mich on June 01, 2009, 17:48:03 pm
λοιπον κανουμε με malloc μια γραμμη για τον χ σταθμο.
οταν θα κανουν realloc για να γινουν 2 οι γραμμες πως θα κρατησουμε και την προηγουμενη γραμμη???


(μπορει να λεω @@ αλλα εχω θολωσει :D)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: theo_mich on June 01, 2009, 17:50:52 pm
Μπραβο ρε merlin!!!! Γαμω την παρατηρητικοτητα μου.......

ναι ειναι σωστη αυτη η λογικη αλλλα αντι για temp bale allo onoma...
πχ εγω το εκανα ετσι:
int **p;
p=extrem(temp, sensors, min, max, n);
for (i=0; i<n; i++)
                         {
                             printf("%d", p[i ][1], p[i ][2], p[i ][3]);
                         }

edit: δεν εμφανιζονται σωστα οι πινακεσ στη printf.... den ξερω γιατι..



extrem(temp, sensors, min, max, n);
for (i=0; i<n; i++)
                         {
                             printf("%d", extrem[i ][1], extrem[i ][2], extrem[i ][3]);
                         }



ετσι θα δουλευε?/?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 18:01:01 pm

ετσι θα δουλευε?/?

Χλωμό καθώς θα καλούσε την extrem 3 φορές με απροσδιόριστα αποτελέσματα,καλύτερα σώσε τον pointer που επιστρέφει η extrem σε κάποιον νέο pointer και χρησιμοποίησε τον καινούριο pointer για τέτοιες εκφράσεις.Π.χ.:
Code:
int **p;
p=extrem();
for(i...){
for(j...){
printf("aasdfaasfasasf %d",p[i][j]);
}
}


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: theo_mich on June 01, 2009, 18:06:31 pm
λοιπον κανουμε με malloc μια γραμμη για τον χ σταθμο.
οταν θα κανουν realloc για να γινουν 2 οι γραμμες πως θα κρατησουμε και την προηγουμενη γραμμη???


(μπορει να λεω @@ αλλα εχω θολωσει :D)

επειδη σε βλεπω οτι νιωθεις μπορεις να εξηγησεις λιγο αυτο??


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Merlin on June 01, 2009, 18:20:38 pm
Όταν κάνεις realloc δεν κρατάς τίποτα ,κάνεις ανακατανομή της μνήμης με μόνο τόσους σταθμούς όσους ξεπερνάν τα όρια.Π.χ. αν εσύ βρήκες ότι α σταθμοί ξεπέρασαν τα όρια κάνεις pointer_kati=realloc(pointer_ths_malloc,α); και τον πίνακά σου τον γεμίζεις όπως σου λέει η άσκηση(στην 1η γραμμή ονόματα σταθμών,2η μεγάλες τιμές θερμοκρασίας,3η μικρές)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Andre on June 01, 2009, 18:33:26 pm
Πώς καταφέρατε να εκτυπώσετε τον αύξοντα αριθμό του εκάστοτε σταθμού στην πρώτη στήλη του result?
Επίσης, ενώ μου εκτυπώνει ωραία τη δεύτερη στήλη (με τον αριθμό των αισθητήρων κάτω από το όριο), στην τρίτη μου εκτυπώνει για κάθε σταθμό τον αριθμό όλων των  αισθητήρων. :(
Ενώ λογικά η διαδικασία είναι παρόμοια..
Κανείς για βοήθεια? (με pm καλύτερα)


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: theo_mich on June 01, 2009, 18:37:48 pm
Όταν κάνεις realloc δεν κρατάς τίποτα ,κάνεις ανακατανομή της μνήμης με μόνο τόσους σταθμούς όσους ξεπερνάν τα όρια.Π.χ. αν εσύ βρήκες ότι α σταθμοί ξεπέρασαν τα όρια κάνεις pointer_kati=realloc(pointer_ths_malloc,α); και τον πίνακά σου τον γεμίζεις όπως σου λέει η άσκηση(στην 1η γραμμή ονόματα σταθμών,2η μεγάλες τιμές θερμοκρασίας,3η μικρές)

ωραιος ty


ps. η ασκηση λεει 3 στηλες ο πινακας και οχι 3 γραμμες


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: theo_mich on June 01, 2009, 18:39:58 pm
Πώς καταφέρατε να εκτυπώσετε τον αύξοντα αριθμό του εκάστοτε σταθμού στην πρώτη στήλη του result?
Επίσης, ενώ μου εκτυπώνει ωραία τη δεύτερη στήλη (με τον αριθμό των αισθητήρων κάτω από το όριο), στην τρίτη μου εκτυπώνει για κάθε σταθμό τον αριθμό όλων των  αισθητήρων. :(
Ενώ λογικά η διαδικασία είναι παρόμοια..
Κανείς για βοήθεια? (με pm καλύτερα)

αφου τον ελεγχο προφανως θα τον κανεις με μια for στην πρωτη στηλη θα βαζεις το i ή το i+1 αναλογα αν τους ονομαζεις απο 0 ή απο 1 αντιστοιχα


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Andre on June 01, 2009, 18:49:46 pm
Έχοντας αρχίσει από το 1 (i+1) για τον πρώτο σταθμό, με αυτό που λες η πρώτη στήλη θα αρχίζει με το στοιχείο 1 και, με βήμα 1, θα τελειώνει στο β, όπου β ο αριθμός των σταθμών που είχαν αισθητήρα με θερμοκρασία εκτός ορίων.
Δε νομίζω όμως ότι θέλει αυτό. Μπορεί για παράδειγμα ο πρώτος σταθμός που παρουσιάζει θερμοκρασία εκτός ορίου να είναι ο 6ος, και να ακολουθούν ο 7ος και ο 10ος. Οπότε η στήλη θα έχει τη μορφή:
6
7
10
Δε ξέρω αν γίνομαι κατανοητός..
edit: μάλλον δε γίνομαι :P


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: theo_mich on June 01, 2009, 18:54:44 pm
πρωτα ελεγχεις αν ειναι εκτος οριων και μετα βαζεις τον αριθμο του στην πρωτη στηλη



αυτο που εχω σκεφτει ειναι:
----κανεις malloc μια γραμμη
----ελεγχεις τον πρωτο σταθμο:    ---αν ειναι εκτος οριων                   -----βαζεις τον αριθμο του στην πρωτη στηλη(εχεις κανει malloc στηλες) 
                                                                                                  -----αν δεν ειναι ο τελεθταιος σταθμος κανεις realloc μια γραμμη ακομα
                                        

                                               ---αν ειναι οκ πας στον επομενο


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Grecs on June 01, 2009, 23:10:26 pm
result=(int **)realloc(result,d*sizeof(int*));
result[d][0]=i+1;
result[d][1]=mins;            
result[d][2]=maxs;

Ετσι σωστο ειναι?
 ps εχω κανει μαλλοκ στο ρεσαλτ πριν


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: saman on June 01, 2009, 23:14:10 pm
θαρρώ οτι τι πρώτο στοιχείο σε έναν πίνακα είναι το σημείο
  • .Αρα λογικά το μέτρημα ξεκινά απο το 0 και όχι από το 1 στις στήλες σου


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Grecs on June 01, 2009, 23:17:08 pm
σωστος δε το προσεξα κατα τα αλλα λεω βασικα


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: saman on June 01, 2009, 23:24:24 pm
κατα τα αλλααπό ότι βλέπω στον ίδιο δρόμο βαδίζουμε.και επειδή είναι τέτοια η ώρα και είμαι σιγουρος ότι για ωρα κοιτάς αυτην την οθόνη,'οπως και εγώ άλλωστε,ακου και αυτο το τραγουδάκι αν θέλεις γιατι στα τελειώματα είσαι βρεις τον εαυτό σου:
http://www.youtube.com/watch?v=vbT6Iv1y6bw


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: nasia!! on June 01, 2009, 23:26:36 pm
^band^ ^hello^
αυτοδιαγραφομαι σε λιγο  :D :D :D

wtf?why? :P


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: saman on June 01, 2009, 23:36:48 pm
α συγγνώμη δες και έναpost σελιοδα 7  του merlin για την  realloc


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on June 02, 2009, 00:09:18 am
ξερει κανενας αν αυτη ειναι η τελευταια εργασια?


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: El Niño on June 02, 2009, 00:09:54 am
ναι δεν ειναι...εχει τουλαχιστον αλλη μια αποτι εχω ακουσει...πιθανα και 2η!!


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: nasia!! on June 02, 2009, 00:10:25 am
Είθε να έιναι...άν εισακουστούν οι προσευχές μου! ::) :P


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: sarovios on June 02, 2009, 00:15:52 am
περσυ ειχε φτασει μεχρι F  παντος.Το θεμα ειναι οτι δεν εχει εξετασει fopen ακομα...Οποτε αλλη μια λογικα θα τη βαλει  :(


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: Θάνος on June 02, 2009, 01:19:15 am
είχε πει άλλη 1-2 το πολύ. Όμως μια έχουμε περιθώριο να μην κάνουμε, σωστά;; :D


Title: Re: [Δομ. Προγρ.] Εργασία F
Post by: El Niño on June 02, 2009, 01:21:09 am
σωστα!