Anzeige:
Ergebnis 1 bis 7 von 7

Thema: pointer problem, beim vergleichen von listen

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.06.2003
    Beiträge
    13

    pointer problem, beim vergleichen von listen

    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

    PHP-Code:
    // 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 
    pTmpLeftpTmpRight;    //temp lists
        
    int EOLLeftEOLRight;        //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 ( 
    == strcmppTmpLeft->cRulepTmpRight->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.

  2. #2
    Registrierter Benutzer
    Registriert seit
    15.06.2003
    Beiträge
    13
    was vergessen ... sorry

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    wo in der inneren Schleife denn?

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.06.2003
    Beiträge
    13
    wie gesagt jedesmal wenn ich auf "pTmpRight" zugreifen will ...

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Hi!

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

    Code:
    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
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  6. #6
    Registrierter Benutzer
    Registriert seit
    01.11.2003
    Beiträge
    6
    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.

  7. #7
    Registrierter Benutzer
    Registriert seit
    15.06.2003
    Beiträge
    13
    @Jack's Cancer :
    ich glaub das war es ... zumindestens läuft es jetzt ... danke

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •