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

Προβλημα σε κωδικα C


panourgias

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

Δημοσ.

Γεια σας.

 

Σε μια συνάρτηση εισαγω 2 pointers (*a, *B)που δείχνουν σε δυο διαφορετικές structures αντίστοιχα. Στο pointer b έχω κάνει allocation memory για να δημιουργήσω ένα πίνακα δομών, απο πριν μέσα στην main και έχω τοποθετήσει τιμές σε όλα τα μέλη της δομής. Στο pointer a δεν έχω κανει τίποτα, απλά την έχω δηλώσει στη main.

Τώρα: Μέσα στη συνάρτηση κάνω malloc στο pointer a για να φτιάξω ένα άλλο πίνακα δομών a. Κάνοντας πράξεις με διαφορες τιμές + αυτες του πινακα δομών b που εισηγαγα, τοποθετω τα αποτελέσματα στα μέλη του πίνακα δομων a.

Στο τέλος της συνάρτηση κάνω return(a) για να γυρίσω τον πίνακα δομών a στην main.

 

Ποιο ειναι το προβλημα?

 

Οτι αλλάζουν και οι τιμές στο πίνακα δομών b.

 

Πως γίνεται ενω δεν καταχωρεις τιμές στα μέλη του πινακα δομων b, να αλλάζουν (μερικές απο αυτες)? Συμβαίνει κάτι με το allocation της μνήμης?

Δημοσ.

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

Υπάρχει και ενδεχόμενο να έχεις χρησιμοποιήσει λάθος τελεστές στις πράξεις με τις τιμές του b (π.χ. = αντί για ==)

Δημοσ.

Σε αυτό που προτείνει ο bxenos να προσθέσω ότι αν δε μπορείς να βρεις "με το μάτι" πού γίνεται το λάθος, τότε είναι καλή ιδέα να τρέξεις το πρόγραμμά σου γραμμή-γραμμή μέσα από κάποιο debugger και σε κάθε γραμμή να ελέγχεις τις τιμές όπου δείχνει ο b.

Δημοσ.

Οπως το έψαξα, βρήκα οτι όταν εκχωρω τιμές στα μέλη της a, εξω στη main, τις αποθηκευει μια χαρα. Οταν κάνω εκχωρηση σε μέλος της a μέσα απο τη συναρτηση, δε αποθηκευονται οι τιμές στο a αλλα στα μέλη του b και φυσικά στο a δεν αποθηκευεται τιποτα. :confused: Και ο κωδικας ειναι μια χαρα απο συντακτικο ή απο λογικη.

 

Λέτε να συμβαίνει κάτι με το allocation της a ?

 

Η διαδικασία που ακολουθω είναι η εξης:

 

1.Δηλώνω τον pointer a να δειχνει σε stucture

2.Κάνω allocation memory (οσοι χρειάζομαι) με malloc και επιστρέφω στο pointer a την memory address της αρχής του memory block. (Είμαι στη main ακόμα)

3. Καλώ την συνάρτηση με arguments τους 2 pointers.

 

Απο κεί και πέρα γίνονται αυτα που σας περιέγραψα.. Με αυτη τη διαδικασια λετε να επικαλύπτω τα memory blocks, ωστε ενω γράφω στο a να αποθηκευονται στο b.

Δημοσ.

Νομίζω πως δεν χρειάζεται να κάνεις return αλλά πρέπει να καλείς την συνάρτηση με &a ώστε στην συνέχεια όταν κάνεις πχ *a ++; το a που έχεις στην main έχει αλλάξει

 

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

Δημοσ.

Αφου δουλευει σε συναρτηση με πινακα δομων χρειαζεται το return, αυτο που λες (&) ειναι για να ενημερωνει καποια τιμη.Οταν αποθηκευεις τιμες στην a μεσα στη συναρτηση η main δεν μπορει να ξερει τι γινεται αν ειναι απλες οι μεταβλητες.

Κανε τον κοπο κι ανεβασε τον κωδικα σου να τον κοιταξουμε..

Δημοσ.
Αφου δουλευει σε συναρτηση με πινακα δομων χρειαζεται το return, αυτο που λες (&) ειναι για να ενημερωνει καποια τιμη.Οταν αποθηκευεις τιμες στην a μεσα στη συναρτηση η main δεν μπορει να ξερει τι γινεται αν ειναι απλες οι μεταβλητες.

Κανε τον κοπο κι ανεβασε τον κωδικα σου να τον κοιταξουμε..

 

Σωστά δεν είχα προσέξει ότι κάνει malloc μέσα στην συνάρτηση.

 

Πάντως χρειάζεται να δώσει κώδικα

Δημοσ.

Ναι το &a είναι για απλες μεταβλητες, ώστε να γνωρίζει η συναρτηση την memory address της και επιφερει αλλαγες . Στη περίπτωση των pointers δεν χρειάζεται εφοσον η address των τιμών των μεταβλητων είναι αποθηκευμενη στο σωμα τους.

Δημοσ.
Οπως το έψαξα, βρήκα οτι όταν εκχωρω τιμές στα μέλη της a, εξω στη main, τις αποθηκευει μια χαρα. Οταν κάνω εκχωρηση σε μέλος της a μέσα απο τη συναρτηση, δε αποθηκευονται οι τιμές στο a αλλα στα μέλη του b και φυσικά στο a δεν αποθηκευεται τιποτα. :confused: Και ο κωδικας ειναι μια χαρα απο συντακτικο ή απο λογικη.

Μηπως τραβας κανα free?

Και εχεις κανα παρομοιο λαθος

 

>#include <stdlib.h>

typedef struct foo
{
int value1,value2;
}*pfoo;

int main(void)
{
pfoo a,b;
a = (pfoo) malloc(sizeof(foo));
free(a);
b = (pfoo) malloc(sizeof(foo));
b->value1=1;
b->value2=2;

printf("%d  %d",a->value1,a->value2);
getchar();
return 0;
}

 

Δημοσ.
Γεια σας.

 

Σε μια συνάρτηση εισαγω 2 pointers (*a, *B)που δείχνουν σε δυο διαφορετικές structures αντίστοιχα. Στο pointer b έχω κάνει allocation memory για να δημιουργήσω ένα πίνακα δομών, απο πριν μέσα στην main και έχω τοποθετήσει τιμές σε όλα τα μέλη της δομής. Στο pointer a δεν έχω κανει τίποτα, απλά την έχω δηλώσει στη main.

Τώρα: Μέσα στη συνάρτηση κάνω malloc στο pointer a για να φτιάξω ένα άλλο πίνακα δομών a. Κάνοντας πράξεις με διαφορες τιμές + αυτες του πινακα δομών b που εισηγαγα, τοποθετω τα αποτελέσματα στα μέλη του πίνακα δομων a.

Στο τέλος της συνάρτηση κάνω return(a) για να γυρίσω τον πίνακα δομών a στην main.

 

Ποιο ειναι το προβλημα?

 

Οτι αλλάζουν και οι τιμές στο πίνακα δομών b.

 

Πως γίνεται ενω δεν καταχωρεις τιμές στα μέλη του πινακα δομων b, να αλλάζουν (μερικές απο αυτες)? Συμβαίνει κάτι με το allocation της μνήμης?

 

 

Χμμ...

Δηλώνεις μεταβλητες * στη main, τις περνάς σαν ορισματα σε συνάρτηση, κάνεις malloc μεσα στη συνάρτηση και επιστρέφεις την τιμή *a την οποία όμως έχεις περάσει σαν όρισμα (φανταζομαι τύπου *) στη συνάρτηση ενώ την έχεις δηλώσει σα μεταβλητή τυπου * στη main()?? .....Κάτι δε μου πάει...... (μάλλον χρειάζεται ένα ξεκαθάρισμα στα ζητήματα και τις διαφορές μεταξύ call by reference και call by value)!

(εκτος αν δεν το κατάλαβα καλά.. ένα δειγματάκι κώδικα ίσως?)

Δημοσ.

Ok Το προβλημα λυθηκε. Στο b εδινα sizeof αλλη δομης... και δεν το εβλεπα διοτι ηταν μέσα σε αλλη συναρτηση:eek:. Κατι τετοια χαζα συμβαινουν και σε παιδευουν για μέρες...

 

mchatz, οταν περνας ενα pointer σε function δεν χρειάζεται να δώσεις return για να γυρίσεις τι τιμή που δείχνει ο pointer, διότι αποθηκευεις την τιμή στη διευθυνση που πήρες απο το pointer.

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

Δημοσ.
Όταν όμως περνάς σαν όρισμα στη συνάρτηση ένα pointer που δεν του έχεις δώσει αρχική τιμή απο την main, τότε πρέπει να κανεις return τον pointer για να έχεις μετα στη main την διευθυνση (αφου ο δεικτης μεσα στη συνάρτηση είναι τοπικός και χάνεται μολις κλεισει).

 

Ή...να περάσεις στη συνάρτηση pointer στον pointer που θέλεις να χρησιμοποιήσεις για το memory allocation. ;)

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

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

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