painkiller44 Δημοσιεύτηκε Ιανουάριος 14, 2013 #1 Δημοσιεύτηκε Ιανουάριος 14, 2013 Να γράψετε ένα πρόγραμμα το οποίο Θα ζητάει από το χρήστη να δώσει από το πληκτρολόγιο το πλήθος των αριθμών που θέλει να εισάγει, Θα αποθηκεύει τους αριθμούς σε έναν πίνακα, Θα υπολογίζει τον μέσο όρο τους, Θα εμφανίζει στην οθόνη το περιεχόμενο του πίνακα και τον μέσο όρο.πως θα μπορουσα να το υλοποιήσω αυτο σε C ?έχει να κάνει με malloc η απλα θα δώσει ο χρηστης εναν αριθμο και θα παει στο πληθος του πινακα ;
dpolal Ιανουάριος 14, 2013 #2 Ιανουάριος 14, 2013 Eκτός από το πλήθος θα πρέπει να ζητάει και τους ίδιους τους αριθμούς φαντάζομαι...
painkiller44 Ιανουάριος 14, 2013 Author #3 Ιανουάριος 14, 2013 ναι αλλα αυτο σε δευτερη μοιρα κατι που μπορω να υλοποιησω αυτο που δεν μπορω να καταλαβω ειναι το πως θα γινει δυναμικα ολο αυτο δηλαδη δεν θα ξερω εκ των προτερων οτι ο πινακας πχ ειναι 10 θεσεων αλλα αυτο θα το οριζει ο χρηστης
n_dimos Ιανουάριος 14, 2013 #4 Ιανουάριος 14, 2013 Νομίζω σε αυτό εδώ το thread βρίσκεται η καθοδήγηση που χρειάζεσαι.
oxide Ιανουάριος 15, 2013 #5 Ιανουάριος 15, 2013 πως θα μπορουσα να το υλοποιήσω αυτο σε C ?έχει να κάνει με malloc η απλα θα δώσει ο χρηστης εναν αριθμο και θα παει στο πληθος του πινακα ;Το πλήθος των αριθμών που θα δώσει ο χρήστης δεν ειναι σταθερό. Θέλεις malloc, ή μπακαλόκ να δηλώσεις δηλαδή τον πίκανα σου με 1000 στοιχεία εξ αρχής...
painkiller44 Ιανουάριος 15, 2013 Author #6 Ιανουάριος 15, 2013 ναι ομως το δευτερο που αναφερεις το μπακαλοκ προφανως μπακαλιστικος τροπος δεσμευει εξ αρχης 1000 θεσεις μνημης αν ο χρηστης θελει 1001 ;τοτε δεν βγαινει αυτο που θελω .την malloc δεν ξερω να την λειτουργω καλα .διαβασα το αρθρο ,δεν το καταλαβα πληρως .ομως :/
nucleus Ιανουάριος 15, 2013 #7 Ιανουάριος 15, 2013 #include <stdlib.h>#include <stdio.h>int main(){ int stoixeia; printf("Input a number:"); scanf("%i",&stoixeia); printf("Eisodos xrhsth:%i\n",stoixeia); int *pinakas; pinakas = (int *)malloc(stoixeia*sizeof(int)); int i,j; for(i=0;i<stoixeia;i++) { pinakas[i] = i; } for(j=0;j<stoixeia;j++) { printf("%i\n",pinakas[j]); }}Για δοκίμασε αυτό.Δεν έχει σχόλια οπότε πρέπει να βρεις εσύ τι κάνει.Επίσης κάπου έχω ένα λάθος που πρέπει επίσης να βρεις
painkiller44 Ιανουάριος 15, 2013 Author #8 Ιανουάριος 15, 2013 #include <stdlib.h>#include <stdio.h>int main(){ int stoixeia; printf("Input a number:"); scanf("%i",&stoixeia); printf("Eisodos xrhsth:%i\n",stoixeia); int *pinakas; pinakas = (int *)malloc(stoixeia*sizeof(int)); int i,j; for(i=0;i<stoixeia;i++) { pinakas[i] = i; } for(j=0;j<stoixeia;j++) { printf("%i\n",pinakas[j]); }}Για δοκίμασε αυτό.Δεν έχει σχόλια οπότε πρέπει να βρεις εσύ τι κάνει.Επίσης κάπου έχω ένα λάθος που πρέπει επίσης να βρειςαυτο που αντιλαμβανομαι ειναι οτι βαζεις τον χρηστη να εισαγει εναν αριθμο φτιαχνεις εναν πινακα με τοσα στοιχεια οσα ο αριθμος που εβαλε ο χρηστης .το λαθος μηπως ειναι το %i
painkiller44 Ιανουάριος 15, 2013 Author #9 Ιανουάριος 15, 2013 το (int *) τι ακριβώς κάνει ;ψιλοχάος με τους δείκτες .εχετε καμια πηγη ; :o:o
nucleus Ιανουάριος 15, 2013 #10 Ιανουάριος 15, 2013 Βρήκες τι κάνει,παίρνει ένα αριθμό από τον χρήστη (μεταβλητή stoixeia),φτιάχνει ένα πίνακα ακεραίων (δεσμεύοντας την μνήμη που απαιτείται) με τόσες θέσεις όσες έβαλε ο χρήστης (μεταβλητή pinakas) και μετά τον γεμίζει με τις τιμές απο 0 μέχρι stoixeia - 1 με το πρώτο for και τέλος σου δείχνει όλα τα στοιχεία που περιέχει με το δεύτερο for. To λάθος δεν είναι συντακτικό το πρόγραμμα κάνει compile και εκτελείται κανονικά. Hint:Διάβασε καλύτερα τι κάνει η malloc ακριβώς το (int *) τι ακριβώς κάνει ;ψιλοχάος με τους δείκτες .εχετε καμια πηγη ; :o:o Δοκίμασε να εκτελέσεις το πρόγραμμα 2 φορές. Μια φορά με την παρακάτω εντολή pinakas = (int *)malloc(stoixeia*sizeof(int)); Και μια φορά με την παρακάτω γραμμή αντι την πάνω pinakas = malloc(stoixeia*sizeof(int));
painkiller44 Ιανουάριος 15, 2013 Author #11 Ιανουάριος 15, 2013 η malloc μας επιτρεπει να ζητησουμε απο τον χωρο της μνημης που υπαρχει διαθεσιμος .τωρα τι θες να πεις δεν καταλαβαινω :/
nucleus Ιανουάριος 15, 2013 #12 Ιανουάριος 15, 2013 η malloc μας επιτρεπει να ζητησουμε απο τον χωρο της μνημης που υπαρχει διαθεσιμος .τωρα τι θες να πεις δεν καταλαβαινω :/Ακριβώς άρα δεν πρέπει κάθε φορά αυτό τον χώρο στην μνήμη να τον απελευθερώνουμε?Αυτό ακρίβως λείπει από το πρόγραμμα.Δεσμεύει χώρο με την malloc αλλά δεν τον απελευθερώνει ποτέ με την συνάρτηση free κάτι που πρέπει να γίνεται πάντα.Μπορεί το προγραμματάκι να είναι απλό αρα η έλλειψη της free να μην έχει σοβαρές επιπτώσεις αλλά δοκίμασε να το τρέξεις έτσι:Μετέφερε τον κώδικα από την main σε μια συνάρτηση και κάλεσε αυτή την νέα συνάρτηση με ένα for πχ 50 φορές και δες πόση μνήμη θα καταλάβει το πρόγραμμα στον task manager των windows.Μετά πρόσθεσε στην νέα συνάρτηση στο τέλος μετά το δεύτερο for την εντολή free(pinakas) και εκτέλεσε το πάλι 50 φορές.Περισσότερες πληροφορίες στα παρακάτωmalloc - C++ Referencecalloc - C++ Referencerealloc - C++ Referencefree - C++ ReferenceΚΑΝΟΝΑΣ:Xρήση των malloc,calloc,realloc ΠΡΕΠΕΙ ΠΑΝΤΑ να συνοδεύεται και από την free.Όσο για το (int *) πριν την malloc είναι "υποχρεωτική" μετατροπή (explicit cast) μιας και η μεταβλητή πίνακας ορίστηκε σαν int * (δείκτης σε ακέραιο) και η malloc επιστρέφει void * (δείκτη σε void)
Inglor Ιανουάριος 21, 2013 #14 Ιανουάριος 21, 2013 Κάτι ακόμα για την malloc (memory allocation): Σύμφωνα με το API η malloc επριστρέφει θέση μνήμης αφού κάνει τη δέσμευση της μνήμης. Η επιστροφή αυτή είναι τύπου void *, δηλαδή unknown type pointer.int *pinakas;pinakas = (int *)malloc(stoixeia*sizeof(int));Ο παραπάνω κώδικας δηλώνει μία μεταβλητή pinakas δείκτης σε integer. Όταν επιστρέφει η malloc πρέπει να την κάνουμε cast σε τέτοιο τύπο για να μπορούμε να την καταχωρήσουμε στην μεταβήτή pinakas.Άρα με την παραπάνω εντολή:stoixeia*sizeof(int) : είναι το μήκος του πίνακα σε bytes που θα δεσμέυσει(int *) : η μετατροπή που κάνουμε από void *(unknown type pointer) σε int *(δείκτη σε integet).Ελπίζω να μην σε μπέρδεψα περισσότερο. :nada:
Recommended Posts
Archived
This topic is now archived and is closed to further replies.