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

Τι κάνω λάθος;; (Διάβασμα από δυαδικό αρχείο στη C)


Dinos_12345

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

To int **NewMat είναι λάθος στο read_file, Δεν θες τις τιμές του πίνακα NewMat. Βασικά ρίχνεις το πίνακα του Malloc, στο πρώτο στοιχείο του NewMat. Περνάς το πινακά σου με &Array, οπότε θα έχεις ένα int *NewMat, και όλα θα είναι οκ...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 77
  • Δημ.
  • Τελ. απάντηση

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

Ούτε και C λοιπόν!!!

 

Βασικά, για μία ακομα φορά γράφεις εντελώς λάθος πράγματα. Μα εντελώς λάθος!

 

Το "πίνακας του malloc " είναι τρομερό! Literally.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

int array_prep(int** array,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!=1&&choice!=2){

printf("What do you want to do?\n\n1. Create new array\n2. Load array from file\n" );

scanf("%d",&choice);

}

if(choice==1){

printf("Give the size of the array ");

int size;

scanf("%d",&size);

*array=mkArray(size,OA,OB);

return size;

}

else if(choice==2){

printf("Give the filename\n");

char filename[30];

gets(filename);

int size=read_file(filename,&array);

return size;

}

}

Και την καλώ με

int *A;

int size=array_prep(&A,OA,OB);

Λειτουργεί χωρίς να αλλάξω τίποτα άλλο.

 

Μου μένει να περάσω πάλι αναφορά στον A στο μενού και να βάλω να δέχεται διπλό δείκτη στη δήλωση... Αν και τρέχει και έτσι απλά περνάει αντίγραφο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στην MENU δεν θέλεις διπλό δείκτη. Εάν θέλεις, θα πρότεινα να σκεφτείς καλύτερο όνομα της function ( και γιατί τέτοιο capitalization αλήθεια; )

Επίσης, τι εννοείς με το "απλά περνάει αντίγραφο";

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γράψε λάθος, αφού δίνουμε int* για τον πίνακα περνάει by reference. Τι καλυτερο μπορώ να βάλω για αυτό; Για τα κεφάλαια δεν υπάρχει λόγος, εκτός του ότι θέλω να την ξεχωρίζω μέσα στις 10 συναρτήσεις που έχω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γράψε λάθος, αφού δίνουμε int* για τον πίνακα περνάει by reference. Τι καλυτερο μπορώ να βάλω για αυτό; Για τα κεφάλαια δεν υπάρχει λόγος, εκτός του ότι θέλω να την ξεχωρίζω μέσα στις 10 συναρτήσεις που έχω.

 

 

Καλύτερο ως προς τι; 

 

 

Έχεις ένα συγκεκριμένο task το οποίο, βάσει του κώδικα που έχεις στήσει, γίνεται με συγκεκριμένο τρόπο. Οπότε, ως προς τι καλύτερο; 

 

 

Το θέμα σου ήταν ότι αρχικοποιούσες έναν δείκτη σε ακεραίους, τον A. Αυτός έδειχνε (το πιο πιθανό) στο address 0x00 όταν τον έτρεχες μέσω IDE και σε κάποιο τυχαίο (μάλλον) όταν τον έτρεχες εκτός (αυτό μπορεί να μην ισχύει λόγω νέων προτύπων της C.. φαντάζομαι ότι ο imitheos θα έχει καλύτερη άποψη για το θέμα). 

 

Αυτόν τον δείκτη τον περνούσες σε συνάρτηση as is. Δηλαδή, by value του δείκτη όμως. Μετά, έβαζες τον δείκτη αυτόν να δείχνει σε μία περιοχή μνήμης που εκχωρούσες μέσα στις συναρτήσεις σου. Μέχρι εκεί δούλευε. Όταν τελείωνες τις συναρτήσεις και επιστρέφοντας στην main, ο δείκτης έδειχνε πάλι στο 0x00 (ή όπου έδειχνε κατά την αρχική αρχικοποίηση). Το τελευταίο status του δείκτη περνούσες στην MENU. 

 

Τέλος, full caps στην C είθισται να γράφουμε directives για pre-processor και όχι functions. Το πρόγραμμά σου θα λειτουργεί και με κεφαλαία (ήτοι, MENU) αλλά είναι λάθος πρακτική. 

 

Υ.Γ. Φαντάζομαι να καταλαβαίνεις πόσο λάθος είναι κάτι προτάσεις που παίξανε, π.χ.: 

 

To int **NewMat είναι λάθος στο read_file, Δεν θες τις τιμές του πίνακα NewMat. Βασικά ρίχνεις το πίνακα του Malloc, στο πρώτο στοιχείο του NewMat. Περνάς το πινακά σου με &Array, οπότε θα έχεις ένα int *NewMat, και όλα θα είναι οκ...

Υ.Γ.2 Εάν θέλεις κάτι πιο advanced, δοκίμασε να κρατάς τα δεδομένα για το file που θέλεις σε ένα struct. Επίσης, δοκίμασε να ορίσεις function pointers χρησιμοποιώντας τον τύπο δεδομένων που θα ορίσεις και θα ομαδοποιεί την γνώση που χρειάζεσαι για το file. Μετά, με το function pointer που θα έχεις (θαρρώ ένα is enough) θα ορίσεις συναρτήσεις οι οποίες θα παίρνουν τον τύπο δεδομένων που αντιπροσωπεύει το αρχείο σου και θα κάνουν ό,τι πρέπει η κάθε μία.

 

Αυτό θα σε φέρει πιο κοντά στο OO σε C. Εάν ψάξεις λίγο στο www και για ελληνικές πηγές, το πιο πιθανό είναι να πέσεις και σε δικά μου κείμενα ;)

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

 

Καλύτερο ως προς τι; 

 

 

Έχεις ένα συγκεκριμένο task το οποίο, βάσει του κώδικα που έχεις στήσει, γίνεται με συγκεκριμένο τρόπο. Οπότε, ως προς τι καλύτερο; 

 

 

Μάλλον λάθος δικό μου που είπα στην προηγούμενη σελίδα ότι η MENU είναι διεπαφή με το χρήστη. Όπως λέει και το όνομα, εμφανίζει ένα μενού και για κάθε επιλογή καλεί μια συνάρτηση και δίνει feedback. 

 

 Αυτόν τον δείκτη τον περνούσες σε συνάρτηση as is. Δηλαδή, by value του δείκτη όμως. Μετά, έβαζες τον δείκτη αυτόν να δείχνει σε μία περιοχή μνήμης που εκχωρούσες μέσα στις συναρτήσεις σου. Μέχρι εκεί δούλευε. Όταν τελείωνες τις συναρτήσεις και επιστρέφοντας στην main, ο δείκτης έδειχνε πάλι στο 0x00 (ή όπου έδειχνε κατά την αρχική αρχικοποίηση). Το τελευταίο status του δείκτη περνούσες στην MENU. 

Αυτό το πρόβλημα υπήρχε, που έστελνα το value του δείκτη στο array_prep και δεν μου επέστρεφε το array γεμισμένο. Λύθηκε με διπλό pointer. Πλεόν η MENU δέχεται τον αλλαγμένο pointer, και όλα καλά. Λέω όμως μήπως πρέπει να περάσω διπλό pointer και στην MENU για να επιστραφούν ότι αλλαγές γίνουν μέσα στη συνάρτηση;(Δεν έχει και πολύ νόημα, επειδή την έχω σα reference point για να κάνω άλλα πράγματα, συνεπώς δεν την αλλάζω, αλλά μήπως είναι σωστότερο αλγοριθμικά;)

 

 Τέλος, full caps στην C είθισται να γράφουμε directives για pre-processor και όχι functions. Το πρόγραμμά σου θα λειτουργεί και με κεφαλαία (ήτοι, MENU) αλλά είναι λάθος πρακτική. 

Δεν το ήξερα, επίσης δεν έχω μάθει για directives και pre-processors

 

Υ.Γ. Φαντάζομαι να καταλαβαίνεις πόσο λάθος είναι κάτι προτάσεις που παίξανε, π.χ.: 

 

 

Υ.Γ.2 Εάν θέλεις κάτι πιο advanced, δοκίμασε να κρατάς τα δεδομένα για το file που θέλεις σε ένα struct. Επίσης, δοκίμασε να ορίσεις function pointers χρησιμοποιώντας τον τύπο δεδομένων που θα ορίσεις και θα ομαδοποιεί την γνώση που χρειάζεσαι για το file. Μετά, με το function pointer που θα έχεις (θαρρώ ένα is enough) θα ορίσεις συναρτήσεις οι οποίες θα παίρνουν τον τύπο δεδομένων που αντιπροσωπεύει το αρχείο σου και θα κάνουν ό,τι πρέπει η κάθε μία.

 

Αυτό θα σε φέρει πιο κοντά στο OO σε C. Εάν ψάξεις λίγο στο www και για ελληνικές πηγές, το πιο πιθανό είναι να πέσεις και σε δικά μου κείμενα ;)

Για το 1, ναι το κατάλαβα, λάθη γίνονται, γιαυτό είναι τα forum για να μαθαίνει ο ένας από τον άλλο.

Για το 2. Κάτσε να κάνω master τα βασικά και βλέπουμε για τα υπόλοιπα. Για να καταλάβεις, έχω ασχοληθεί τόσο με Ruby, Js που το σκεπτικό της C και C++ με τη διαχείριση μνήμης, τους pointers κλπ, μου είναι λίγο ξένο. Προσπαθώ όσο μπορώ, ειδικά με τη C++, να τα καταλάβω γιατί είναι χρήσιμο εργαλείο και γνώση. Επειδή με τους pointers στο 1ο εξάμηνο δεν είχαμε και πολύ επαφή, ο καθηγητής που μου κάνει C++ και Data structures είπε να μας κάνει ένα γερό μάθημα στους pointers, ελπίζω μετά από αυτό να έχω καλύτερη αντίληψη τους.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για την MENU και το κατά πόσο πρέπει ή δεν πρέπει να παίρνει τι, δεν μπορώ να σου απαντήσω γιατί το μόνο που είδα είναι λίγες γραμμές κώδικα.

 

Αυτό όμως που μπορώ να σου πω είναι ότι εάν μπλέξεις εμφάνιση με τροποποίηση τότε θα έχεις μεγαλύτερη δυσκολία στο να χειριστείς τα πράματα.

 

 

Τέλος, τώρα που έμαθες για το capitalization άλλαξέ το στην MENU. ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για την MENU και το κατά πόσο πρέπει ή δεν πρέπει να παίρνει τι, δεν μπορώ να σου απαντήσω γιατί το μόνο που είδα είναι λίγες γραμμές κώδικα.

 

Αυτό όμως που μπορώ να σου πω είναι ότι εάν μπλέξεις εμφάνιση με τροποποίηση τότε θα έχεις μεγαλύτερη δυσκολία στο να χειριστείς τα πράματα.

 

 

Τέλος, τώρα που έμαθες για το capitalization άλλαξέ το στην MENU. ;)

Check, τώρα δεν θέλω να γίνω κουραστικός να σου εξηγήσω τι κάνει το πρόγραμμα ακριβώς αλλά, για κάθε πράγμα που γίνεται, πχ Binary search, υπάρχει συνάρτηση, και το μενού κάνει αυτό.

if (choice==1){
      printf("Give a number ");
      int num;
      scanf("%d",&num);
      int pos=LinearSearch(array,size,num);
      if(pos==-1) printf("Number not found\n");
      else printf("Found in position %d\n",pos+1);
    }

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@Dinos_12345

Θέλω να δω το πρόγραμμα μετά ολοκληρωμένο...(να καταλάβω τη διόρθωση), γιατί και εγώ δεν ξέρω καλά, απλά προτάσεις πέταγα..αφού είχες το πρόγραμμα για να το τσεκάρεις! Για να μάθω και εγώ!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ok το είδα. Έκανες την int** Array και μετά της δίνεις το πίνακα τυχαίων ως *Array, και παρακάτω στην άλλη επιλογή περνάς την Array ως έχει στην read_file(), όπου εκεί δηλώνεις ότι είναι δείκτης σε δείκτη, και συνεχίζεις να βάζεις στο πρώτο δείκτη το κενό πίνακνα από την Malloc..οπότε τώρα γυρνάει!

Σε έσωσε αυτό:  int array_prep(int** array,int OA,int OB) 

ενώ έδεινες αυτό: int array_prep(int* array,int size,int OA,int OB) (το int size το κάνεις πια μέσα)

Προφανώς η ιδέα μου για το NewMat με το * δεν ήταν σωστή, αλλά το άλλο που είχε μείνει ήταν να έρθει στα ίσα από την πλευρά του Array!

Οκ. ευχαριστώ για την αποστολή του κώδικα.

(εγώ έκανα την περιγραφή για εκείνον που στο τέλος θα αναρωτηθεί για το πώς λύθηκε..)

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ιδέες με το τσουβάλι. Το θέμα είναι κανείς να ξέρει και να λέει. Επίσης, να ξέρει ότι απλά "έχει ιδέες" και να μην μιλάει, ειδικά σε τεχνικά αντικείμενα.

 

 

Εάν είναι δυνατόν, άνθρωπος που ξέρει 5 πράματα στη C να προτείνει int* σε function που θα θέλει να κάνει allocation μνήμη στον int*.

 

 

Εισαγωγικά προγραμματισμού σε κάθε σχόλη, στο 1το εξάμηνο. Άλλο scope μέσα στη function.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στη C είμαι ακόμα μαθητής. Δεν την χρησιμοποιώ. Απλά εδώ χώθηκα στη συζήτηση, με ιδέες, έτσι από περιέργεια να δω αν καταφέρω κάτι. Για το λόγο αυτό του πρότεινα του Dinos_12345 να δοκιμάσει. Αν εσύ ήξερες τη λύση να την έδινες να τελείωνε η συζήτηση. Εφόσον το άφησες για να το βρει ο άλλος, εγώ τον βοήθησα ακόμα και με λάθος πρόταση. Διότι την τσέκαρε και την απέκλεισε!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στη C είμαι ακόμα μαθητής. Δεν την χρησιμοποιώ. Απλά εδώ χώθηκα στη συζήτηση, με ιδέες, έτσι από περιέργεια να δω αν καταφέρω κάτι. Για το λόγο αυτό του πρότεινα του Dinos_12345 να δοκιμάσει. Αν εσύ ήξερες τη λύση να την έδινες να τελείωνε η συζήτηση. Εφόσον το άφησες για να το βρει ο άλλος, εγώ τον βοήθησα ακόμα και με λάθος πρόταση. Διότι την τσέκαρε και την απέκλεισε!

Μία ακόμα φοβερή επιχειρηματολογία... "Δεν ξέρω τι φταίει, δεν ξέρω από την γλώσσα... ΑΛΛΑ! θα πω ό,τι μου κατέβει στο κεφάλι μπας και".

 

 

Επίσης, είναι ακόμα πιο προσοδοφόρο για γέλια το γεγονός πως ο OP κατάλαβε τι έγραψα, το υιοθέτησε, του έλυσε το πρόβλημα αλλά εσύ επιμένεις ότι δεν έγινε τίποτα! Εφόσον διαβάζεις τα μηνύματά μου, τότε είναι ασφαλές συμπέρασμα το ότι δεν κατάλαβες ούτε τι πρότεινα αλλά ούτε και τι έγινε εν γένει. Αυτό δεν είναι κάτι μεμπτό. Σε αντίθεση με το γεγονός πως ενώ δεν ξέρεις συνεχίζεις και πετάς ιδέες αντί για το ειλικρινές "παίδες, δεν πήρα χαμπάρι. Κάποιος να μου το κάνει φραγκοδίφραγκα;".

 

 

Τέλος, εσύ δεν είχες πει ότι με έχεις σε ignore; Ούτε αυτά που γράφεις δεν τηρείς;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...