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

C debugging


marsel

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

Δημοσ.

Καλησπέρα παιδιά,

έχω ένα πρόβλημα με τον ακόλουθο κώδικα.

Eνώ κάνει insert ένα στοιχείο την πρώτη φορά, αν την ξανακαλέσω πετάει segmentation fault...

>
struct listnode
{
int data;
struct listnode *next;
struct listnode *prev;
};

void insertNode(struct listnode **head,int item)
{
struct listnode *newNode, *currNode, *prevNode;

newNode = (struct listnode *) malloc(sizeof(struct listnode));

if(newNode != NULL)
{
	newNode->data = item;
	newNode->next = NULL;
	newNode->prev = NULL;

	currNode = *head;
	prevNode = NULL;

	while ((currNode != NULL) && (item > currNode->data))
	{
		prevNode = currNode;
		currNode = currNode->next;
	
	}

	if(prevNode == NULL)
	{
		newNode->next = *head;
		newNode->prev = *head;
		*head = newNode;
	}
	else
	{
		prevNode->next = newNode;
		newNode->prev = prevNode;
		newNode->next = currNode;
		currNode->prev = newNode;
	}
}
else
{
	printf("No Memory\n");
}
}

 

Ευχαριστώ εκ των προτέρων.

Δημοσ.

Καλημέρα. Το πρόβλημα υπάρχει σε αυτήν τη γραμμή κώδικα:

>
	else
	{
		prevNode->next = newNode;
		newNode->prev = prevNode;
		newNode->next = currNode;
		[b][u]currNode->prev = newNode;[/u][/b]
	}

 

...στην περίπτωση που κατά τη διάσχιση της λίστας με το while loop φτάσεις στο τέλος της λίστας. Αυτό θα συμβαίνει κάθε φορά που προσπαθείς σε μη κενή λίστα να εισάγεις κόμβο με τιμή μεγαλύτερη από την τρέχουσα μεγαλύτερη της λίστας (οριακά για 2 εισαγωγές, αν π.χ. στην 1η κλήση της insertNode εισάγεις την τιμή A και στη 2η εισάγεις οποιοδήποτε B > A). Σε αυτήν την περίπτωση, ο δείκτης currNode θα έχει τιμή NULL, δηλαδή δε θα δείχνει σε allocated μπλοκ μνήμης και γι' αυτό η απόπειρα να προσπελάσεις το μέλος prev του struct οδηγεί σε segmentation fault.

 

Μία if για έλεγχο αυτής της περίπτωσης και είσαι έτοιμος:

>
		if(currNode)
		{
			currNode->prev = newNode;
		}

Δημοσ.
Καλημέρα. Το πρόβλημα υπάρχει σε αυτήν τη γραμμή κώδικα:

 

 

...στην περίπτωση που κατά τη διάσχιση της λίστας με το while loop φτάσεις στο τέλος της λίστας. Αυτό θα συμβαίνει κάθε φορά που προσπαθείς σε μη κενή λίστα να εισάγεις κόμβο με τιμή μεγαλύτερη από την τρέχουσα μεγαλύτερη της λίστας (οριακά για 2 εισαγωγές, αν π.χ. στην 1η κλήση της insertNode εισάγεις την τιμή A και στη 2η εισάγεις οποιοδήποτε B > A). Σε αυτήν την περίπτωση, ο δείκτης currNode θα έχει τιμή NULL, δηλαδή δε θα δείχνει σε allocated μπλοκ μνήμης και γι' αυτό η απόπειρα να προσπελάσεις το μέλος prev του struct οδηγεί σε segmentation fault.

 

Μία if για έλεγχο αυτής της περίπτωσης και είσαι έτοιμος:

>
		if(currNode)
		{
			currNode->prev = newNode;
		}

 

Ευχαριστώ για την απάντηση,

αλλά θέλω η λίστα να είναι διπλά συνδεδεμένη κυκλική και στην συνάρτηση printList που έχω κάνει διαπιστώνω ότι η λίστα τελειώνει στη συνθήκη

(currNode == NULL) ενώ θα έπρεπε να είναι (currNode->next == *head).

Δημοσ.

Καλησπέρα,

παιδία εχω ενα πρόβλημα με την ακόλουθη λίστα.

 

>
struct indexRecord
{
char lastname[len];
char firstname[len];
char email[len];
struct phoneRecord *phones;
struct indexRecord *next;
struct indexRecord *prev;
};

void insertNode(struct indexRecord **head,char *sname,char *fname,struct phoneRecord *pnums,char *mail)
{
struct indexRecord *newNode, *currNode, *prevNode;
newNode = (struct indexRecord *) malloc(sizeof(struct indexRecord));

if(newNode != NULL)
{
	strcpy(newNode->lastname,sname);
	strcpy(newNode->firstname,fname);
	newNode->phones = pnums;
	strcpy(newNode->email,mail);
	newNode->next = *head;
	newNode->prev = *head;

	currNode = *head;
	prevNode = NULL;

	while ((currNode != *head) && (strcmp(sname,currNode->lastname) > 0))
	{
		prevNode = currNode;
		currNode = currNode->next;
	}
	if(prevNode == NULL)
	{
      		if(currNode)
		{
			newNode->next = currNode;
			currNode->prev = newNode;
		}
		*head = newNode;
	}
	else
	{
		prevNode->next = newNode;
		newNode->prev = prevNode;
		newNode->next = currNode;
		if(currNode)
		{
			currNode->prev = newNode;
		}
	}
}
else
{
	printf("No memory\n");
}
}

void printList(struct indexRecord *head)
{
struct indexRecord *currNode;

currNode = head;

if(currNode != NULL)
{
       printf("%s - %s -",currNode->lastname,currNode->firstname);
    printPhones(currNode->phones);
    printf("%s \n",currNode->email);
    currNode = currNode->next;
	while(currNode != head)
	{
		printf("%s - %s -",currNode->lastname,currNode->firstname);
		printPhones(currNode->phones);
		printf("%s \n",currNode->email);
		currNode = currNode->next;
	}
}
else
{
	printf("List Is Empty\n\n");
}
printf("\n");
}

 

Θέλω η λίστα να είναι διπλά συνδεδεμένη κυκλική αλλά μου πετάει segm. fault. Έκανα debugging αλλά δεν βρίσκω κάτι λάθος.

ευχαριστώ εκ των προτέρων.

Δημοσ.

ένα λάθος είναι:

>
	[color="Red"]currNode = *head;[/color]
	prevNode = NULL;

	while (([color="#ff0000"]currNode != *head[/color]) && (strcmp(sname,currNode->lastname) > 0))

ότι το loop δεν θα εκτελεστεί ποτέ. Στο debugging δεν σε παραξένεψε που δεν μπαίνει ποτέ μέσα;

 

και τις αρχικές τιμές μήπως να τις κάνεις NULL; γιατι μετά δεν ενημερώνεις με σωστά δεδομένα

>
	newNode->next = [color="Red"]*head[/color]; NULL
	newNode->prev = [color="Red"]*head;[/color] NULL

 

Δεν έψαξα περισσότερο, δες το και πες τι έγινε.

 

---------- Προσθήκη στις 01:03 ---------- Προηγούμενο μήνυμα στις 00:50 ----------

 

εγω είχα απαντήσει στο θέμα του marsel "Πρόβλημα σε λίστα C" αλλά αυτό μετακινήθηκε στο "C debugging", ενώ η απάντηση μου παρέμηνε εδώ.

 

Οπότε μήπως να μπεί και το μήνυμα μου στη θέση του;

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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