dinak Δημοσ. 5 Νοεμβρίου 2009 Δημοσ. 5 Νοεμβρίου 2009 έχω τον εξής κώδικα >#include <iostream> #include <string> using namespace std; struct student{ string name; string surname; int age; int am; int grade1; int grade2; int avg; int average(int grd1, int grd2){ int mo= (grd1+grd2)/2; return mo; } void show(int Aver, int AM){ cout << "AM: " << AM << " Average: " << Aver << endl; } }; main(){ int i; struct student *Std; Std=(struct student *)malloc(3*sizeof(struct student)); for(i=0;i<3;i++){ cout << "Onoma Foititi " << i << " : "; cin >> (Std[i].name); cout << "Epitheto Foititi " << i << " : "; cin >> (Std[i].surname); cout << "Ilikia Foititi " << i << " : "; cin >> Std[i].age; cout << "AM Foititi " << i << " : "; cin >> Std[i].am; cout << "Vathmos 1: "; cin >> Std[i].grade1; cout << "Vathmos 2: "; cin >> Std[i].grade2; } } και σκάει όταν πάω να εισάγω το όνομα του φοιτητή στη δεύτερη επανάληψη!τι στο καλό φταίει;
Evgenios1 Δημοσ. 5 Νοεμβρίου 2009 Δημοσ. 5 Νοεμβρίου 2009 Νομιζω οτι μεσα σε struct δε γινετε να εχεις συναρτηση (υλοποιημενη), και δευτερο οτι δε γινετε να χρησιμοποιησεις το string επειδη ειναι κλαση. πχ αυτο τρεχει μια χαρα >//#include <iostream> //#include <string> #include <stdio.h> #include <stdlib.h> //using namespace std; #define string char* struct student{ string name; string surname; int age; int am; int grade1; int grade2; int avg; /* int average(int grd1, int grd2){ int mo= (grd1+grd2)/2; return mo; } void show(int Aver, int AM){ } */ }; void main(){ int i; struct student *Std; Std=(struct student *)malloc(3*sizeof(struct student)); for(i=0;i<3;i++){ Std[i].name= malloc(100); scanf("%s",Std[i].name); } for(i--;i>-1;i--) printf("%s\n",Std[i].name); system("pause"); }
bxenos Δημοσ. 5 Νοεμβρίου 2009 Δημοσ. 5 Νοεμβρίου 2009 Το struct είναι ίδιο με το class με public members (by default) αρα μπορείς να έχεις συναρτηση. Το λάθος σου είναι ότι χρησιμοποίησες malloc που απλά δεσμεύει μνήμη ενω έχεις member string. Αυτό σημαινει οτι παρεκαμψες την κληση του constructor των string. Αντι για malloc, κάνε Std = new student[3]; και στο τέλος delete []student;
Evgenios1 Δημοσ. 5 Νοεμβρίου 2009 Δημοσ. 5 Νοεμβρίου 2009 Μολις ειδα οτι αναφερετε σε C++ και οχι C... Λεω και γω... string σε C παραξενευτηκα .. Αυτο δεν ειναι C syntax "sizeof(struct student)" ? WOW Αυτο δεν το ηξερα!! Καλη φαση. >#include "stdafx.h" #include <typeinfo> class __S{ public: __S() { printf("ctr __S\n"); } }; class Object public: __S s; Object() { printf("ctr Object\n"); } }; int _tmain(int argc, _TCHAR* argv[]) { Object *o = new Object(); getchar(); return 0; }
bxenos Δημοσ. 5 Νοεμβρίου 2009 Δημοσ. 5 Νοεμβρίου 2009 το sizeof+malloc δεν ταιριάζουν στη c++. (π.χ. αναμένονται προβλήματα με virtual members, κλήση constructor/destructors, κτλ) επιπλέον δεν συνήστατε η αναγνωση string(c++) με scanf© η οποια γεμίζει char arrays. Βέβαια η scanf/printf ΕΧΟΥΝ και στη C++ χρησιμοτητες... ΥΓ. βέβαια τους destructors μπορουμε να τους καλέσουμε με το ζόρι αν θέλουμε (και τους έχουμε δημιουργήσει) π.χ. this->student::~student();
dinak Δημοσ. 5 Νοεμβρίου 2009 Μέλος Δημοσ. 5 Νοεμβρίου 2009 cs.uoi ftw έτσι τρέχουμε και δεν φτάνουμε Το struct είναι ίδιο με το class με public members (by default) αρα μπορείς να έχεις συναρτηση. Το λάθος σου είναι ότι χρησιμοποίησες malloc που απλά δεσμεύει μνήμη ενω έχεις member string. Αυτό σημαινει οτι παρεκαμψες την κληση του constructor των string. Αντι για malloc, κάνε Std = new student[3]; και στο τέλος delete []student; ευχαριστώ πολύ για τη βοήθεια...όντως αυτό ήταν!
dinak Δημοσ. 7 Νοεμβρίου 2009 Μέλος Δημοσ. 7 Νοεμβρίου 2009 αυτή η δυναμική κατανομή μνήμης τελικά δε με θέλει άσκηση λιστών σε C αυτή τη φορά... >#include <stdio.h> typedef struct arrays{ int **Array; int row_num; int column_num; int key; int table_count; }DBTable; typedef struct table_list{ DBTable *table; struct table_list *next; }TableNode; TableNode *db_ptr=NULL; int new_table(){ int rows, columns, c_key, i, j, **A; TableNode *TN; DBTable *DBT; printf("Eisagete to plithos twn grammwn tou pinaka: "); scanf("%d", &rows); printf("Eisagete to plithos twn stilwn tou pinaka: "); scanf("%d", &columns); A=(int **)malloc(rows*sizeof(int *)); for(i=0;i<rows;i++){ A[i]=(int *)malloc(columns*sizeof(int)); } for(i=0;i<rows;i++){ for(j=0;j<columns;j++){ printf("Eisagete to (%d,%d) stoixeio tou pinaka: ", i, j); scanf("%d", &A[i][j]); } } printf("Eisagete enan arithmo apo to 0 ews to %d gia tin stili-kleidi: ", columns-1); scanf("%d", &c_key); for(i=0;i<(rows-1);i++){ for(j=i+1;j<rows;j++){ if(A[i][c_key]==A[j][c_key]){ printf("I stili kleidi periexei idious arithmous\n"); return (-1); } } } TN=(TableNode *)malloc(sizeof(TableNode)); DBT=(DBTable *)malloc(sizeof(DBTable)); TN->table->Array=(int **)malloc(rows*sizeof(int *)); for(i=0;i<rows;i++) TN->table->Array[i]=(int *)malloc(columns*sizeof(int)); TN->table->row_num=rows; TN->table->column_num=columns; TN->table->key=c_key; for(i=0;i<rows;i++){ for(j=0;j<columns;j++){ TN->table->Array[i][j]=A[i][j]; printf("%d\n", TN->table->Array[i][j]); } } TN->next=db_ptr; db_ptr=TN; (TN->table->table_count)++; return (TN->table->table_count); } main(){ int k; k=new_table(); printf("%d\n", k); //και εδώ ακριβώς σκάει system("pause"); } καμιά βοήθεια;
virxen75 Δημοσ. 7 Νοεμβρίου 2009 Δημοσ. 7 Νοεμβρίου 2009 κάνε το έτσι > TN=(TableNode *)malloc(sizeof(TableNode)); DBT=(DBTable *)malloc(sizeof(DBTable)); [color="Red"]TN->table=(DBTable *)malloc(sizeof(DBTable));[/color] TN->table->Array=(int **)malloc(rows*sizeof(int *));
ippo00 Δημοσ. 7 Νοεμβρίου 2009 Δημοσ. 7 Νοεμβρίου 2009 oh απάντησε ο άλλος edit: μιας και έπιασα χώρο για πόστ, θα σου συνήστουσα να αρχίσεις να χρησημοποιείς debugger μιας και η εκτίμηση σου για το που ήταν το πρόβλημα ήταν λίγο off...
Evgenios1 Δημοσ. 8 Νοεμβρίου 2009 Δημοσ. 8 Νοεμβρίου 2009 oh απάντησε ο άλλος edit: μιας και έπιασα χώρο για πόστ, θα σου συνήστουσα να αρχίσεις να χρησημοποιείς debugger μιας και η εκτίμηση σου για το που ήταν το πρόβλημα ήταν λίγο off... +1 Πχ δες το παρακατω Στο visual studio η διευθυνση 0xcdcdcdcd μας λεει οτι δεν ειναι "initialised" (δεν ξερω την ελληνικη ορολογια)
virxen75 Δημοσ. 8 Νοεμβρίου 2009 Δημοσ. 8 Νοεμβρίου 2009 oh απάντησε ο άλλος edit: μιας και έπιασα χώρο για πόστ, θα σου συνήστουσα να αρχίσεις να χρησημοποιείς debugger μιας και η εκτίμηση σου για το που ήταν το πρόβλημα ήταν λίγο off... +1 επίσης όταν έχεις να κάνεις με δείκτες που είναι εύκολο να αντιμετωπίσεις τέτοια κρασαρίσματα μπορείς να βάζεις εντολές printf("\n(1)mexri edo ok!!!"); ............. printf("\n(2)mexri edo ok!!!"); οπότε η εντολή που ευθύνεται για το κρασάρισμα θα είναι μετά την printf που εμφανίζεται στην οθόνη
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.