παπι Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Έχει να κάνει με την πλατφόρμα και τον compiler. Δυστυχώς δεν ακολουθούν όλοι τα στάνταρ για την εσωτερική υλοποίηση των string literals, χώρια ότι ακόμα και το ίδιο το standard (τουλάχιστον το ANSI) περιέχει ασάφειες. Το αποτέλεσμα είναι, ορισμένοι compilers/πλατφόρμες να είναι πιο "ανθεκτικοί" σε... λαλακίες από άλλους αλλά και συγκριτικά με το στάνταρ (ή έστω αυτό που ήθελε να εννοήσει το standard ). δεν εχει καμια σχεση με strings, (αυτα πανε στο text segment) , μπορεις να δοκιμασεις και με integers και memset και οτι αλλο θες. Ειναι απλο, εφοσον δεν υπαρχει check bound στα arrays, ενα stack overflow μπορει να περασει απαρατηρητο. Για αυτο το λογο θα προτινω στον ts οταν παιζει με strings και arrays να χρησιμοποιει τις συναρτησεις που εχουν maxcount πχ strncpy κλπ κλπ κλπ εδιτ πχ σε αυτο το σημειο >while (fgets ( line, sizeof line, file)!= NULL) { int x=0; char str[] ={}; *str=*line; char * pch; pch = strtok (str," "); char name[]={0}; while (pch != NULL) { if(x==0) { strcpy(name,pch); με αυτο strcpy(name,pch); αντιγραφει το pch στα mame(1 char) pch(4-8char) str(4-8char) x (4 char) κλπ κλπ κλπ. Φισυκα το προγραμμα δεν θα κανει αυτο που πρεπει, αλλα ουτε και θα εχεις stackoverflow εφοσον δεν ξεχειλιζει η stack
migf1 Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Ναι, αλλά δεν πάνε guaranteed στο text-segment τα string literals σε όλες τις πλατφόρμες. Αυτό σου είπα παραπάνω (έδωσα και links ).
migf1 Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Λοιπόν, επειδή σε "αποπήρα" χτες και το χα τύψεις στη συνείδησή μου ( ) σουλούπωσα λίγο τον κώδικά σου και σου συμπλήρωσα σχόλια που ελπίζω θα σε βοηθήσουν προς τη σωστή κατεύθυνση. Σου ξαναλέω όμως, πως αν δεν κάτσεις πρώτα να μάθεις τι είναι και πως δουλεύουν τα strings (συμπεριλαμβανομένης της διαφοράς τους από απλούς δείκτες σε χαρακτήρα) πολύ δύσκολα θα βγάλεις άκρη. Επίσης, θα πρέπει να κατανοήσεις και τη λογική των δεικτών γενικότερα, για να μπορέσεις να διαχειριστείς τα List και Cd στο πρόγραμμά σου. Ελπίζω να μην τα έχεις αφήσει για τελευταία στιγμή και σε πιέζει ο χρόνος, γιατί αυτά δεν μαθαίνονται σε 1-2 μέρες. > #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXLEN_FNAME (254+1) #define MAXLEN_LINE (14+1) typedef struct node { char filename[ MAXLEN_FNAME ]; int filesize; struct node *next; }List; typedef struct cd { int current_size; List *root; struct cd *next; }Cd; // ------------------------------------------------------------------- int main ( void ) { char filename[ MAXLEN_FNAME ] = {0}; // ΟΡΙΖΕ ΠΑΝΤΑ ΜΕΓΙΣΤΟ ΜΗΚΟΣ ΣΤΑ STRINGS FILE *file = NULL; int size; List *root = NULL, List *ptr = NULL; // **** ΤΟ ΕΧΕΙΣ ΟΡΙΣΕΙ 2 ΦΟΡΕΣ ΤΟ 'ptr' Cd *head = NULL; Cd *ptr = NULL; // **** ΤΟ ΕΧΕΙΣ ΟΡΙΣΕΙ 2 ΦΟΡΕΣ ΤΟ 'ptr' printf("Please give me the file's name:"); scanf("%s", filename); file = fopen (filename, "r" ); if ( !file ) { // ΑΠΟΤΥΧΙΑ ΤΟΥ fopen() perror ( filename ); exit(1); } root = malloc( sizeof(List) ); if ( !root ) { // ΑΠΟΤΥΧΙΑ ΤΟΥ malloc() perror ( filename ); exit(1); } ptr = root; // **** ΤΟ ΕΧΕΙΣ ΟΡΙΣΕΙ 2 ΦΟΡΕΣ ΤΟ 'ptr' head = malloc( sizeof(Cd) ); // ΑΠΟΤΥΧΙΑ ΤΟΥ malloc() if ( !head ) { perror ( filename ); exit(1); } prt = head; // **** ΤΟ ΕΧΕΙΣ ΟΡΙΣΕΙ 2 ΦΟΡΕΣ ΤΟ 'ptr' /* * ΑΠΟ ΕΔΩ ΚΑΙ ΚΑΤΩ, ΠΕΡΑ ΑΠΟ ΤΑ ΣΧΟΛΙΑ ΠΟΥ ΣΟΥ ΕΧΩ ΣΥΜΠΛΗΡΩΣΕΙ, * ΣΚΕΨΟΥ ΠΟΛΥ ΣΟΒΑΡΑ ΝΑ ΔΙΑΧΩΡΙΣΕΙΣ ΛΟΓΙΚΕΣ ΕΝΟΤΗΤΕΣ ΣΕ ΞΕΧΩΡΙΣΤΕΣ * ΣΥΝΑΡΤΗΣΕΙΣ (ειδικά το 2ο while-loop "ΦΩΝΑΖΕΙ" να το χωρισεις σε συναρτήσεις) */ int grammh = 1; char line[ MAXLEN_LINE ]; /* or other suitable maximum line size */ while ( fgets( line, MAXLEN_LINE, file ) != NULL ) { int x = 0; char str[] = {}; // **** AYTO TI EINAI; POINTER ή STRING; // **** αν είναι pointer: char *str; // **** αν είναι string: char str[MAXLEN_LINE]={0}; // **** EITHER WAY, ΔΕΝ ΤΟ ΧΡΕΙΑΖΕΣΑΙ ! *str = *line; // **** ΑΝ ΤΟ str ήταν pointer: str = line; // **** ΑΝ ΤΟ str ήταν string: strncpy(str, line, MAXLEN_LINE); // **** ( μάλλον pointer το ήθελες το str, δεν ξέρω το γιατί, // **** αφού μπορείς να περάσεις απευθείας το 'line' στην // **** strtok()... είτε έτσι είτε αλλιώς το'χεις ΛΑΘΟΣ ) char *pch; pch = strtok (str, " "); // pch = strtok(line, " "); char name[] = {0}; // char name[ MAXLEN_LINE ] = {0}; while ( pch != NULL ) { if ( x == 0 ) { strcpy( name, pch ); // strncpy(name, pch, MAXLEN_LINE); printf ("%s", name); pch = strtok(NULL, " "); x++; } else // **** x != 0 { size = atoi(pch); printf("%5d\n", size); if ( grammh < 2 ) { if ( size >= 1000 ) { printf("!"); break; } root->filename = name; // **** ΑΥΤΟ ΘΕΛΕΙ strncpy() root->filesize = size; root->next = NULL; while (root != NULL) { printf("%s %d\n", root->filename, root->filesize); root = root->next; } grammh++; } else // **** grammh >= 2 { while( ptr->next != NULL ) ptr=ptr->next; ptr->next = malloc( sizeof(List) ); ptr->next->filename = name; // **** ΑΥΤΟ ΘΕΛΕΙ strncpy() ptr->next->filesize = size; ptr->next->next = NULL; while ( ptr->next != NULL ) { printf("%s %d\n", ptr->next->filename, ptr->next->filesize); ptr = ptr->next; } } pch = strtok( NULL, " " ); x++; } } } fclose ( file ); /* * ΑΠΟΔΕΣΜΕΥΣΕ ΜΕ ΑΝΤΙΣΤΟΙΧΑ free() ΟΛΑ ΣΟΥ ΤΑ malloc() ( ΞΕΧΩΡΙΣΤΑ ΓΙΑ ΚΑΘΕ node ) */ exit(0); }
HouseMusicFan Δημοσ. 2 Ιουνίου 2011 Μέλος Δημοσ. 2 Ιουνίου 2011 Ευχαριστω πολυ για τη βοηθεια.Τελικα το project το παρεδωσα σχετικα ολοκληρωμενο αν εξαιρεσεις καποια error που ακομη πεταγε τα οποια δεν ειχα κουραγιο να ψαξω αλλο μετα απο 2 ημερες αποβλακωσης μπροστα σε terminal καi shells. Και παλι ευχαριστω! Υ.Γ. Τo οτι εχω "θεματακια" το γνωριζω και γι αυτο το παλευω.Μου ειναι καπως δυσκολο κα8ως απο κει που δεν ηξερα γρι προγραμματισμο μεσα σε λιγοτερο απο 1 χρονο εχω κανει C & Python.
migf1 Δημοσ. 3 Ιουνίου 2011 Δημοσ. 3 Ιουνίου 2011 Παρακαλώ Αν σας τα έκαναν ξεχωριστά την κάθε γλώσσα ανά εξάμηνο, καλά είναι Γενικώς τα μαθήματα προγραμματισμού θεωρούνται (και είναι) δύσκολα, γιατί δεν "συγχωρούν" εύκολα απουσίες και κενά
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.