Προς το περιεχόμενο

Eπιστροφη struct pointer


I@n15

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια και χαρα σε ολους τους φιλους και χρονια πολλα με υγεια και χαρα.

Λοιπον το προβλημα μου ειναι πως θα εμφανισω στην main τα αποτελεσματα της συναρτησης.

 

 

struct mystruct

{

int first[5];

int sec[5];

}

 

 

struct mystruct *myfunc()

{

int i = 0;

struct mystruct lr;

 

for (i = 0; i <= 7; i++)

{

scanf("%i", &lr.first);

scanf("%i", &lr.sec);

}

 

return &lr;

}

 

 

Tωρα θελω να εμφανισω τα αποτελεσματα στην main.Αλλα μου βγαζει συνεχως λαθος αποτελεσματα.Κατ αρχας πρεπει να χρησιμοποιησω και τιν malloc η γινεται και ετσι?

 

Ευχαριστω:-)

Δημοσ.

χρονια πολλα και καλη χρονια

 

λοιπον, ειναι απολυτα λογικο να εχεις λαθη (αν και αλλη φορα ειναι καλο να αναφερεις ακριβως τι λαθη παιρνεις)

>
struct mystruct
{
        int first[5];
        int sec[5];
}


struct mystruct *myfunc()
{
        int i = 0;
        struct mystruct lr;  [color=Red]<<-- local variable, θα παψει να υπαρχειοταν η συναρτηση επιστρεψει[/color]

       for (i = 0; i <[color=Red]5[/color]; i++) [color=Red]<-- εδω γιατι εβαλες i <= 7? αφου μονο 5 στοιχεια εχουν τα arrays[/color]
       {
                scanf("%i", &lr.first[i]);
                scanf("%i", &lr.sec[i]);
       }

       return &lr;       [color=Red]<-- αμεσως μετα απο αυτο το σημειο, ο pointer θα δειχνει σε 'κενη' θεση μνημης (μπουμ)[/color]
}                      

πιθανες λυσεις

>
....
struct mystruct *myfunc()
{
        int i = 0;
        struct mystruct* plr = (struct mystruct*)malloc(sizeof(mystruct)); 

    for (i = 0; i <5; i++)
       {
                scanf("%i", plr->first[i]);
                scanf("%i", plr->sec[i]);
       }

       return plr;
....

το μειονεκτημα αυτης την μεθοδου ειναι πως πρεπει καπου να καλεσεις και την free για να αποδεσμευσεις αυτη τη μνημη, και αυτο πρεπει να γινει εξω απο την myfunc(). Αυτο σημαινει πως αν καποιος αλλος παρει τη συναρτηση σου να τη χρησιμοποιησει σε αλλο προγραμμα, πρεπει να ξερει πως αυτη η συναρτηση δεσμευει αλλα δεν αποδεσμευει μνημη.... ειναι κακη τακτικη

 

ο καλυτερος τροπος ειναι ο παρακατω

>
...
void myfunc(struct mystruct *ptr)
 {
    int i = 0;
     
   for (i = 0; i <5; i++)
        {
                 scanf("%i", ptr->first[i]);
                 scanf("%i", ptr->sec[i]);
        }
}

main()
{
      struct mystruct str1;    [color=Red]//δηλωνεις στη main το struct[/color]

      myfunc( &str1 );     [color=Red]// περνας ως ορισμα ενα ποιντερ στο struct[/color]
 
     [color=Red]// απο εδω και περα το str1 εχει παρει τις τιμες που θες και το χρησιμοποιεις αναλογως[/color]

}

οτι δε καταλαβες πες μου :-)

Δημοσ.

Να στε καλα παιδια για τον χρονο σας πρωτοχρονιατικα κιολας :-)

 

Λοιπον η μεθοδος με το void δουλευει μια χαρα οποτε θα δουλεψω μ αυτην τελικα.Αυτη με την επιστροφη δεν μπορω να βγαλω ακρη.Αλλα ας ειναι,μην σας κουραζω αλλο.

 

Ρε ζορι αυτη η C με τα poiners...:-)

Δημοσ.

Οι pointers ίσως είναι το μοναδικό πλεονέκτημα που έχει η C απέναντι σε άλλες γλώσσες. Όποτε καλύτερα να τους μάθουμε καλά για να μην είναι πρόβλημα αλλιώς καλύτερα να μην ασχολιθούμαι με C.

Δημοσ.

χρόνια πολλά παιδιά και απο μένα.

να ρωτήσω κι εγώ κάτι.:rolleyes:

>
....
struct mystruct *myfunc()
{
        int i = 0;
        struct mystruct* plr = (struct mystruct*)malloc(sizeof(mystruct)); 

    for (i = 0; i <5; i++)
       {
                scanf("%i", plr->first[i]);
                scanf("%i", plr->sec[i]);
       }

       return plr;
....

το μειονεκτημα αυτης την μεθοδου ειναι πως πρεπει καπου να καλεσεις και την free για να αποδεσμευσεις αυτη τη μνημη, και αυτο πρεπει να γινει εξω απο την myfunc(). Αυτο σημαινει πως αν καποιος αλλος παρει τη συναρτηση σου να τη χρησιμοποιησει σε αλλο προγραμμα, πρεπει να ξερει πως αυτη η συναρτηση δεσμευει αλλα δεν αποδεσμευει μνημη.... ειναι κακη τακτικη

 

τη μνήμη πως θα την αποδεσμέυσουμε στη main();

το

>free(plr);

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

Δημοσ.

Με βαση την βοηθεια σας εχω φτασει σχεδον κοντα στο τελος,μια ακομα απλη διευκρηνηση θα ηθελα και θα ειμαι οκ

 

 

#include <stdio.h>

 

struct ylika{

 

int xarti[3];

int giali[3];

int alouminio[3];

};

 

 

struct tmp{

 

int a;

int b;

int c;

};

 

 

 

void readYlika(struct ylika *ptr)

{

 

int i = 0;

 

 

for(; i <= 2; i++)

{

printf("dose xarti gia to %io sxoleio\n",i+1);

scanf("%i",ptr->xarti);

 

printf("dose giali gia to %io sxoleio\n",i+1);

scanf("%i",ptr->giali);

 

printf("dose alouminio gia to %io sxoleio\n",i+1);

scanf("%i",ptr->alouminio);

 

printf("\n");

}

}

 

 

void sumYlikon(struct ylika *sum)

{

 

int i = 0;

int sum_xarti = 0;

int sum_giali = 0;

int sum_alouminio = 0;

 

 

for(i = 0; i <= 2; i++)

{

sum_xarti += sum->xarti++;

sum_giali += sum->giali++;

sum_alouminio += sum->alouminio++;

}

 

}

 

 

 

 

int main()

{

struct ylika ptr1;

 

readYlika(&ptr1);

sumYlikon(&ptr1);

 

 

 

}

 

Το προβλημα μονο ειναι πως θα εμφανισω στην main τις 3 τιμες της 2ης συναρτησης(sumYlikon).Τo sum_xarti,sum_giali,sum_alouminio.

 

Μηπως πρεπει να ορισω μια καινουργια δομη?

Δημοσ.

τη μνήμη πως θα την αποδεσμέυσουμε στη main();

το

>free(plr);

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

 

εννοεις αν πεις

main()

{

.....

 

struct mystruct *plr = myfunc();

 

.....

 

free(plr);

 

}

 

μια χαρα δουλευει

 

και ξερεις γιατι; Το plr οπως και καθε ποιντερ ειναι απλα ενα νουμερο, ειναι η διευθυνση μνημης στην οποια αρχιζει η μνημη που δεσμευσες καπου αλλου με την malloc. Απαξ και αυτο το νουμερο δεν το χαλασες πουθενα αλλου, χρησιμοποιειται μια χαρα απο την free για να αποδεσμευσει αυτη τη μνημη. Απο τη στιγμη λοιπον που αυτο το νουμερο το επιστρεφει σωστα η myfunc, ολα οκ.....

 

PS δεν ξερω αν τονισα πως ειναι μαλακια τεχνικη και πως το σωστο ειναι να περνας ενα ποιντερ ως ορισμα.......

 

 

-----Προστέθηκε 2/1/2009 στις 09 : 58 : 37-----

 

 

Με βαση την βοηθεια σας εχω φτασει σχεδον κοντα στο τελος,μια ακομα απλη διευκρηνηση θα ηθελα και θα ειμαι οκ

 

Το προβλημα μονο ειναι πως θα εμφανισω στην main τις 3 τιμες της 2ης συναρτησης(sumYlikon).Τo sum_xarti,sum_giali,sum_alouminio.

 

Μηπως πρεπει να ορισω μια καινουργια δομη?

 

ετσι όπως ειναι ο κωδικας σου θα μπορουσες να κανεις το εξης

 

>
#include <stdio.h>

struct ylika{
   
   int xarti[3];
   int giali[3];
   int alouminio[3];
};


struct tmp{
   
   int a;
   int b;
   int c;
};



void readYlika(struct ylika *ptr)
{

   int i = 0;
  
   
   for(; i <= 2; i++)
   {
       printf("dose xarti gia to %io sxoleio\n",i+1);
       scanf("%i",ptr->xarti[i]);
       
       printf("dose giali gia to %io sxoleio\n",i+1);
       scanf("%i",ptr->giali[i]);
       
       printf("dose alouminio gia to %io sxoleio\n",i+1);
       scanf("%i",ptr->alouminio[i]);
       
       printf("\n");
   }
}


void sumYlikon(struct ylika *ylika1, [color=DarkOliveGreen]int *sum_xarti, int *[/color][color=DarkOliveGreen]sum_giali, [/color][color=DarkOliveGreen]int *sum_alouminio[/color])
{

   int i = 0;

   [color=Red]// τα διωχνεις αυτα, θα τα βαλεις στο main
   //int sum_xarti = 0;
   //int sum_giali = 0;
   //int sum_alouminio = 0;
[/color]   
   
   for(i = 0; i <= 2; i++)
   {
       [color=Green]// εδιτ -- διορθωσα το ονομα του ylika1[/color]
       (*sum_xarti) += ylika1->xarti[i]++;
       (*sum_giali) += ylika1->giali[i]++;
       (*sum_alouminio) += ylika1->alouminio[i]++;
   }  

}




int main()
{
    struct ylika ptr1;
    [color=Red][color=DarkOliveGreen]int sum_xarti = 0;
    int sum_giali = 0;
    int sum_alouminio = 0;[/color]
[/color]   
   
   readYlika(&ptr1);
   sumYlikon(&ptr1, [color=DarkOliveGreen]&[/color][color=Red][color=DarkOliveGreen]sum_xarti, &sum_[/color][/color][color=Red][color=DarkOliveGreen]giali[/color][/color], [color=DarkOliveGreen]&[/color][color=Red][color=DarkOliveGreen]sum_alouminio[/color][/color]); 
 
   // απο εδω και περα μπορεις να τυπωσεις τα αποτελεσματα ή να τα κανεις οτι θες
   printf( "sum_xarti = %d", sum_xarti);
   
}                         

Δημοσ.

Μου βγαζει αυτο το μηνυμα λαθους

 

newfile.c:40: error: `sum' undeclared (first use in this function)

newfile.c:40: error: (Each undeclared identifier is reported only once

newfile.c:40: error: for each function it appears in.)

 

 

void sumYlikon(struct ylika *ylika1, int *sum_xarti, int *sum_giali, int *sum_alouminio)

 

Εδω την struct ylika *ylika1 δεν την χρησιμοποιουμε καθολου μεσα στην συναρτηση

Δημοσ.

το διορθωσα, το ylika1 ηταν το sum........

 

ωστοσο ειναι μια ευκαιρια να αρχισεις να καταλαβαινεις τα λαθη που σου βγαζει ο compiler.....

σου λεει πως στη γραμμη 40 πας να χρησιμοποιησεις κατι (τη μεταβλητη sum) που δεν ειναι δηλωμενη πουθενα. Στο δικο σου κωδικα την ειχες δηλωσει (την ειχες στα ορισματα) αλλα εγω της αλλαξα ονομα για εννιολογικους λογους (δεν επροκειτο να κρατησει κανενα αθροισμα μεσα της). Φυσικα μπορουσα να την ονομασω katerina :)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...