PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pointer problem, beim vergleichen von listen



Pinocchino
31-10-2003, 18:58
hi

also ich hab mich mal an listen probiert. funktioniert auch alles wunderbar.
jetzt hab ich mir mal eine funktion gebastelt die zwei listen vergleichen soll, wenn ein element in beiden listen vorkommt wird es aus der einen liste gelöscht, aber irgentwie scheint es nicht zu funkionieren. ich bekomme immer
eine speicherzugriffsverletzung wenn die innere while schleife das zweite mal
durchlaufen wird.

inhalt von pTmpLeft ;
Hello
World
This
Is
The
First
Test


inhalt von pTmpLeft ;
Hello
Folks
This
Is
The
Second
Test



// standart type of a element
typedef const char *ListKeyType;

// define elment
typedef struct Node {
ListKeyType cRule;
struct Node *Next;
}*ListNode;

//define list
typedef ListNode List;

.
.
.

//compare list
//is a part in pRootLeft and pRootRight then remove this part from pRootLeft
int comparelist( List *pRootLeft, List *pRootRight ) {
List pTmpLeft, pTmpRight; //temp lists
int EOLLeft, EOLRight; //fake bool value, end of list

if ( NULL == *pRootLeft ) { //extreme paranoia
perror("comparelist( pRootLeft, ), no list create? ");
return(-1);
}

if ( NULL == *pRootRight ) { //extreme paranoia
perror("comparelist( , pRootRight ), no list create? ");
return(-1);
}

pTmpLeft = *pRootLeft;
pTmpRight = *pRootRight;
EOLLeft = 0;
EOLRight = 0;

//compare one left element with all right elements
//and go to next left element and than the same stuff
while( !EOLLeft ) {
if ( NULL == pTmpLeft->Next ) { //next element is not empty
EOLLeft = 1;
}

printf("LEFT : %s\n", pTmpLeft->cRule);
while( !EOLRight ) {
if ( NULL == pTmpRight->Next ) { //next element is not empty
EOLRight = 1;
}

printf("Right : %s\n", pTmpRight->cRule);

if ( 0 == strcmp( pTmpLeft->cRule, pTmpRight->cRule ) ) {
pTmpLeft = pTmpLeft->Next;
}

pTmpRight = pTmpRight->Next;
}
pTmpLeft = pTmpLeft->Next;
EOLRight = 0;
}

return(0);
}



habe vorsichtshalber den ganzen quellcode noch drangehangen ...


Pinocchino


P.S. tut mir ein gefallen und meckert nicht über meine rechtschreibung/gramatik ich musste mich beeilen dies zu schreiben.

Pinocchino
31-10-2003, 18:59
was vergessen ... sorry

peschmae
01-11-2003, 08:02
wo in der inneren Schleife denn?

MfG Peschmä

Pinocchino
01-11-2003, 08:32
wie gesagt jedesmal wenn ich auf "pTmpRight" zugreifen will ...

Silver
01-11-2003, 10:00
Hi!

Also typischer Anfängerfehler bei Strukturen (wenn ich das mal so sagen darf ;) )



while( !EOLRight ) {

if ( NULL == pTmpRight->Next ) { // wenn pTmpRight NULL ist (was ja passiert) dann gibts ja keinen Next-Pointer daher speicherzugriffsfehler

EOLRight = 1;

}

... // Code


pTmpRight = pTmpRight->Next; // wenn die Liste leer ist, dann bekommt pTmpRight NULL zugewiesen. aber hier bekommst du dann oben das Problem

}



mfG

Jack's Cancer
01-11-2003, 10:01
Wenn ich das richtig sehe, hast du vergessen den rechten temporären Zeiger wieder auf den Anfang der Liste zu setzen. Er steht ja nach dem letzten durchlauf am Ende der rechten Liste.

Also muss vor oder nach der inneren while-Schleife stehen:
pTmpRight = *pRootRight;

Es gibt dann aber noch ein weiteres Problem. In der inneren Schleife wird auch nochmal ab und zu der linke Zeiger weitergesetzt ohne dass danach nochmal geprüft, ob der Zeiger das Ende der linken Liste erreicht hat.

Pinocchino
01-11-2003, 12:04
@Jack's Cancer :
ich glaub das war es ... zumindestens läuft es jetzt ... danke