Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας σκοπος του προγραμματος πραξη πινακων..οι πινακες διαβαζονται μεσω αρχειων που υποδικνυει ο χρηστης...εμενα κρασαρει οταν μεσα στην συναρτηση παω να διαβασω τον πινακα
 

#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);
                    }
                }

                }


Δημοσ.

Για ποια συνάρτηση μιλάς;

Επίσης, έχεις επιβεβαιώσει ότι διαβάζεις ένα αρχείο που έχει αποθηκευτεί σωστά;

Δημοσ.

Διόρθωσε τη στοίχηση πρώτα για να γίνει πιο εύκολη η ανάγνωση του κώδικά σου.

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;
        ...
}
Δημοσ.

gon1332 thx for the tip :)

εχω αποθηκευσει ενα αρχειο τχτ το οποιο το εχω ετσι: 10 10

                                                                                       2   2

για το δυσιδιαστατο..για μονοδιαστατο ειναι το ενα κατω απο το αλλο...

 

*μου κρασαρει στις συναρτησεισ array_read kai vector_read

και οι 2 ειναι για να διαβασουν πινακες απο αρχειο η μια για μονοδιαστατο και η αλλη για δυσδιαστατο

Δημοσ. (επεξεργασμένο)

Κάτι που βλέπω στα γρήγορα είναι ότι η fscanf χρειάζεται pointer για τρίτο όρισμα, και εσύ της περνάς float.

Δοκίμασε:

fscanf(f, "%f", &pinakasmonos[i]);

(Επίσης στις *_write() κάνεις το αντίστροφο, διόρθωσε το κι αυτό...)

Επεξ/σία από geomagas
Δημοσ.

Με ποια 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, η οποία παίρνει σαν όρισμα το όριο χαρακτήρων που θέλεις να διαβάσεις.

Δημοσ.

Πάντα να ακολουθείς αυτό που σου πρότεινε ο 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)
  • Like 1
Δημοσ.

Απλώς να προσθέσω πως το -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);
 
Δημοσ.

Απλώς να προσθέσω πως το -Wextra (μαζί με το -Wall) στα compiler flags του gcc σου βγάζει ακόμα περισσότερες προειδοποιήσεις (ή τουλάχιστον έβγαζε μέχρι την έκδοση που έχω, γιατί δεν τον έχω ενημερώσει). Επίσης το -pedantic τον κάνει να παραπονιέται αν ο κώδικας ξεφεύγει από τα στάνταρ της γλώσσας

 

To -Wextra ακόμη υποστηρίζεται, απλά μέσα σε όλα τα warnings που θα εμφανίσει το -Wall στον παραπάνω κώδικα, το -Wextra θα καταστήσει αδύνατο να βγάλεις κάποια άκρη. :P

 

Μία ερώτηση:

Το -pedantic υποστηρίζει μόνο το standard C89 - C90. Έτσι;

Δημοσ.

Έχω την εντύπωση πως το -Wextra βγάζει σημαντικές ειδοποιήσεις, αν και δεν θυμάμαι τώρα απ' έξω λεπτομέρειες.

Ομοίως και για το -pedantic, δεν θυμάμαι απ΄ έξω αλλά νομίζω υποστηρίζει οποιοδήποτε στάνταρ έχεις περάσει με το -std= στον compiler.

Δημοσ.

Όπως τα λέει ο 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]

Δημοσ.

Ευχαριστω για ολα τα τιπσ!!! Το προγραμμά εχει καποια λαθακια σε θεμα λογικης οπως ειπε ο imitheos... Ευχαριστώ ολους για την βοηθεια :)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...