jimbakl Δημοσ. 25 Απριλίου 2012 Δημοσ. 25 Απριλίου 2012 Μην χρησιμοποιεις VS χρησιμοποιει Intel C++ compiler και αρκετες φορες παιζει να πεταει warning η και λαθη εκτος αν σου αρεσει το ide και θες να του ορισεις αλλο compiler πχ gcc Προς χρήστη Anubis. Μπορείς να δώσεις σε παρακαλώ οδηγίες για το πώς θα βάλουμε compiler στο VStudio τον gcc και ποια θεωρείς ότι είναι τα +/- του gcc Vs Intel C++ ?? Δεν θέλω να μου πεις ψαγμένα πράγματα γιατί δεν θα τα καταλάβω, θέλω τα πρακτικά θέματα τα οποία ένας νέος "προγραμματιστής" θα αντιμετωπίσει Εγώ κυρίως ασχολούμαι με αλγόριθμους δρομολόγησης και αν όλα πάνε καλά σε λίγο καιρό επιχ/κής έρευνας και μαθηματικού προγραμματισμού. Σε ευχαριστώ.
migf1 Δημοσ. 25 Απριλίου 2012 Δημοσ. 25 Απριλίου 2012 Μπορείς να δώσεις σε παρακαλώ οδηγίες για το πώς θα βάλουμε compiler στο VStudio τον gcc και ποια θεωρείς ότι είναι τα +/- του gcc Vs Intel C++ ?? Δεν θέλω να μου πεις ψαγμένα πράγματα γιατί δεν θα τα καταλάβω, θέλω τα πρακτικά θέματα τα οποία ένας νέος "προγραμματιστής" θα αντιμετωπίσει Εγώ κυρίως ασχολούμαι με αλγόριθμους δρομολόγησης και αν όλα πάνε καλά σε λίγο καιρό επιχ/κής έρευνας και μαθηματικού προγραμματισμού. Σε ευχαριστώ. Ο Intel C++ από ότι ξέρω δεν είναι ο default compiler του VS, ο default είναι της Microsoft. Ο Intel μπαίνει με ειδικό plugin. Πέρα από ότι ο gcc ενημερώνεται συχνότερα και διατίθεται σχεδόν σε όλες τις πλατφόρμες (cross compiling κλπ) δεν νομίζω πως υπάρχει σημαντικός λόγος να μπει κανείς στη διαδικασία. Η C++ της Mirosoft είναι ενημερωμένη και εξελίσσεται. Αντίθετα την C δεν την εξελίσσει η Microsoft, με αποτέλεσμα να μην υποστηρίζει τα σύγχρονα στανταρ (αν και χρησιμοποιεί πολλές δικές της συναρτήσεις ως extensions... δηλαδή δεν γίνονται compile σε άλλες πλατφόρμες).
katsikoula Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 παιδιά προσπαθώ να κάνω compile ένα προγραμματάκι αλλά μου χτυπάει ο compiler (δουλεύω σε Pelles C). ο κώδικας: //programma gia diaxirisi tilefwnikou katalogou #include <stdio.h> #include <string.h> #define arxeio1 "c:\\arxeio1.txt" main() { // dilwsi akeraiwn metavlitwn int ep, plithos=0, i; char anep,anon; do { //emfanisi menou stn xristi printf ("\n Parakalw epilekste apo ta parakatw: \n 1. Eisagwgi Sindromiti \n 2. Anazitisi Arithmou Sindromiti \n 3. Lista Sindromitwn \n 4. Eksodos apo to programma \n"); scanf ("%d", &ep); //an epelekse kati pera tn epilogwn 1-4 while (ep!=1 || ep!=2 || ep!=3 || ep!=4) { printf ("Lathos epilogi"); } // dilwnw tn domi pou apothikeyw ta onomata,... struct katalogos { char epitheto[20]; char onoma[10]; int tilefwno[20]; }tilkat[30]; //an epelekse na eisagei sindromiti stn lista if (ep==1) { //an to plithos eggegramenwn einai 30 o tilefwnikos katalogos simfwna me tis apaitiseis tis ergasias einai gematos if (plithos>29) { printf ("O tilefwnikos katalogos gemise"); goto end; } plithos=plithos+1; printf ("Dwse to epitheto \n"); scanf ("%s", &tilkat[plithos-1].epitheto); printf ("Dwse to onoma \n"); scanf ("%s", &tilkat[plithos-1].onoma); printf ("Dwse to tilefwno \n"); scanf ("%d", &tilkat[plithos-1].tilefwno); } if (ep==2) { if (plithos==0) { printf ("O tilefwnikos katalogos einai adeios"); goto end; } //anazitisi arithmou sindromiti printf ("Dwse epitheto"); scanf ("%s", &anep); printf ("Dwse onoma"); scanf ("%s", &anon); do { i=0; if ( strcmp ( tilkat[plithos].epitheto, anep ) == 0 ) { if ( strcmp ( tilkat[plithos].onoma, anon ) == 0 ) { printf("A.A.: %d \t Epitheto: %s \t Onoma: %s \t Tilefwno: %d \n", plithos, tilkat[plithos].epitheto, tilkat[plithos].onoma, tilkat[plithos].tilefwno); } } else { i=i+1; } } while (i<(plithos-1)); } if (ep==3) { // antigrafi olwn tn eggegramenwn se ekswteriko arxeio txt FILE *tilkat; tilkat = fopen(arxeio1, "w"); if (!tilkat) { printf("Error opening \"tilkat\"\n"); } else { printf("\"tilkat\" opened successfully\n"); } for (i=0; i<plithos; i++) { fprintf(tilkat, ″%d tilkat.epitheto \t tilkat.onoma \t tilkat.tilefwno″, i+1); fprintf(tilkat, "sinolo eggegramenwn: %d", plithos); } fclose(tilkat); } end: } while (ep!=4); //anti tis system("Pause") tha xrisimopoihsw tn entoli getchar() gia diaforous logous kiriws foritotitas programmatos se leitourgika sistimata printf ("Pata opoiodipote koumpi gia eksodo... \n"); //fflush( stdout ); getchar (); getchar (); return 0; } το log: Building test.obj. C:\Users\katsikaki\Desktop\test.c(8): warning #2099: Missing type specifier; assuming 'int'. C:\Users\katsikaki\Desktop\test.c(9): warning #2117: Old-style function definition for 'main'. C:\Users\katsikaki\Desktop\test.c(41): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'char *' but found 'char (*)[20]'. C:\Users\katsikaki\Desktop\test.c(43): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'char *' but found 'char (*)[10]'. C:\Users\katsikaki\Desktop\test.c(45): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int (*)[20]'. C:\Users\katsikaki\Desktop\test.c(62): error #2140: Type error in argument 2 to 'strcmp'; expected 'const char *' but found 'char'. C:\Users\katsikaki\Desktop\test.c(64): error #2140: Type error in argument 2 to 'strcmp'; expected 'const char *' but found 'char'. C:\Users\katsikaki\Desktop\test.c(66): warning #2234: Argument 5 to 'printf' does not match the format string; expected 'int' but found 'int *'. C:\Users\katsikaki\Desktop\test.c(92): error #2039: Invalid expression. C:\Users\katsikaki\Desktop\test.c(92): error #2048: Undeclared identifier 'd'. C:\Users\katsikaki\Desktop\test.c(92): error #2140: Type error in argument 2 to 'fprintf'; expected 'const char * restrict' but found 'int'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ')' but found 'tilkat'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ';' but found 'tilkat'. C:\Users\katsikaki\Desktop\test.c(92): error #2152: Unknown field 'epitheto' of 'FILE'. C:\Users\katsikaki\Desktop\test.c(92): error #2036: Invalid character: '\x5c'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ';' but found '\t'. C:\Users\katsikaki\Desktop\test.c(92): error #2048: Undeclared identifier '\t'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ';' but found 'tilkat'. C:\Users\katsikaki\Desktop\test.c(92): error #2152: Unknown field 'onoma' of 'FILE'. C:\Users\katsikaki\Desktop\test.c(92): error #2036: Invalid character: '\x5c'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ';' but found '\t'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ';' but found 'tilkat'. C:\Users\katsikaki\Desktop\test.c(92): error #2152: Unknown field 'tilefwno' of 'FILE'. C:\Users\katsikaki\Desktop\test.c(92): error #2039: Invalid expression. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ':' but found 'i'. C:\Users\katsikaki\Desktop\test.c(92): error #2001: Syntax error: expected ';' but found ')'. C:\Users\katsikaki\Desktop\test.c(92): error #2061: Invalid statement termination. C:\Users\katsikaki\Desktop\test.c(100): error #2001: Syntax error: expected ';' but found '}'. *** Error code: 1 *** Done. καμία ιδέα κανείς? τέτοια ώρα ψιλοκοιμάμαι όρθιος οπότε δυσκολεύμαι να βρω τα λάθη ποια είναι...
migf1 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 Έχει διάφορα λάθη μέσα. Το βασικό είναι πως μπερδεύεις τα strings με τα απλά char, αλλά έχεις κι άλλα... π.χ. το tilkat το ορίζεις και ως πίνακα δομών και ως FILE * . Προσπάθησε να σπας το πρόβλημα σε υπο-προβλήματα, τα οποία κατόπιν τα κάνεις συναρτήσεις. Εκτός του ότι βοηθάει πάρα πολύ να εστιάζεις σε ένα υπο-πρόβλημα την φορά, κάνει και τον κώδικά σου πολύ πιο ευανάγνωστο, και κυρίως πολύ πιο εύκολα διαχειρίσιμο. Ομοίως και το να συγκεντρώνεις τους ορισμούς των μεταβλητών σε ένα μπλοκ, αντί να τις ορίζεις διάσπαρτα μέσα στον κώδικα... > //programma gia diaxirisi tilefwnikou katalogou #include <stdio.h> #include <string.h> #define FNAME "c:\\arxeio1.txt" #define MAXLEN_EPITHETO (20+1) #define MAXLEN_ONOMA (10+1) #define MAXLEN_TILEFWNO (20+1) // dilwnw tn domi pou apothikeyw ta onomata,... typedef struct Katalogos { char epitheto[ MAXLEN_EPITHETO ]; char onoma[ MAXLEN_ONOMA ]; char tilefwno[ MAXLEN_TILEFWNO ]; } Katalogos; /* ------------------------------------------------------------------ * antigrafi olwn tn eggegramenwn se ekswteriko arxeio txt */ void do_lista_sindromitwn( Katalogos tilkat[], int plithos ) { int i=0; FILE *fp = NULL; fp = fopen(FNAME, "w"); if (!fp) { printf("Error opening \"tilkat\"\n"); return; } printf( "\"%s\" opened successfully\n", FNAME ); for (i=0; i < plithos; i++) { fprintf(fp, "%s\t%s\t%s\n", tilkat[i].epitheto, tilkat[i].onoma, tilkat[i].tilefwno ); } fprintf(fp, "sinolo eggegramenwn: %d", i); fclose(fp); return; } /* ------------------------------------------------------------------ * anazitisi arithmou sindromiti */ void do_anazitisi( Katalogos tilkat[], int plithos ) { int i = 0; char anon[MAXLEN_ONOMA] = {'\0'}, anep[MAXLEN_EPITHETO] = {'\0'}; if ( plithos < 1 ) { printf ("O tilefwnikos katalogos einai adeios"); return; } printf( "Dwse epitheto" ); scanf( "%s", anep ); printf( "Dwse onoma" ); scanf( "%s", anon ); for (i=0; i < plithos; i++) { if ( 0 == strcmp(tilkat[i].epitheto, anep) && 0 == strcmp(tilkat[i].onoma, anon) ){ printf( "A.A.: %d \t Epitheto: %s \t Onoma: %s \t Tilefwno: %s \n", i, tilkat[i].epitheto, tilkat[i].onoma, tilkat[i].tilefwno ); break; } } return; } /* ------------------------------------------------------------------ * */ void do_eisagwgi( Katalogos tilkat[], int *plithos ) { //an to plithos eggegramenwn einai 30 o tilefwnikos katalogos simfwna me tis apaitiseis tis ergasias einai gematos if (*plithos > 29) { printf ("O tilefwnikos katalogos gemise"); return; } printf( "Dwse to epitheto: " ); scanf( "%s", tilkat[*plithos].epitheto ); printf( "Dwse to onoma: "); scanf( "%s", tilkat[*plithos].onoma ); printf( "Dwse to tilefwno: " ); scanf( "%s", tilkat[*plithos].tilefwno ); (*plithos)++; return; } /* ------------------------------------------------------------------ */ int print_menu( void ) { int ep = 0; //emfanisi menou stn xristi puts ("\nParakalw epilekste apo ta parakatw\n"); puts("1. Eisagwgi Sindromiti"); puts("2. Anazitisi Arithmou Sindromiti"); puts("3. Lista Sindromitwn"); puts("4. Eksodos apo to programma"); for (; { printf(": "); scanf ("%d", &ep); if ( ep < 1 || ep > 4 ) puts( "Lathos epilogi" ); else break; } return ep; } /* ------------------------------------------------------------------ */ int main( void ) { int ep, plithos = 0; Katalogos tilkat[30] = { {"\0", "\0", "\0"} }; do { ep = print_menu(); switch ( ep ) { case 1: // Eisagwgi Sindromiti do_eisagwgi( tilkat, &plithos ); break; case 2: // Anazitisi Arithmou Sindromiti do_anazitisi( tilkat, plithos ); break; case 3: // Lista Sindromitwn do_lista_sindromitwn( tilkat, plithos ); break; default: // Eksodos apo to programma break; } } while (4 != ep); return 0; } Το παραπάνω δεν είναι τίποτα άλλο από τον δικό σου κώδικα δομημένο σε συναρτήσεις και διορθωμένα τα εξόφθαλμα σφάλματα. Δεν δοκίμασα να δω αν τρέχει, αλλά σίγουρα θέλει να προσθέσεις ελέγχους για αποφυγή overflow των strings (π.χ. αντί για scanf() να τα διαβάζεις με fgets() ).
katsikoula Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 Έχει διάφορα λάθη μέσα. Το βασικό είναι πως μπερδεύεις τα strings με τα απλά char, αλλά έχεις κι άλλα... π.χ. το tilkat το ορίζεις και ως πίνακα δομών και ως FILE * . Προσπάθησε να σπας το πρόβλημα σε υπο-προβλήματα, τα οποία κατόπιν τα κάνεις συναρτήσεις. Εκτός του ότι βοηθάει πάρα πολύ να εστιάζεις σε ένα υπο-πρόβλημα την φορά, κάνει και τον κώδικά σου πολύ πιο ευανάγνωστο, και κυρίως πολύ πιο εύκολα διαχειρίσιμο. Ομοίως και το να συγκεντρώνεις τους ορισμούς των μεταβλητών σε ένα μπλοκ, αντί να τις ορίζεις διάσπαρτα μέσα στον κώδικα... > //programma gia diaxirisi tilefwnikou katalogou #include <stdio.h> #include <string.h> #define FNAME "c:\\arxeio1.txt" #define MAXLEN_EPITHETO (20+1) #define MAXLEN_ONOMA (10+1) #define MAXLEN_TILEFWNO (20+1) // dilwnw tn domi pou apothikeyw ta onomata,... typedef struct Katalogos { char epitheto[ MAXLEN_EPITHETO ]; char onoma[ MAXLEN_ONOMA ]; char tilefwno[ MAXLEN_TILEFWNO ]; } Katalogos; /* ------------------------------------------------------------------ * antigrafi olwn tn eggegramenwn se ekswteriko arxeio txt */ void do_lista_sindromitwn( Katalogos tilkat[], int plithos ) { int i=0; FILE *fp = NULL; fp = fopen(FNAME, "w"); if (!fp) { printf("Error opening \"tilkat\"\n"); return; } printf( "\"%s\" opened successfully\n", FNAME ); for (i=0; i < plithos; i++) { fprintf(fp, "%s\t%s\t%s\n", tilkat[i].epitheto, tilkat[i].onoma, tilkat[i].tilefwno ); } fprintf(fp, "sinolo eggegramenwn: %d", i); fclose(fp); return; } /* ------------------------------------------------------------------ * anazitisi arithmou sindromiti */ void do_anazitisi( Katalogos tilkat[], int plithos ) { int i = 0; char anon[MAXLEN_ONOMA] = {'\0'}, anep[MAXLEN_EPITHETO] = {'\0'}; if ( plithos < 1 ) { printf ("O tilefwnikos katalogos einai adeios"); return; } printf( "Dwse epitheto" ); scanf( "%s", anep ); printf( "Dwse onoma" ); scanf( "%s", anon ); for (i=0; i < plithos; i++) { if ( 0 == strcmp(tilkat[i].epitheto, anep) && 0 == strcmp(tilkat[i].onoma, anon) ){ printf( "A.A.: %d \t Epitheto: %s \t Onoma: %s \t Tilefwno: %s \n", i, tilkat[i].epitheto, tilkat[i].onoma, tilkat[i].tilefwno ); break; } } return; } /* ------------------------------------------------------------------ * */ void do_eisagwgi( Katalogos tilkat[], int *plithos ) { //an to plithos eggegramenwn einai 30 o tilefwnikos katalogos simfwna me tis apaitiseis tis ergasias einai gematos if (*plithos > 29) { printf ("O tilefwnikos katalogos gemise"); return; } printf( "Dwse to epitheto: " ); scanf( "%s", tilkat[*plithos].epitheto ); printf( "Dwse to onoma: "); scanf( "%s", tilkat[*plithos].onoma ); printf( "Dwse to tilefwno: " ); scanf( "%s", tilkat[*plithos].tilefwno ); (*plithos)++; return; } /* ------------------------------------------------------------------ */ int print_menu( void ) { int ep = 0; //emfanisi menou stn xristi puts ("\nParakalw epilekste apo ta parakatw\n"); puts("1. Eisagwgi Sindromiti"); puts("2. Anazitisi Arithmou Sindromiti"); puts("3. Lista Sindromitwn"); puts("4. Eksodos apo to programma"); for (; { printf(": "); scanf ("%d", &ep); if ( ep < 1 || ep > 4 ) puts( "Lathos epilogi" ); else break; } return ep; } /* ------------------------------------------------------------------ */ int main( void ) { int ep, plithos = 0; Katalogos tilkat[30] = { {"\0", "\0", "\0"} }; do { ep = print_menu(); switch ( ep ) { case 1: // Eisagwgi Sindromiti do_eisagwgi( tilkat, &plithos ); break; case 2: // Anazitisi Arithmou Sindromiti do_anazitisi( tilkat, plithos ); break; case 3: // Lista Sindromitwn do_lista_sindromitwn( tilkat, plithos ); break; default: // Eksodos apo to programma break; } } while (4 != ep); return 0; } Το παραπάνω δεν είναι τίποτα άλλο από τον δικό σου κώδικα δομημένο σε συναρτήσεις και διορθωμένα τα εξόφθαλμα σφάλματα. Δεν δοκίμασα να δω αν τρέχει, αλλά σίγουρα θέλει να προσθέσεις ελέγχους για αποφυγή overflow των strings (π.χ. αντί για scanf() να τα διαβάζεις με fgets() ). σε ευχαριστώ πολύ για τον κόπο σου!!! μεγάλη διαφορά στον κώδικα. όντως είναι πιο ευαναγνωστός και πιο εύκολα διαχειρήσιμος. έχω μερικές απορίες όμως: γιατί στην δήλωση του πίνακα γράφεις typedef struct Katalogos? τι εννοείς έχω μπερδέψει τα string με τα char? εγώ από όσο έχω καταλάβει όταν το περιεχόμενο της μεταβλητής σου θα είναι ένα γράμμα (π.χ. N) την δηλώνεις ως char και στο scanf, printf βάζεις %c ενώ αν το περιεχόμενο της απαρτίζεται από πολλά τότε πάλι την δηλώνεις ως char αλλά στα scanf και printf βάζεις %s. η εντολή FILE *fp = NULL; στην πρώτη συνάρτηση τι κάνει? γιατί στην συνάρτηση do_eisagwgiχρησιμοποιείς παντού το *plithos για μετρητή και όχι απλά το plithos? δηλαδή, που βοηθάει ο pointer στην συγκεκριμένη περίπτωση? γιατί στην συνάρτηση print_menu χρησιμοποιείς puts αντί της printf? γιατί στην συνάρτηση print_menu και στην main βάζεις την λέξη void μέσα στην παρένθεση αντί του τίποτα? τέλος, τι εννοείς να προσθέσω ελέγχους για αποφυγή overflow των strings? τι κάνει αυτή η fgets? εν το μεταξύ όταν πατάω compile δεν μου κάνει κανένα παράπονο παρά μου βγάζει μια μπάρα δεξιά που λέει test.exe και από κάτω έχει τα source files τα οποία ανήκουν στο test.exe και το test.exe είναι άφαντο! που θα βρω το εκτελέσιμο αρχείο μου?
migf1 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 σε ευχαριστώ πολύ για τον κόπο σου!!! μεγάλη διαφορά στον κώδικα. όντως είναι πιο ευαναγνωστός και πιο εύκολα διαχειρήσιμος. έχω μερικές απορίες όμως: γιατί στην δήλωση του πίνακα γράφεις typedef struct Katalogos? Για να μπορώ να το χρησιμοποιώ κατόπιν ως τύπο όταν ορίζω μεταβλητές (την tilkat[30] σε αυτή την περίπτωση, τόσο στη main() όσο και στα ορίσματα των συναρτήσεων), χωρίς να χρειάζεται να γράφω και τη λέξη struct μπροστά τι εννοείς έχω μπερδέψει τα string με τα char? εγώ από όσο έχω καταλάβει όταν το περιεχόμενο της μεταβλητής σου θα είναι ένα γράμμα (π.χ. N) την δηλώνεις ως char και στο scanf, printf βάζεις %c ενώ αν το περιεχόμενο της απαρτίζεται από πολλά τότε πάλι την δηλώνεις ως char αλλά στα scanf και printf βάζεις %s. Εννοώ πως σε κάποια σημεία ορίζεις μεταβλητές char αλλά προσπαθείς να τις διαβάσεις ως strings στην scanf, αλλού προσπαθείς να συγκρίνεις char με string, κλπ.Τα strings δεν δηλώνονται ως char, αλλά ως char[ ] (ή ως char *) δηλαδή πίνακες από char, και πρέπει να εξασφαλίσεις πως ανά πάσα στιγμή θα περιέχουν τουλάχιστον έναν μηδενικό χαρακτήρα '\0'. η εντολή FILE *fp = NULL; στην πρώτη συνάρτηση τι κάνει? γιατί στην συνάρτηση do_eisagwgiχρησιμοποιείς παντού το *plithos για μετρητή και όχι απλά το plithos? δηλαδή, που βοηθάει ο pointer στην συγκεκριμένη περίπτωση? γιατί στην συνάρτηση print_menu χρησιμοποιείς puts αντί της printf? γιατί στην συνάρτηση print_menu και στην main βάζεις την λέξη void μέσα στην παρένθεση αντί του τίποτα? Όλα αυτά ανήκουν στις στοιχειώδεις γνώσεις τις γλώσσας, πράγμα που με κάνει να αναρωτιέμαι αν έχεις διαβάσει τα βασικά της γλώσσας πριν ξεκινήσεις να γράφεις το πρόγραμμα. Στην Pelles C (όπως και στα περισσότερα IDE) υπάρχει context-sensitive help για τις στάνταρ συναρτήσεις της γλώσσας. Κάνοντας δεξί κλικ πάνω στο keyword/function κι επιλέγοντας κατόπιν "Help about keyword/function" σου ανοίγει σε ξεχωριστό παράθυρο η τεκμηρίωση του εν λόγω keyword/function (ίσως χρειαστεί να πατήσεις κι ένα ENTER). Οπότε, για το FILE *fp διάβασε το help της fopen(). Ομοίως διάβασε το help της puts(). Για τη χρήση του keyword void, έτσι επιτάσσει η γλώσσα από την αναθεώρηση C89 και μετά (ANSI standard). Αυτό που έχεις στον δικό σου κώδικα είναι από την προ-ANSI εποχή (1989 και πριν) ... για αυτό άλλωστε και η Pelles-C σου βγάζει σχετικά warnings σε εκείνα τα σημεία, αναφερόμενη σε "old style". Για τον δείκτη του plithos στην do_eisagwgi(), είναι απαραίτητη η χρήση του, αλλιώς το όρισμα plithos δεν θα διατηρήσει τη νέα τιμή που του αναθέτει η συνάρτηση μέσα της. τέλος, τι εννοείς να προσθέσω ελέγχους για αποφυγή overflow των strings? τι κάνει αυτή η fgets? Εννοώ πως με την scanf() δεν έχεις έλεγχο για το μέγιστο πλήθος χαρακτήρων που θα διαβαστούν μέσα στο string σου, οπότε αν π.χ. σου δώσει ο χρήστης επίθετο με χαρακτήρες περισσότερους από MAXLEN_EPITHETO-1 το πρόγραμμά σου θα κρασάρει. Η fgets() σε επιτρέπει να κοντρολάρεις το μέγιστο πλήθος χαρακτήρων που θα αναγνωστούν (αν και κρατάει και το ENTER που πατάει ο χρήστης, οπότε πρέπει να πας το σβήσεις). Στο link της υπογραφής μου εξηγώ όσο πιο απλά μπορώ τα περί strings στη C. εν το μεταξύ όταν πατάω compile δεν μου κάνει κανένα παράπονο παρά μου βγάζει μια μπάρα δεξιά που λέει test.exe και από κάτω έχει τα source files τα οποία ανήκουν στο test.exe και το test.exe είναι άφαντο! που θα βρω το εκτελέσιμο αρχείο μου? Δεν καταλαβαίνω τι εννοείς. Ένα screen-shot θα βοηθούσε. Μήπως το πρόγραμμα το γράφεις ως Widows project αντί για Console project?
stavros100 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 γεια σας παιδια . θα ήθελα τιν βοήθεια σας αν μπορεί κάποιος να μου απαντήσει.. εχω το προγραμματακι το winrar που συμπιέζει αργεια, και θελω να συμπιέσω κατι ταινιες που εχω για να μιν μου πιανει πολυ χορο . εχω συμπιέσει μερικές αλλα βλεπω οτι εχει τιν ίδια χωρητικότητα απο αυτη που ειχε πριν .. γιατι το κανει αυτο; μηπως δεν κανω κατι καλα;
migf1 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 [offtopic] γεια σας παιδια . θα ήθελα τιν βοήθεια σας αν μπορεί κάποιος να μου απαντήσει.. εχω το προγραμματακι το winrar που συμπιέζει αργεια, και θελω να συμπιέσω κατι ταινιες που εχω για να μιν μου πιανει πολυ χορο . εχω συμπιέσει μερικές αλλα βλεπω οτι εχει τιν ίδια χωρητικότητα απο αυτη που ειχε πριν .. γιατι το κανει αυτο; μηπως δεν κανω κατι καλα; Η ερώτηση αυτή είναι off-topic γα το συγκεκριμένο νήμα (δεν έχει σχέση με C, ούτε καν με προγραμματισμό). Οι ταινίες είναι ήδη συμπιεσμένες (divx/mpeg4, κλπ) οπότε δεν υπάρχει περιθώριο για άλλη συμπίεση. [/offtopic]
katsikoula Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 Για να μπορώ να το χρησιμοποιώ κατόπιν ως τύπο όταν ορίζω μεταβλητές (την tilkat[30] σε αυτή την περίπτωση, τόσο στη main() όσο και στα ορίσματα των συναρτήσεων), χωρίς να χρειάζεται να γράφω και τη λέξη struct μπροστά δεν το ήξερα αυτό, αρκετά βολικό. Εννοώ πως σε κάποια σημεία ορίζεις μεταβλητές char αλλά προσπαθείς να τις διαβάσεις ως strings στην scanf, αλλού προσπαθείς να συγκρίνεις char με string, κλπ.Τα strings δεν δηλώνονται ως char, αλλά ως char[ ] (ή ως char *) δηλαδή πίνακες από char, και πρέπει να εξασφαλίσεις πως ανά πάσα στιγμή θα περιέχουν τουλάχιστον έναν μηδενικό χαρακτήρα '\0'. σωστά τον είχα ξεχάσει τελείως τον τρόπο δήλωσης των strings. δεν τα έχω δουλέψει και αρκετά... Όλα αυτά ανήκουν στις στοιχειώδεις γνώσεις τις γλώσσας, πράγμα που με κάνει να αναρωτιέμαι αν έχεις διαβάσει τα βασικά της γλώσσας πριν ξεκινήσεις να γράφεις το πρόγραμμα. δεν έχω διαβάσει τίποτα απλά αρκούμαι σε αυτά που μας μαθαίνουν στο ΤΕΙ που από ότι φαίνεται δεν είναι αρκετά... Για τη χρήση του keyword void, έτσι επιτάσσει η γλώσσα από την αναθεώρηση C89 και μετά (ANSI standard). Αυτό που έχεις στον δικό σου κώδικα είναι από την προ-ANSI εποχή (1989 και πριν) ... για αυτό άλλωστε και η Pelles-C σου βγάζει σχετικά warnings σε εκείνα τα σημεία, αναφερόμενη σε "old style". αυτό παρ' όλο που είχα ρωτήσει τον καθηγητή που μας διδάσκει το μάθημα μου είχε απαντήση πως δεν έχει καμία απολύτως σημασία... Για τον δείκτη του plithos στην do_eisagwgi(), είναι απαραίτητη η χρήση του, αλλιώς το όρισμα plithos δεν θα διατηρήσει τη νέα τιμή που του αναθέτει η συνάρτηση μέσα της. να γίνω λίγο σπαστικός και να ρωτήσω γιατί ισχύει κάτι τέτοιο? Στο link της υπογραφής μου εξηγώ όσο πιο απλά μπορώ τα περί strings στη C. τέλεια! θα του ρίξω μια ματιά. Δεν καταλαβαίνω τι εννοείς. Ένα screen-shot θα βοηθούσε. Μήπως το πρόγραμμα το γράφεις ως Widows project αντί για Console project? το πρόγραμμα το γράφω σε Win32 Console program (exe) αλλά το δοκίμασα και σε console application wizards (όπως προτίνουν μερικοί στο internet) και βγάζει το εξής error: POLINK: fatal error: File not found: 'advapi32.lib'. και πάλι σε ευχαριστώ πάρα πολύ για την μέχρι τώρα βοήθεια σου.
migf1 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 ... να γίνω λίγο σπαστικός και να ρωτήσω γιατί ισχύει κάτι τέτοιο? ... Γιατί στη C υπάρχει μόνο μια μέθοδος περάσματος ορισμάτων σε συναρτήσεις, η by value (δηλαδή στις συναρτήσεις περνάνε αντίγραφα των μεταβλητών που αντιστοιχούν στα ορίσματα, και όχι οι αυθεντικές μεταβλητές). By reference πέρασμα επιτυγχάνεις περνώντας τις διευθύνσεις των μεταβλητών κατά την κλήση της συνάρτησης στον caller, και ορίζοντας ως δείκτες τα ορίσματα που τους αντιστοιχούν, στη λίστα παραμέτρων του ορισμού της συνάρτησης. Και φυσικά διαχειρίζοντάς τα επίσης ως δείκτες μέσα στη συνάρτηση. το πρόγραμμα το γράφω σε Win32 Console program (exe) αλλά το δοκίμασα και σε console application wizards (όπως προτίνουν μερικοί στο internet) και βγάζει το εξής error: POLINK: fatal error: File not found: 'advapi32.lib'. και πάλι σε ευχαριστώ πάρα πολύ για την μέχρι τώρα βοήθεια σου. Δεν μπορώ να καταλάβω τι ακριβώς συμβαίνει. Φτιάξε ένα φρέσκο Win32-Console project που να περιέχει μονάχα το test.c. Δεν χρειάζεται κάτι άλλο.
katsikoula Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 Δεν μπορώ να καταλάβω τι ακριβώς συμβαίνει. Φτιάξε ένα φρέσκο Win32-Console project που να περιέχει μονάχα το test.c. Δεν χρειάζεται κάτι άλλο. το δοκίμασα αυτό 4 φορές!!! τεσπα, θα δοκιμάσω reinstall και αν δεν δουλέψει και πάλι θα αναγκαστώ να εγκαταστήσω το απαισιότατο DevC++
migf1 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 το δοκίμασα αυτό 4 φορές!!! τεσπα, θα δοκιμάσω reinstall και αν δεν δουλέψει και πάλι θα αναγκαστώ να εγκαταστήσω το απαισιότατο DevC++ Σου είχα προτείνει παλιαότερα να μη βιαστείς να βάλεις την έκδοση 7.0 rc2 μέχρι να γίνει τουλάχιστον rc4. Ίσως είναι εκεί το πρόβλημα (δεν ξέρω, υποθέσεις κάνω). Εγώ πάντως έχω παραμείνει στην 6.50 rc4 και στα 2 μηχανάκια μου.
katsikoula Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 Σου είχα προτείνει παλιαότερα να μη βιαστείς να βάλεις την έκδοση 7.0 rc2 μέχρι να γίνει τουλάχιστον rc4. Ίσως είναι εκεί το πρόβλημα (δεν ξέρω, υποθέσεις κάνω). Εγώ πάντως έχω παραμείνει στην 6.50 rc4 και στα 2 μηχανάκια μου. και όμως έχεις δίκιο. έτρεξε κανονικά με την 6.50 rc4!!! είναι δυνατόν να κυκλοφορούν ένα πρόγραμμα (ανεξαρτήτου έκδοσης) που ο compiler του είναι πρακτικά άχρηστος? μα τόσο ανεύθυνοι είναι??? :S όπως και να έχει σε ευχαριστώ για την συνολική σου βοήθεια!
migf1 Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 Βασικά δεν είναι ανεύθυνοι (αν δεν απατώμαι είναι ένας μόνο άνθρωπος). Το αναγράφει εξαρχής στη σελίδα των Downloads πως η προτεινόμενη έκδοση είναι η 6.50: "Current version is 6.00, but stable version 6.50 is recommended. New release candidate is 7.00."
katsikoula Δημοσ. 28 Μαΐου 2012 Μέλος Δημοσ. 28 Μαΐου 2012 Βασικά δεν είναι ανεύθυνοι (αν δεν απατώμαι είναι ένας μόνο άνθρωπος). Το αναγράφει εξαρχής στη σελίδα των Downloads πως η προτεινόμενη έκδοση είναι η 6.50: "Current version is 6.00, but stable version 6.50 is recommended. New release candidate is 7.00." αν είναι μόνο ένας άνθρωπος πάω πάσο. δεν πρέπει να είναι και τόσο εύκολο για έναν άνθρωπο να φτιάχνει ένα τέτοιο πρόγραμμα και να το αναβαθμίζει κιόλας...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα