panourgias Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Γεια σας. Σε μια συνάρτηση εισαγω 2 pointers (*a, *που δείχνουν σε δυο διαφορετικές structures αντίστοιχα. Στο pointer b έχω κάνει allocation memory για να δημιουργήσω ένα πίνακα δομών, απο πριν μέσα στην main και έχω τοποθετήσει τιμές σε όλα τα μέλη της δομής. Στο pointer a δεν έχω κανει τίποτα, απλά την έχω δηλώσει στη main. Τώρα: Μέσα στη συνάρτηση κάνω malloc στο pointer a για να φτιάξω ένα άλλο πίνακα δομών a. Κάνοντας πράξεις με διαφορες τιμές + αυτες του πινακα δομών b που εισηγαγα, τοποθετω τα αποτελέσματα στα μέλη του πίνακα δομων a. Στο τέλος της συνάρτηση κάνω return(a) για να γυρίσω τον πίνακα δομών a στην main. Ποιο ειναι το προβλημα? Οτι αλλάζουν και οι τιμές στο πίνακα δομών b. Πως γίνεται ενω δεν καταχωρεις τιμές στα μέλη του πινακα δομων b, να αλλάζουν (μερικές απο αυτες)? Συμβαίνει κάτι με το allocation της μνήμης?
bxenos Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Εγραψες πάνω τους, εσκεμένα ή όχι. Δηλαδή έχεις λάθος στο πρόγραμμα, ισως υπερβαίνεις το γράψιμο απο τη δεσμευμένη μνήμη 'α' που έκανες malloc. Υπάρχει και ενδεχόμενο να έχεις χρησιμοποιήσει λάθος τελεστές στις πράξεις με τις τιμές του b (π.χ. = αντί για ==)
chigal Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Σε αυτό που προτείνει ο bxenos να προσθέσω ότι αν δε μπορείς να βρεις "με το μάτι" πού γίνεται το λάθος, τότε είναι καλή ιδέα να τρέξεις το πρόγραμμά σου γραμμή-γραμμή μέσα από κάποιο debugger και σε κάθε γραμμή να ελέγχεις τις τιμές όπου δείχνει ο b.
panourgias Δημοσ. 24 Φεβρουαρίου 2010 Μέλος Δημοσ. 24 Φεβρουαρίου 2010 Οπως το έψαξα, βρήκα οτι όταν εκχωρω τιμές στα μέλη της a, εξω στη main, τις αποθηκευει μια χαρα. Οταν κάνω εκχωρηση σε μέλος της a μέσα απο τη συναρτηση, δε αποθηκευονται οι τιμές στο a αλλα στα μέλη του b και φυσικά στο a δεν αποθηκευεται τιποτα. Και ο κωδικας ειναι μια χαρα απο συντακτικο ή απο λογικη. Λέτε να συμβαίνει κάτι με το 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.
pagratios Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Νομίζω πως δεν χρειάζεται να κάνεις return αλλά πρέπει να καλείς την συνάρτηση με &a ώστε στην συνέχεια όταν κάνεις πχ *a ++; το a που έχεις στην main έχει αλλάξει Επίσης θα ήταν καλό να κάνεις επικόλληση τον κώδικα σου. Είναι πιο εύκολο να δουμε που έχεις λάθος
ntsingos Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Αφου δουλευει σε συναρτηση με πινακα δομων χρειαζεται το return, αυτο που λες (&) ειναι για να ενημερωνει καποια τιμη.Οταν αποθηκευεις τιμες στην a μεσα στη συναρτηση η main δεν μπορει να ξερει τι γινεται αν ειναι απλες οι μεταβλητες. Κανε τον κοπο κι ανεβασε τον κωδικα σου να τον κοιταξουμε..
pagratios Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Αφου δουλευει σε συναρτηση με πινακα δομων χρειαζεται το return, αυτο που λες (&) ειναι για να ενημερωνει καποια τιμη.Οταν αποθηκευεις τιμες στην a μεσα στη συναρτηση η main δεν μπορει να ξερει τι γινεται αν ειναι απλες οι μεταβλητες. Κανε τον κοπο κι ανεβασε τον κωδικα σου να τον κοιταξουμε.. Σωστά δεν είχα προσέξει ότι κάνει malloc μέσα στην συνάρτηση. Πάντως χρειάζεται να δώσει κώδικα
panourgias Δημοσ. 24 Φεβρουαρίου 2010 Μέλος Δημοσ. 24 Φεβρουαρίου 2010 Ναι το &a είναι για απλες μεταβλητες, ώστε να γνωρίζει η συναρτηση την memory address της και επιφερει αλλαγες . Στη περίπτωση των pointers δεν χρειάζεται εφοσον η address των τιμών των μεταβλητων είναι αποθηκευμενη στο σωμα τους.
pagratios Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 το &α είναι και για δομές και κάνεις μετά α->στοιχείο.
panourgias Δημοσ. 24 Φεβρουαρίου 2010 Μέλος Δημοσ. 24 Φεβρουαρίου 2010 ναι οκ. Μονο οταν η δομη δεν ειναι σε δεικτη. Αν ειναι δεικτης σε δομη δε χρειαζεται.
Evgenios1 Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Οπως το έψαξα, βρήκα οτι όταν εκχωρω τιμές στα μέλη της a, εξω στη main, τις αποθηκευει μια χαρα. Οταν κάνω εκχωρηση σε μέλος της a μέσα απο τη συναρτηση, δε αποθηκευονται οι τιμές στο a αλλα στα μέλη του b και φυσικά στο a δεν αποθηκευεται τιποτα. Και ο κωδικας ειναι μια χαρα απο συντακτικο ή απο λογικη. Μηπως τραβας κανα 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; }
mchatz Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Γεια σας. Σε μια συνάρτηση εισαγω 2 pointers (*a, *που δείχνουν σε δυο διαφορετικές 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)! (εκτος αν δεν το κατάλαβα καλά.. ένα δειγματάκι κώδικα ίσως?)
pagratios Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Μάλλον ο κώδικας είναι μυστικός γιατί του το λέμε και δεν τον δείχνει:p
panourgias Δημοσ. 25 Φεβρουαρίου 2010 Μέλος Δημοσ. 25 Φεβρουαρίου 2010 Ok Το προβλημα λυθηκε. Στο b εδινα sizeof αλλη δομης... και δεν το εβλεπα διοτι ηταν μέσα σε αλλη συναρτηση. Κατι τετοια χαζα συμβαινουν και σε παιδευουν για μέρες... mchatz, οταν περνας ενα pointer σε function δεν χρειάζεται να δώσεις return για να γυρίσεις τι τιμή που δείχνει ο pointer, διότι αποθηκευεις την τιμή στη διευθυνση που πήρες απο το pointer. Όταν όμως περνάς σαν όρισμα στη συνάρτηση ένα pointer που δεν του έχεις δώσει αρχική τιμή απο την main, τότε πρέπει να κανεις return τον pointer για να έχεις μετα στη main την διευθυνση (αφου ο δεικτης μεσα στη συνάρτηση είναι τοπικός και χάνεται μολις κλεισει).
parsifal Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Όταν όμως περνάς σαν όρισμα στη συνάρτηση ένα pointer που δεν του έχεις δώσει αρχική τιμή απο την main, τότε πρέπει να κανεις return τον pointer για να έχεις μετα στη main την διευθυνση (αφου ο δεικτης μεσα στη συνάρτηση είναι τοπικός και χάνεται μολις κλεισει). Ή...να περάσεις στη συνάρτηση pointer στον pointer που θέλεις να χρησιμοποιήσεις για το memory allocation.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.