nikos134 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Γεια σας σκοπος του προγραμματος πραξη πινακων..οι πινακες διαβαζονται μεσω αρχειων που υποδικνυει ο χρηστης...εμενα κρασαρει οταν μεσα στην συναρτηση παω να διαβασω τον πινακα #include <stdio.h> #include <stdlib.h> #define max 100 int vector_read(int s, float pinakas[max], FILE *f); int array_read(int s, float pinakasA[max][max], FILE *f); int vector_write(int s, float pinakasW[max], FILE *f); int array_write(int s, float pinakasAW[max][max], FILE *f); int main() { int sum; // gia eswteriko ginomeno int i,j; //metrites int arithmos; //pollaplasiasmos pianka char fname[100], fnameB[100], fnameC[100]; //gia to diabasma ar xeiou FILE *f, *f1, *f3; int d; //megethos pinaka int praksi;//epilogi praksi mesw switch float pinakasA[max][max], pinakasB[max][max], apotelesmataA[max][max];//oi pinakes pou xreiazonte float pinakasmonosA[max], pinakasmonosB[max], apotelesmatamonos[max]; printf("Poso megethos tha eina to megethos tou pinaka?\n"); scanf("%d", &d);//diabazei apo ton xristi to megethos tou pinaka printf("ti praksi thes na kaneis?\n 1.prosthesi pinakwn\n 2.afairesi pinakwn\n 3.pollapkasiasmos pinaka (nxn) me arithmo\n 4.eswteriko ginomeno pinaka\n 5.pollapkasiasmos pinaka (n) me arithmo\n 6.polaplasiasmo pinaka epi pinaka (nxn)\n 7.anastrofi pinaka (nxn)\n"); scanf("%d",&praksi);//diabazei thn praksi pou thelei na kanei o xristis fflush(stdin); switch(praksi){ case 1 :{ printf("Proshtesi pinakwn...\n"); //prosthesi 2 pinakwn monodiastatwn printf("Onoma arxeiou gia pinaka a : ");//kai oi 2 diabazonte mesa apo arxeia me thn boitheia sinartisis printf("\n"); gets(fname);//diabazei to onoma f=fopen(fname,"r");//anoigei to arxeio array_read(d, pinakasA,f);//h synartisi gia to diabasma tou arrxeiou printf("Onoma arxeiou gia pinaka b : "); printf("\n"); gets(fnameB);int vector_wright(int d, float[max], FILE *f); f1=fopen(fname, "r"); array_read(d,pinakasB,f1); for(i=0; i<d; i++ ){ for(j=0; j<d; j++){ apotelesmataA[i][j]=pinakasA[i][j]+pinakasB[i][j]; printf("%4.1f", apotelesmataA[i][j]); } printf("\n"); } printf("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3=fopen(fnameC, "w"); array_write(d, apotelesmataA, f3);//apothikeusi tou pinaka apotelesmatwn se arxeio me thn xrisi sinartisisi break; } case 2 : { printf("Afairesi pinakwn..."); printf("Onoma arxeiou gia pinaka a : "); printf("\n"); gets(fname); f=fopen(fname,"r"); array_read(d,pinakasA,f); printf("Onoma arxeiou gia pinaka b : "); printf("\n"); gets(fnameB); f1=fopen(fname, "r"); array_read(d,pinakasB,f1); for(i=0; i<d; i++ ){ for(j=0; j<d; j++){ apotelesmataA[i][j]=pinakasA[i][j]-pinakasB[i][j]; printf("%4.1f", apotelesmataA[i][j]); } printf("\n"); } printf("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3=fopen(fnameC, "w"); array_write(d, apotelesmataA, f3); break; } case 3 :{ printf("Pollaplasiasmos arithmos me pinaka(nxn)"); printf("dwsmou arithmo pou tha pollaplasiasw\n"); scanf("%d", &arithmos); printf("Onoma arxeiou gia pinaka a : "); printf("\n"); fflush(stdin); gets(fname); f=fopen(fname,"r"); array_read(d,pinakasA, f); for(i=0; i<d; i++ ){ for(j=0; j<d; j++){ apotelesmataA[i][j]=arithmos*pinakasA[i][j]; printf("%4.1f", apotelesmataA[i][j]); } printf("\n"); } printf("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3=fopen(fnameC, "w"); array_write(d, apotelesmataA, f3); break; } case 5 :{ printf("Pollaplasiasmos arithmos me pinaka (n) \n"); printf("Onoma arxeiou gia pinaka a : "); printf("\n"); fflush(stdin); gets(fname); f=fopen(fname,"r"); vector_read(d,pinakasmonosA,f); printf("dwsmou arithmo pou tha pollaplasiasw\n"); scanf("%d", &arithmos); for(i=0; i<d; i++ ){ apotelesmatamonos[i]=arithmos*pinakasmonosA[i]; printf("%4.1f", apotelesmatamonos[i]); } printf("\n"); printf("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3=fopen(fnameC, "w"); array_write(d, apotelesmatamonos, f3); break; } case 4 :{ printf("Eswteriko ginomeno pinakwn"); printf("Onoma arxeiou gia pinaka a : "); printf("\n"); gets(fname); f=fopen(fname,"r"); vector_read(d,pinakasmonosA,f); printf("Onoma arxeiou gia pinaka b : "); printf("\n"); gets(fnameB); f1=fopen(fname, "r"); vector_read(d,pinakasmonosB,f1); sum=0; for(i=0; i<d; i++ ){ sum=sum+pinakasmonosA[i]*pinakasmonosB[i]; } break; } case 7 : { printf("Anastrofi pinaka!!\n"); printf("Onoma arxeiou gia pinaka a : "); printf("\n"); gets(fname); f=fopen(fname, "r"); array_read(d,pinakasA,f); for(i=0; i<d; i++){ for(j=0; j<d; j++){ apotelesmataA[i][j]=pinakasA[j][i]; printf("%4.1f",pinakasA[j][i]); } } printf("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3=fopen(fnameC, "w"); array_write(d, apotelesmataA, f3); break; } case 6 : { printf("Pollaplasiasmos pinaka epi pinaka!!\n"); printf("Onoma arxeiou gia pinaka a : "); printf("\n"); gets(fname); f=fopen(fname, "r"); array_read(d,pinakasA,f); printf("Onoma arxeiou gia pinaka b : "); printf("\n"); gets(fnameB); f1=fopen(fnameB, "r"); array_read(d,pinakasB, f1); for(i=0; i<d; i++){ for(j=0; j<d; j++){ apotelesmataA[i][j]=pinakasA[i][j]*pinakasB[i][j]; printf("%4.1f",pinakasA[j][i]); } printf("\n"); } printf("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3=fopen(fnameC, "w"); array_write(d, apotelesmataA, f3); break; } fclose(f); fclose(f3); fclose(f1); } return 0; } int vector_read(int s,float pinakasmonos[max],FILE *f){ int i; for (i=0; i<s; i++){ fscanf(f, "%f", pinakasmonos[i]); } } int array_read(int d, float pinakasA[max][max], FILE *f){ int i,j; for(i=0; i<d; i++){ for(j=0; j<d; j++){ fscanf(f, "%f", pinakasA[i][j]); } } } int vector_write(int d, float pinakasmonos[max], FILE *f){ int i; for(i=0; i<d; i++){ fprintf(f,"%f",pinakasmonos); } } int array_write(int d, float pinakasA[max][max], FILE *f ){ int i,j; for(i=0; i<d; i++){ for(j=0; j<d; j++){ fprintf(f, "%f", pinakasA); } } }
geomagas Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Για ποια συνάρτηση μιλάς; Επίσης, έχεις επιβεβαιώσει ότι διαβάζεις ένα αρχείο που έχει αποθηκευτεί σωστά;
gon1332 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Διόρθωσε τη στοίχηση πρώτα για να γίνει πιο εύκολη η ανάγνωση του κώδικά σου. Identation να βάζεις μόνο αμέσως μετά από κάποια δομή if, while, for, do, case, ή μετά από κάποια δήλωση συνάρτησης: /* loops */ for (; { blah; blah; ... } /* if..else */ if () { blah; blah; ... } else if () { blah; blah; ... } else { blah; blah; ... } /* switch */ switch () { case 1: blah; blah; ... case 2: blah; blah; ... ... default:blah; blah; ... } /* functions */ T my_fun() { blah; blah; ... }
nikos134 Δημοσ. 3 Ιανουαρίου 2014 Μέλος Δημοσ. 3 Ιανουαρίου 2014 gon1332 thx for the tip εχω αποθηκευσει ενα αρχειο τχτ το οποιο το εχω ετσι: 10 10 2 2 για το δυσιδιαστατο..για μονοδιαστατο ειναι το ενα κατω απο το αλλο... *μου κρασαρει στις συναρτησεισ array_read kai vector_read και οι 2 ειναι για να διαβασουν πινακες απο αρχειο η μια για μονοδιαστατο και η αλλη για δυσδιαστατο
geomagas Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 (επεξεργασμένο) Κάτι που βλέπω στα γρήγορα είναι ότι η fscanf χρειάζεται pointer για τρίτο όρισμα, και εσύ της περνάς float. Δοκίμασε: fscanf(f, "%f", &pinakasmonos[i]); (Επίσης στις *_write() κάνεις το αντίστροφο, διόρθωσε το κι αυτό...) Επεξ/σία 3 Ιανουαρίου 2014 από geomagas
bird Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Βάλε στην fscanf τη διεύθυνση του πινακα fscanf(f, "%f", &pinakasA[i][j]);
gon1332 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Με ποια flags κάνεις compile τον κώδικα. Για λόγους debugging καλό είναι να εκτελείς μία εντολή της μορφής: gcc -g -Wall my_prog.c -o my_exe Το -g χρησιμεύει για τη δυνατότητα εκτέλεσης debugger πάνω από το εκτελέσιμο, ενώ το -Wall για να σου πετάξει σαν Warning ο,τιδήποτε δεν "κάθεται" καλά στον compiler. Εκτέλεσέ το μία φορά έτσι αν δεν το έχεις κάνει ήδη και πες μας τι σου εμφάνισε. gets(fname);//diabazei to onoma Επίσης για κανένα λόγο δε θα πρέπει να χρησιμοποιείς αυτή τη συνάρτηση. Μάλιστα στις νέες εκδόσεις Ubuntu, το compile δεν ολοκληρώνεται αν την εντοπίσει στον πηγαίο, επειδή δεν είναι ασφαλής. Μία εύκολη αντικατάστασή της είναι η: char name[20]; scanf("%19s", name); /* we use 20-1 also for storing the '\0' */ /* WARNING * Always include the number between %s. In that way * YOU limit the input from the user to the specified number */ Αν χρησιμοποιείς gets, ή scanf χωρίς τον περιορισμό, τότε είναι πολύ πιθανό το πρόγραμμά σου να πέσει θύμα buffer overflow, ακόμη κι από μία δικιά σου απροσεξία. Αν θέλεις να χρησιμοποιήσεις gets, τότε καλύτερα αντικατέστησέ την με την fgets, η οποία παίρνει σαν όρισμα το όριο χαρακτήρων που θέλεις να διαβάσεις.
imitheos Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Πάντα να ακολουθείς αυτό που σου πρότεινε ο gon1332 δηλαδή να ενεργοποιείς στον compiler όλες τις προειδοποιήσεις γιατί θα σε βοηθήσει τρομερά. Τρέχοντας μια φορά τον κώδικα σου ενεργοποιώντας το -Wall αμέσως έδωσε όλα τα λάθη που έχεις (τουλάχιστον τα λάθη που εμποδίζουν το compile). Μια άκακη προειδοποίηση είναι ότι ορίζεις συναρτήσεις να επιστρέφουν ακέραιο αλλά δεν επιστρέφεις τίποτα οπότε μπορείς να τις ορίσεις ως void. Μια δεύτερη προειδοποίηση είναι ότι χρησιμοποιείς την gets ενώ δεν πρέπει όπως σωστά σου τόνισε ο gon1332. Για το πλαίσιο αυτής της άσκησης ας πούμε ότι δεν πειράζει η χρήση της ώστε να μην μπλέξεις ακόμη. @@ -233,7 +233,7 @@ { int i; for (i = 0; i < s; i++) { - fscanf(f, "%f", pinakasmonos[i]); + fscanf(f, "%f", &pinakasmonos[i]); } @@ -248,7 +248,7 @@ for (i = 0; i < d; i++) { for (j = 0; j < d; j++) { - fscanf(f, "%f", pinakasA[i][j]); + fscanf(f, "%f", &pinakasA[i][j]); } } } @@ -257,7 +257,7 @@ { int i; for (i = 0; i < d; i++) { - fprintf(f, "%f", pinakasmonos); + fprintf(f, "%f", pinakasmonos[i]); } @@ -269,7 +269,7 @@ int i, j; for (i = 0; i < d; i++) { for (j = 0; j < d; j++) { - fprintf(f, "%f", pinakasA); + fprintf(f, "%f", pinakasA[i][j]); } } Ένα άλλο λάθος είναι αυτό που σου τόνισε ο geomagas και ο bird δηλαδή δεν βάζεις τη σωστή δήλωση στις scanf και printf όπως φαίνεται παραπάνω. Βάζεις ένα βρόχο που τρέχει την fprintf για κάθε στοιχείο αλλά αντί να του περνάς το εκάστοτε στοιχείο του πίνακα, περνάς όλον τον πίνακα. --- tmp.c.orig 2014-01-03 14:41:55.527765832 +0200 +++ tmp.c 2014-01-03 14:45:14.305778624 +0200 @@ -45,7 +45,7 @@ printf("Onoma arxeiou gia pinaka b : "); printf("\n"); gets(fnameB); - int vector_wright(int d, float[max], FILE * f); + //int vector_wright(int d, float[max], FILE * f); f1 = fopen(fname, "r"); array_read(d, pinakasB, f1); Ίσως έγινε κάποιο λάθος όταν πέρασα τον κώδικα από το indent για να μη μου βγαίνουν τα μάτια αλλά προέκυψε η παραπάνω δήλωση συνάρτησης που δεν έχει κάποιο νόημα. @@ -146,7 +146,7 @@ ("Dwse mou onoma arxeiou gia apothikeusi to kainourgiou pinaka!! \n"); gets(fnameC); f3 = fopen(fnameC, "w"); - array_write(d, apotelesmatamonos, f3); + vector_write(d, apotelesmatamonos, f3); break; } case 4:{ Εδώ τρέχεις την συνάρτηση array_write που χρειάζεται δισδιάστατο πίνακα αλλά της περνάς ένα μονοδιάστατο. Μήπως πρέπει να μπει vector_write ? Δεν κοίταξα καθόλου τον κώδικα για λογικά λάθη οπότε πιθανώς να υπάρχουν και άλλα προβλήματα. Τα παραπάνω είναι όσα βρήκε με την καμμία ο gcc έτσι βλέπεις πόσο χρήσιμη είναι η ενεργοποίηση των προειδοποιήσεων. int vector_read(int s, float pinakas[max], FILE * f); int array_read(int s, float pinakasA[max][max], FILE * f); int vector_write(int s, float pinakasW[max], FILE * f); int array_write(int s, float pinakasAW[max][max], FILE * f); Αυτό δεν είναι λάθος μια και ο καθένας δουλεύει όπως του αρέσει αλλά για ευκολία είθισται να χρησιμοποιούνται ένα από τα δύο κλασικά μοτίβα που φαίνονται παρακάτω: function(buffer, size, file) (πχ fread, fgets, κτλ) function(file, size, buffer) (πχ f*printf) 1
migf1 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Απλώς να προσθέσω πως το -Wextra (μαζί με το -Wall) στα compiler flags του gcc σου βγάζει ακόμα περισσότερες προειδοποιήσεις (ή τουλάχιστον έβγαζε μέχρι την έκδοση που έχω, γιατί δεν τον έχω ενημερώσει). Επίσης το -pedantic τον κάνει να παραπονιέται αν ο κώδικας ξεφεύγει από τα στάνταρ της γλώσσας Και λίγο ακόμα nitpicking στην τελευταία σημείωση του ημίθεου... εφόσον τις ονομασίες των συναρτήσεων σου τις ξεκινάς πρώτα με το όνομα του object που θέλεις να επεξεργαστεί η εκάστοτε συνάρτηση, είθισται να της το περνάς ως 1 όρισμα. Π.χ.... int vector_read( vector, size, file ); ή int vector_read( vector, file, size ); Αν βάλεις πρώτα το action στο όνομα της συνάρτησης, τότε είθισται να περνάμε το object ως τελευταίο όρισμα, π.χ... int read_vector(file, size, vector);
gon1332 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Απλώς να προσθέσω πως το -Wextra (μαζί με το -Wall) στα compiler flags του gcc σου βγάζει ακόμα περισσότερες προειδοποιήσεις (ή τουλάχιστον έβγαζε μέχρι την έκδοση που έχω, γιατί δεν τον έχω ενημερώσει). Επίσης το -pedantic τον κάνει να παραπονιέται αν ο κώδικας ξεφεύγει από τα στάνταρ της γλώσσας To -Wextra ακόμη υποστηρίζεται, απλά μέσα σε όλα τα warnings που θα εμφανίσει το -Wall στον παραπάνω κώδικα, το -Wextra θα καταστήσει αδύνατο να βγάλεις κάποια άκρη. Μία ερώτηση: Το -pedantic υποστηρίζει μόνο το standard C89 - C90. Έτσι;
migf1 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Έχω την εντύπωση πως το -Wextra βγάζει σημαντικές ειδοποιήσεις, αν και δεν θυμάμαι τώρα απ' έξω λεπτομέρειες. Ομοίως και για το -pedantic, δεν θυμάμαι απ΄ έξω αλλά νομίζω υποστηρίζει οποιοδήποτε στάνταρ έχεις περάσει με το -std= στον compiler.
pmav99 Δημοσ. 3 Ιανουαρίου 2014 Δημοσ. 3 Ιανουαρίου 2014 Όπως τα λέει ο migf1 είναι -Wpedantic -pedantic Issue all the warnings demanded by strict ISO C and ISO C++; reject all programs that use forbidden extensions, and some other programs that do not follow ISO C and ISO C++. For ISO C, follows the version of the ISO C standard specified by any -std option used. -pedantic-errors Like -Wpedantic, except that errors are produced rather than warnings. -Wextra This enables some extra warning flags that are not enabled by -Wall. (This option used to be called -W. The older name is still supported, but the newer name is more descriptive.) -Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init -Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall) The option -Wextra also prints warning messages for the following cases: · A pointer is compared against integer zero with <, <=, >, or >=. [truncated]
nikos134 Δημοσ. 3 Ιανουαρίου 2014 Μέλος Δημοσ. 3 Ιανουαρίου 2014 Ευχαριστω για ολα τα τιπσ!!! Το προγραμμά εχει καποια λαθακια σε θεμα λογικης οπως ειπε ο imitheos... Ευχαριστώ ολους για την βοηθεια
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα