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

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

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

Καλησπέρα παίδες, προσπαθώ να διαβάσω από δυαδικό αρχείο στη 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;
}
Επεξ/σία από Dinos_12345
  • Απαντ. 77
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Όταν ανοίγεις το αρχείο παίρνεις τη θέση του δρομέα π.χ. το 1 και διαιρείς με το μέγεθος του ακεραίου. Άρα παίρνεις 0 στο ΝΝ..

Πρόσεξα ότι πας στο τέλος. Λογικά θα πάει στη επόμενη μη υπαρκτή θέση, αλλά θα έχει μονό νούμερο, πρέπει να αφαιρέσεις 1 για να βγεί ζυγό και να το διαιρέσεις με το μέγεθος του ακεραίου...

Δημοσ.

Όταν ανοίγεις το αρχείο παίρνεις τη θέση του δρομέα π.χ. το 1 και διαιρείς με το μέγεθος του ακεραίου. Άρα παίρνεις 0 στο ΝΝ...

Αφού ο fp την στιγμη που τον διαιρώ δείχνει στο τέλος του αρχείου. Το πρόβλημα πρέπει να είναι στην array_prep. Τελικά κατάφερα να το κάνω να μην κρασάρει αλλά όταν βγεί από την array_prep δεν μου έχει κάνει τίποτα στο array A. Δηλαδή τον τυπώνω και είναι κενός, και στις 2 περιπτώσεις της array_prep.

Δημοσ.

Λογικά δεν δείχνει στο τέλος του αρχείου αλλά στο πρώτο byte που θα γράψει, και δεν υπάρχει! (για να γίνει το append, αν με το seek πήγαινες στο τελευταίο byte θα έπρεπε να δώσεις άλλη μια εντολή να πάει ένα byte ακόμα).

Δημοσ.

Βάζε μερικές printf για να καταλάβεις που κολλάει, και τι νούμερα έχεις μέχρι εκεί

Μήπως να έβαζες το ΝΝ να το διαβάζει από το αρχείο;

Αν ήταν txt ναι θα βόλευε, αλλά έστω ότι το λύσαμε αυτό, ούτε η πρώτη περίπτωση του array_prep δουλεύει

Αν δεις στη main, δηλώνω pointer σε integer για το size και περνάω integer στην συνάρτηση, which is stupid, αλλά είναι η μόνη περίπτωση που δεν κρασάρει.

Δημοσ.

Έχω μια απορία. Την 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 για να τυπώσω τον πίνακα κάτω από τις δύο επιλογές, μου εμφάνισε ακριβώς ότι έπρεπε.

Δημοσ.

Στην array_prep πέρνα pointer σε pointer σε int.

 

Τον αφήνεις ως έχει στην main. Τον περνάς με & στην συνάρτηση. Λογικά (θα) σου χτυπάει και η MENU.

 

Να φανταστώ ότι στην MENU τυπώνεις;

Δημοσ.

Στην array_prep πέρνα pointer σε pointer σε int.

 

Τον αφήνεις ως έχει στην main. Τον περνάς με & στην συνάρτηση. Λογικά (θα) σου χτυπάει και η MENU.

 

Να φανταστώ ότι στην MENU τυπώνεις;

Ναι η menu είναι η διεπαφή με το χρήστη, δεν χτυπάει τίποτα... pointer σε pointer int? Σε τι;

Δημοσ.

 

Επίσης η fread σου επιστρέφει τον αριθμό των στοιχείων που διάβασες.

Στην συνάρτηση array-prep. Περνάς την μεταβλητή Α. Όταν τελείωσει η array_prep η τιμή της Α θα είναι αυτή που είχε μέσα στην main. Όχι αυτή που απέκτησε στην συνάρτηση.

Δημοσ.

Επίσης η fread σου επιστρέφει τον αριθμό των στοιχείων που διάβασες.

Στην συνάρτηση array-prep. Περνάς την μεταβλητή Α. Όταν τελείωσει η array_prep η τιμή της Α θα είναι αυτή που είχε μέσα στην main. Όχι αυτή που απέκτησε στην συνάρτηση.

Η Α είναι pointer στο πρώτο στοιχείο του πίνακα. Το όνομα του πίνακα, εξ'ορισμού δεν είναι pointer στο πρώτο στοιχείο του;

Δημοσ.

Επίσης κάνε ένα test. Δες την διεύθυνση του πίνακα όταν τον γεμίζεις (όπου λειτουργεί ο κώδικάς σου) και σύγκρινέ την με την τιμή της μεταβλητής Α αμέσως πριν το πρόγραμμά σου μπει στην MENU.

 

Σου λέω από τώρα ότι θα είναι διαφορετικές διευθύνσεις.

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

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

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

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

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

Σύνδεση

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

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