Title: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: ripper_george on April 12, 2008, 00:15:32 am Ένας λόγος που σιχαίνομαι τους πίνακες είναι ότι πρέπει να έχω ορίσει από πριν το μέγεθός τους....
Γιαυτό διάβασα από τις σημειώσεις για την δυναμική εκχώρηση μνήμης... Δοκίμασα να δημιουργήσω δοκιμαστικά ένα προγραμματάκι όμως μου βγάζει σφάλμα ότι: cannot convert from void to int Ιδού ο κώδικας: #include <stdio.h> #include <stdlib.h> void main() { int *p; int x,i; printf("please enter the number of the values you want to store\n"); scanf("%d",&x); p=malloc(x*sizeof(int)); if (p==NULL) { printf("Not enough memory, please store less"); } else { printf("Please start giving the values"); for (i=0;i<x;i++) { p=p+i; scanf("%d",p); } for (i=0;i<x;i++) { printf("%d",*(p-x-1+i)); } free(p-x+1); } } Από ότι καταλαβαίνω οφείλεται στο ότι δεν έχω ορίσει την p ως void αλλά ως int.... Όμως αν την δηλώσω ως void μετά στις επαναλήψεις τι ακριβώς να κάνω??? Δεν θα πρέπει να μεταβληθεί η τιμή της για να μεταφερθώ στις επόμενες θέσεις??? Επίσης στο internet είδα ένα πρόγραμμα όπου την malloc δεν την αποθηκεύει σε void αλλά int μεταβλητή. Ιδού και το link: http://irc.essex.ac.uk/www.iota-six.co.uk/c/f7_dynamic_memory_allocation.asp Επίσης στις σημειώσεις το Κ.Κορτέση, (σελ.50) ορίζει μεταβλητή *p στην οποία εκχωρεί την malloc αλλά στη συνέχεια αποθηκεύει την void p σε μία μεταβλητή int ip ( ip=p;). Δοκίμασα και αυτό αλλά και πάλι μου βγάζει error ότι πάω να βάλω σε int μεταβλητή void. (Και με το δίκιο του.... :)) Also, δεν κατάλαβα ξεκάθαρα την διαφορά της malloc και calloc.... Η calloc βάζει εξ αρχής το 0 σε κάθε μεταβλητή ενώ η malloc δεν τους δίνει καθόλου τιμές??? Any Help is deeply appreciated!!! Thx in advance. Title: Re: Dynamic Memory Allocation Post by: vasso on April 12, 2008, 00:20:48 am αυτό που κάνουμε συνήθως είναι type casting πριν τη malloc, δηλαδή
void *p; p= (int *) malloc(... mplamplampla) Title: Re: Dynamic Memory Allocation Post by: vasso on April 12, 2008, 00:24:07 am calloc πέρσι δε χρησιμοποιήσαμε καθόλου... είναι στις φετινές σημειώσεις;
for (i=0;i<x;i++) { p=p+i; scanf("%d",p); } for (i=0;i<x;i++) { printf("%d",*(p-x-1+i)); } free(p-x+1); } } for (i=0;i<x;i++) { scanf("%d",p+i); } for (i=0;i<x;i++) { printf("%d",*(p+i)); } free(p); } } Title: Re: Dynamic Memory Allocation Post by: Nessa NetMonster on April 12, 2008, 00:29:47 am Γιατί θέτεις p=p+i; Εκεί πρέπει να είναι το λάθος.
Title: Re: Dynamic Memory Allocation Post by: ripper_george on April 12, 2008, 00:34:04 am Vasso U RULE!!!! ;)
THX... Τώρα τρέχει, αλλά μου βγάζει debugger error ότι debug assertation failed..... Τι ακριβώς έκανα???? Το τίναξα??? Έβαλα για τρεις τιμές, αλλά αντί να μου ενφανίσει στην τρίτη τιμή, μου βγάζει κάτι ότινάναι αριθμούς.. Στις 2 τιμές δε λέει τίποτα απλώς για 1η τιμή βγάζει ότινάναι..... Για το p=p+i δεν θα πρέπει να μεταβάλω τον pointer για να αποθηκεύσω διαδοχικές τιμές??? Όσο για την calloc, απλά την είδα στο site που ανέφερα και μου κίνησε την περιέργεια.... Title: Re: Dynamic Memory Allocation Post by: Nessa NetMonster on April 12, 2008, 00:41:35 am Για το p=p+i δεν θα πρέπει να μεταβάλω τον pointer για να αποθηκεύσω διαδοχικές τιμές??? Πρόσεξε λίγο, ξαναδές το. Έτσι όπως το έγραψες δεν είναι διαδοχικές οι διευθύνσεις. Ας πούμε πχ ότι p=5600, μετά γίνεται 5601, μετά 5603, μετά 5606... Title: Re: Dynamic Memory Allocation Post by: ripper_george on April 12, 2008, 00:47:49 am Hmmm,
Seems that I really suck..... :-X Thx... Αλλά ακόμη μου βγάζει το debug assertation failed μύνημα.... Any idea why??? Title: Re: Dynamic Memory Allocation Post by: vasso on April 12, 2008, 00:51:14 am γιατί δεν χρησιμοποιείς dev... :P
ΥΓ. στην απίθανη περίπτωση που χρησιμοποιείς και σου βγάζει όντως αυτή τη βλακέια μήνυμα, πες το με πιμι να σβήσω το μήνυμα μου... Title: Re: Dynamic Memory Allocation Post by: ripper_george on April 12, 2008, 00:55:34 am Το Visual Studio έχω....
Είχα ακούσει για κάτι διαφοροποιήσεις με τους κοινούς compiler και σκέφτηκα καλύτερα αυτό παρότι είναι microsoft, μιας και το πρότεινε και ο K.Kορτέσης... Title: Re: Dynamic Memory Allocation Post by: ripper_george on April 13, 2008, 23:44:16 pm Help!
To παρακάτω πρόγραμμα δεν τρέχει.... :'( #include <stdio.h> #include <stdlib.h> void main() { void *p,*l; int i,n,m; printf("please enter the number of the frequencies for the 1st radio station\n"); scanf("%d",&n); printf("please enter the number of the frequencies for the 2nd radio station\n"); scanf("%d",&m); p=malloc(n*sizeof(float)); l=malloc(m*sizeof(float)); if (p==NULL || l==NULL) { while (p==NULL || l==NULL) { printf("Not enought memory, Please try giving less frequencies\n"); printf("please enter the number of the frequencies for the 1st radio station\n"); scanf("%f",&n); printf("please enter the number of the frequencies for the 2nd radio station\n"); scanf("%f",&m); } } else { printf("Please enter the frequencies for the 1st radio station\n"); for (i=0;i<n;i++) { scanf("%f",(float*)p+i); } free(p-i); printf("Please enter the frequencies for the 2nd radio station\n"); for (i=0;i<m;i++) { scanf("%f",(float*)l+i); } free(l-i); } printf("the first array\n"); for (i=0;i<n;i++) { printf("%f",(float*)p+i); } printf("the second array\n"); for (i=0;i<m;i++) { printf("%f",(float*)l+i); } } Από ότι ψιλιάζομαι, πρέπει να έχει πρόβλημα στην free... Για να μπορέσω να αποθηκεύσω τιμές, στις επαναλήψεις που θα κάνω πρέπει να μετατρέψω τις p,l από void σε float, right??? Μετά όμως για να μπορέσω να αποδεσμεύσω τη μνήμη, πρέπει να βάλω την free, η οποία δέχεται ως όρισμα void τιμή, right??? Αυτό δεν έχω κάνει??? Τι γελοιότητα πάλι έχω κάνει?? Anyone having an idea??? Thx in advance! Title: Re: Dynamic Memory Allocation Post by: Nessa NetMonster on April 13, 2008, 23:54:04 pm Το while θα εκτελείται συνεχώς, αφού δεν αλλάζουν μέσα τα p και l.
Title: Re: Dynamic Memory Allocation Post by: ripper_george on April 13, 2008, 23:55:41 pm Καλή παρατήρηση....
Όμως καμία ιδέα για το λάθος μέσα στις free??? Title: Re: Dynamic Memory Allocation Post by: Nessa NetMonster on April 14, 2008, 00:08:52 am Α σόρι, νόμιζα ότι βρήκα ΤΟ λάθος και δεν πήγα παρακάτω :P
Μου φαίνεται ότι κάνεις free πριν διαβάσεις τις τιμές... και ούτως ή άλλως αυτό που κάνεις free δεν είναι στη δεσμευμένη μνήμη, γιατί είναι n θέσεις πριν το p (αντίστοιχα m θέσεις πριν το l) - σε εκείνο το σημείο του προγράμματος είναι i=n (αντίστοιχα m). Κάνε free(p) και free(l) - αλλά στο τέλος του προγράμματος. Επίσης, η printf δεν παίρνει τους δείκτες σαν όρισμα, βάζεις τις ίδιες τις μεταβλητές. Title: Re: Dynamic Memory Allocation Post by: ripper_george on April 14, 2008, 00:15:23 am Thx man,
U r the best! :D Title: Re: Dynamic Memory Allocation Post by: Emfanever on May 02, 2008, 22:59:17 pm αυτό που κάνουμε συνήθως είναι type casting πριν τη malloc, δηλαδή Μετά όμως αν θέλουμε να αποθηκεύσουμε στo p[ι] τις τιμές τι γίνεται με το " %d " που βάζουμε μέσα στη scanf;void *p; p= (int *) malloc(... mplamplampla) π.χ αν γράψουμε _____________________________ #include <stdio.h> #include <stdlib.h> void main() { void *p; int i,k; printf("k="); scanf("%d",&k); p = (int *) malloc(k*sizeof(int)); for(i=0;i<k;i++) scanf("%d",&p[ι]); } __________________________________ Βγάζει σφάλμα γιατί το p είναι void και βάζουμε "%d" Title: Re: Dynamic Memory Allocation Post by: Καμένος on May 02, 2008, 23:37:21 pm Γιατί να βάλεις τον pointer void και όχι int κατευθέιαν?
Title: Re: Dynamic Memory Allocation Post by: Γιώργος on May 02, 2008, 23:42:33 pm αυτό που κάνουμε συνήθως είναι type casting πριν τη malloc, δηλαδή ... Πάντως με int ο pointer μια χαρά δουλεύει το προγραμματάκι. Και αυτός όντως είναι ο τρόπος για να ορίσεις δυναμικά έναν πίνακα. Με μια μικρή επέκταση αυτό πάει και σε δισδιάστατο εύκολα. ;) Title: Re: Dynamic Memory Allocation Post by: vasso on May 03, 2008, 02:46:49 am αυτό που κάνουμε συνήθως είναι type casting πριν τη malloc, δηλαδή Μετά όμως αν θέλουμε να αποθηκεύσουμε στo p[ι] τις τιμές τι γίνεται με το " %d " που βάζουμε μέσα στη scanf;void *p; p= (int *) malloc(... mplamplampla) π.χ αν γράψουμε _____________________________ #include <stdio.h> #include <stdlib.h> void main() { void *p; int i,k; printf("k="); scanf("%d",&k); p = (int *) malloc(k*sizeof(int)); for(i=0;i<k;i++) scanf("%d",&p[ι]); } __________________________________ Βγάζει σφάλμα γιατί το p είναι void και βάζουμε "%d" μα είναι λάθος να κάνεις τον πόιντερ p void. ο πίνακάς σου, θα περιέχει ακέραιους, για να δεσμεύσεις δυναμικά μνήμη για πίνακα ακεραίων, χρησιμοποιείς πόιντερ σε ακέραιο. Title: Re: Dynamic Memory Allocation Post by: Emfanever on May 03, 2008, 09:50:53 am Το ξέρω ότι είναι λάθος αλλά στο πράδειγμά σου εσύ έγραψες :
void *p; p= (int *) malloc(... mplamplampla) και γι'αυτό ρωτάω.... Title: Re: Dynamic Memory Allocation Post by: vasso on May 03, 2008, 16:00:33 pm ωχ σοβαρα;
σοζ... πάω να αυτοκτονήσω... :P Title: Re: Dynamic Memory Allocation Post by: Emfanever on May 08, 2008, 20:35:35 pm Μπορεί κανείς να μου πει τι λάθος υπάρχει στο παρακάτω πρόγραμμα? :-\ Στο compiling δε βγάζει σφάλμα, αλλά όταν το τρέχω βγάζει κάτι ακαταλαβίστικα μηνύματα λάθους. Το πρόγραμμα σχηματίζει δυο τυχαίους δισδυάστατους πίνακες και τους προσθέτει.
Χρησιμοποιείται pointer σε pointer. thnks! Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Γιώργος on May 08, 2008, 20:42:54 pm Σωστό μου φαίνεται εκ πρώτης όψεως. Τι σου βγάζει; :???:
Παρεμπιπτώντως, αφού χρησιμοποιείς την rand(), βάλε στην αρχή του προγράμματός σου το srand(time(NULL)) για να βγάζει διαφορετικές ακολουθίες κάθε φορά. :) Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Emfanever on May 08, 2008, 20:47:41 pm Αυτό...
αν ξέρεις κινέζικα δε θα σου είναι δύσκολο να το διαβάσεις! :P Πάντως σε έναν άλλο compiler πάλι έβγαζε σφάλμα, άλλα έλεγε κάτι γαι 0x000042 και κάτι παρόμοια... Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Γιώργος on May 08, 2008, 20:48:58 pm Δοκίμασες τον DEV; 8)
Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Emfanever on May 08, 2008, 20:50:01 pm Ναι το δοκίμασα , πάλι σφάλμα!
0χ00000 κτλ Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Γιώργος on May 08, 2008, 21:02:00 pm Με λίγα λόγια: Segmatation fault. 8)
Αθάνατα UNIX. Κάτσε να δω τι παίζει... Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Γιώργος on May 08, 2008, 21:10:47 pm for (j=0;i<n;j++)
Και infinite loop. Πόσες φορές την έχω πατήσει έτσι... :D :D :D :D :D :D :D :D :D Title: Re: [Δομημένος Προγραμματισμός] Dynamic Memory Allocation Post by: Emfanever on May 08, 2008, 21:17:36 pm ΟΚ δουλεύει, ευχαριστώ!
|