βοηθεια σε c με λιστες

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
john34516
Δημοσιεύσεις: 21
Εγγραφή: 06 Αύγ 2007 04:16

βοηθεια σε c με λιστες

Δημοσίευση από john34516 » 17 Απρ 2010 22:12

παιδια εγραψα αυτο το πολυ απλο προγραμμα με λιστα και struct

#include <stdio.h>
#include <stdlib.h>


int i=0,n,count=1;

struct va8moi {
float firstAssignment;
float secondAssignment;
float midterm;
float final;
float finalMark;
};

struct person {
char *firstName;
char *lastName;
int idNumber;
struct va8moi *marks;
};


struct classNodeStruct {
struct person *aStudent;
struct classNodeStruct *next;
}test1;

int main (void) {
struct classNodeStruct *neo;
struct classNodeStruct *head=NULL;

neo=&test1;
neo=(struct classNodeStruct*)malloc(sizeof(struct classNodeStruct));


neo->next=head;
head=neo;
neo->aStudent->marks->secondAssignment=0;
printf("%d",head->aStudent->marks->firstAssignment);


system("PAUSE");
return 0;
}

πως μπορω να καταχωρησω αριθμο στο secondAssugnment??? επειδη ειμαι σιγουρος πως εκει σπαει το προγραμμα οταν το εκτελω.

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

βοηθεια σε c με λιστες

Δημοσίευση από Erevis » 18 Απρ 2010 03:29

O pointer astudent που έχεις στο κάθε κόμβο της λίστας δείχνει σε άκυρη μνήμη, εφόσον δεν κάνεις malloc μνήμη στο heap ούτε του δίνεις κάποια συγκεκριμένη διεύθυνση. Όταν τον κάνεις dereference λογικό είναι να σκάει το πρόγραμμα.

Επίσης μερικές γραμμές στον κώδικα δε βγάζουν νόημα αλλά αυτο δεν έχει να κάνει τόσο άμεσα με το ότι σκάει.

john34516
Δημοσιεύσεις: 21
Εγγραφή: 06 Αύγ 2007 04:16

βοηθεια σε c με λιστες

Δημοσίευση από john34516 » 18 Απρ 2010 04:36

δηλαδη αν προσθεσω αυτο θα ειναι ενταξει ?

neo=(struct classNodeStruct*)malloc(sizeof(struct classNodeStruct));
neo->aStudent=(struct person*)malloc(sizeof(struct person));
neo->aStudent->marks=(struct va8moi*)malloc(sizeof(struct va8moi));

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

βοηθεια σε c με λιστες

Δημοσίευση από Erevis » 18 Απρ 2010 12:44

Λογικά ναι :P

john34516
Δημοσιεύσεις: 21
Εγγραφή: 06 Αύγ 2007 04:16

βοηθεια σε c με λιστες

Δημοσίευση από john34516 » 18 Απρ 2010 13:04

βασικα εγραψα αυτη την συναρτηση για εισαγωγη στοιχειων αλλα μολις εισαγω των τελευταιο αριθμο μου σκαει το προγραμμα και δεν ξανακανει επαναληψη και δεν μπορω να καταλαβω που εχω κανει λαθος

int i=0,count=1;
struct classNodeStruct *neo;
struct classNodeStruct *head=NULL;
struct classNodeStruct *current=NULL;
neo=(struct classNodeStruct*)malloc(sizeof(struct classNodeStruct));
neo->aStudent=(struct person*)malloc(sizeof(struct person));
neo->aStudent->marks=(struct va8moi*)malloc(sizeof(struct va8moi));;
neo->next=head;
head=neo;
current=neo;
while (i<n) { printf("Dwse stoixeia mathiti kai va8mous\n");
scanf("%s %s",neo->aStudent->firstName,neo->aStudent->lastName);
scanf("%f",&neo->aStudent->marks->firstAssignment);
scanf("%f",&neo->aStudent->marks->secondAssignment);
scanf("%f",&neo->aStudent->marks->midterm);
scanf("%f",&neo->aStudent->marks->final);
current=neo;
free(neo);
neo=(struct classNodeStruct*)malloc(sizeof(struct classNodeStruct));
neo->aStudent=(struct person*)malloc(sizeof(struct person));
neo->aStudent->marks=(struct va8moi*)malloc(sizeof(struct va8moi));;
current->next=neo;
neo->next=NULL;
i++;

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

βοηθεια σε c με λιστες

Δημοσίευση από Erevis » 19 Απρ 2010 20:33

Ο κώδικάς σου έχει πολλά λάθη κυρίως με τους pointers, σε κάποια φάση κάνεις κάτι τέτοιο:

Κώδικας: Επιλογή όλων


current = neo;
//κάνεις free τη μνήμη στην οποία δείχνει και το current
free&#40;neo&#41;;

neo = &#40;struct classNodeStruct*&#41; malloc &#40; sizeof&#40;struct classNodeStruct&#41;&#41;; 
neo->aStudent= &#40;struct person*&#41; malloc&#40; sizeof&#40;struct person&#41;&#41;; 
neo->aStudent->marks= &#40;struct va8moi*&#41; malloc&#40; sizeof&#40;struct va8moi&#41;&#41;;

//segmentation fault καραμπινάτο γιατί κανεις dereference pointer o oποιός δείχνει σε
//άκυρη μνήμη
current->next = neo;

Και υπάρχουν κι άλλα παρόμοια. Οπότε ρίξε ένα καλύτερο διάβασμα στους pointers :)

john34516
Δημοσιεύσεις: 21
Εγγραφή: 06 Αύγ 2007 04:16

βοηθεια σε c με λιστες

Δημοσίευση από john34516 » 20 Απρ 2010 00:53

επιτελους καταφερα να το δουλεψω σωστα!!

ευχαριστω πολυ για τη βοηθεια.

( το μεγαλυτερο προβλημα ηταν που διαβαζα string σε δειχτη χωρις να δωσω μνημη σε αυτο το δειχτη )

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες