Dinos_12345 Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 (επεξεργασμένο) Καλησπέρα παίδες, προσπαθώ να διαβάσω από δυαδικό αρχείο στη C και μου κρασάρει το πρόγραμμα. Καμιά ιδέα; Το πρόγραμμα αρχικοποιεί ένα array, N θέσεων με ψευδοτυχαίους αριθμούς από 30 μέχρι 50, εξού και τα OA, OB. Η συνάρτηση read_file επιστρέφει το μέγεθος του array που διάβασε. int main(){ int OA=30; int OB=50; int *A; int *size; array_prep(A,size,OA,OB); MENU(A,size,OA,OB); system("pause"); return 0; } int array_prep(int* array,int size,int OA,int OB){ int choice; printf("What do you want to do?\n\n1. Create new array\n2. Load array from file\n" ); scanf("%d",&choice); fflush(stdin); while(choice!=0){ if(choice==1){ printf("Give the size of the array"); scanf("%d",&size); printf("1"); array=mkArray(size,OA,OB); choice=0; } else if(choice==2){ printf("Give the filename\n"); char filename[30]; gets(filename); int size=read_file(filename,&array); choice=0; } } } int read_file(char *FN, int **NewMat){ int NN; FILE *fp; fp=fopen(FN,"rb"); if(fp==NULL) return 0; fseek(fp,0,SEEK_END); NN=ftell(fp)/sizeof(int); *NewMat=(int*)malloc(NN*sizeof(int)); fseek(fp,0,SEEK_SET); fread(*NewMat,sizeof(int),NN,fp); fclose(fp); return NN; } Επεξ/σία 20 Μαρτίου 2016 από Dinos_12345
M2000 Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 Όταν ανοίγεις το αρχείο παίρνεις τη θέση του δρομέα π.χ. το 1 και διαιρείς με το μέγεθος του ακεραίου. Άρα παίρνεις 0 στο ΝΝ.. Πρόσεξα ότι πας στο τέλος. Λογικά θα πάει στη επόμενη μη υπαρκτή θέση, αλλά θα έχει μονό νούμερο, πρέπει να αφαιρέσεις 1 για να βγεί ζυγό και να το διαιρέσεις με το μέγεθος του ακεραίου...
Dinos_12345 Δημοσ. 20 Μαρτίου 2016 Μέλος Δημοσ. 20 Μαρτίου 2016 Όταν ανοίγεις το αρχείο παίρνεις τη θέση του δρομέα π.χ. το 1 και διαιρείς με το μέγεθος του ακεραίου. Άρα παίρνεις 0 στο ΝΝ... Αφού ο fp την στιγμη που τον διαιρώ δείχνει στο τέλος του αρχείου. Το πρόβλημα πρέπει να είναι στην array_prep. Τελικά κατάφερα να το κάνω να μην κρασάρει αλλά όταν βγεί από την array_prep δεν μου έχει κάνει τίποτα στο array A. Δηλαδή τον τυπώνω και είναι κενός, και στις 2 περιπτώσεις της array_prep.
M2000 Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 Λογικά δεν δείχνει στο τέλος του αρχείου αλλά στο πρώτο byte που θα γράψει, και δεν υπάρχει! (για να γίνει το append, αν με το seek πήγαινες στο τελευταίο byte θα έπρεπε να δώσεις άλλη μια εντολή να πάει ένα byte ακόμα).
Dinos_12345 Δημοσ. 20 Μαρτίου 2016 Μέλος Δημοσ. 20 Μαρτίου 2016 Βάζε μερικές printf για να καταλάβεις που κολλάει, και τι νούμερα έχεις μέχρι εκεί Μήπως να έβαζες το ΝΝ να το διαβάζει από το αρχείο; Αν ήταν txt ναι θα βόλευε, αλλά έστω ότι το λύσαμε αυτό, ούτε η πρώτη περίπτωση του array_prep δουλεύει Αν δεις στη main, δηλώνω pointer σε integer για το size και περνάω integer στην συνάρτηση, which is stupid, αλλά είναι η μόνη περίπτωση που δεν κρασάρει.
M2000 Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 ωχ έγινε μαντάρα το προηγούμενο μήνυμα! σβήστηκε και αλλάχτηκε...αλλά διάβασε το καινούργιο! http://www.codingunit.com/c-tutorial-binary-file-io
Alithinos Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 Έχω μια απορία. Την mkArray την οποία χρησιμοποιείς μέσα στην array_Prep, που τη δηλώνεις ?
M2000 Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 βγάλε το αστεράκι από την NewMat στην Fopen http://stackoverflow.com/questions/22059189/read-a-file-as-byte-array
Dinos_12345 Δημοσ. 20 Μαρτίου 2016 Μέλος Δημοσ. 20 Μαρτίου 2016 Έχω μια απορία. Την mkArray την οποία χρησιμοποιείς μέσα στην array_Prep, που τη δηλώνεις ? int mkArray(int size,int OA,int OB){ int *array=(int *)malloc(sizeof(int)*size); FillArray(array,size,OA, OB); return array; } int MyRand(int OA, int OB){ int diff = OB-OA; int randnum = rand()%diff+OA; return randnum; } int FillArray(int* A,int size,int OA, int OB){ for (int i=0;i<size;i++){ *(A+i)=MyRand(OA,OB); } } βγάλε το αστεράκι από την NewMat στην Fopen http://stackoverflow.com/questions/22059189/read-a-file-as-byte-array Δεν είναι το πρόβλημα η συνάρτηση, ξαναλέω πως ούτε η επιλογή 1 γεμίζει τον πίνακα... Edit: Γεμίζει τους πίνακες κανονικότατα αλλά δεν τους στέλνει πίσω στη main, με 1 loop για να τυπώσω τον πίνακα κάτω από τις δύο επιλογές, μου εμφάνισε ακριβώς ότι έπρεπε.
groot Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 Στην array_prep πέρνα pointer σε pointer σε int. Τον αφήνεις ως έχει στην main. Τον περνάς με & στην συνάρτηση. Λογικά (θα) σου χτυπάει και η MENU. Να φανταστώ ότι στην MENU τυπώνεις;
Dinos_12345 Δημοσ. 20 Μαρτίου 2016 Μέλος Δημοσ. 20 Μαρτίου 2016 Στην array_prep πέρνα pointer σε pointer σε int. Τον αφήνεις ως έχει στην main. Τον περνάς με & στην συνάρτηση. Λογικά (θα) σου χτυπάει και η MENU. Να φανταστώ ότι στην MENU τυπώνεις; Ναι η menu είναι η διεπαφή με το χρήστη, δεν χτυπάει τίποτα... pointer σε pointer int? Σε τι;
groot Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 Επίσης η fread σου επιστρέφει τον αριθμό των στοιχείων που διάβασες. Στην συνάρτηση array-prep. Περνάς την μεταβλητή Α. Όταν τελείωσει η array_prep η τιμή της Α θα είναι αυτή που είχε μέσα στην main. Όχι αυτή που απέκτησε στην συνάρτηση.
Dinos_12345 Δημοσ. 20 Μαρτίου 2016 Μέλος Δημοσ. 20 Μαρτίου 2016 Επίσης η fread σου επιστρέφει τον αριθμό των στοιχείων που διάβασες. Στην συνάρτηση array-prep. Περνάς την μεταβλητή Α. Όταν τελείωσει η array_prep η τιμή της Α θα είναι αυτή που είχε μέσα στην main. Όχι αυτή που απέκτησε στην συνάρτηση. Η Α είναι pointer στο πρώτο στοιχείο του πίνακα. Το όνομα του πίνακα, εξ'ορισμού δεν είναι pointer στο πρώτο στοιχείο του;
groot Δημοσ. 20 Μαρτίου 2016 Δημοσ. 20 Μαρτίου 2016 Επίσης κάνε ένα test. Δες την διεύθυνση του πίνακα όταν τον γεμίζεις (όπου λειτουργεί ο κώδικάς σου) και σύγκρινέ την με την τιμή της μεταβλητής Α αμέσως πριν το πρόγραμμά σου μπει στην MENU. Σου λέω από τώρα ότι θα είναι διαφορετικές διευθύνσεις.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα