doppelter durchlauf bei verk. liste



  • ok, danke für den hinweis wie man einrückt, hier jetzt nochmal der eingerückte code

    int checksyn(Relations *head)
    {
    	char rel = 'S';
    	Relations *aktuell = head;
    	Relations *aktuell2 = head;
    
    	while (aktuell != NULL)
    	{
    		if(aktuell->relType == rel)
    		{	
    			while (aktuell2 != NULL)
    			{
    			if(aktuell2->relType == rel && strcmp(aktuell2->word, aktuell->dest) == 0  && strcmp(aktuell->word, aktuell2->dest) == 0)
    				{
    				printf("match found for: %c %s %s\n",aktuell->relType, aktuell->word, aktuell->dest);
    				aktuell2 = NULL;
    				}
    			else
    				printf("no match found for: %c %s %s\n", aktuell->relType, aktuell->word, aktuell->dest);
    				aktuell2 = aktuell2->next;
    			}
    
    		}
    		aktuell2 = aktuell;
    		aktuell = aktuell->next;
    
    	}
    	return 0;
    


  • [cpp]
    int checksyn(Relations *head)
    {
    char rel = 'S';
    Relations *aktuell = head;
    Relations *aktuell2 = head;

    while (aktuell != NULL)
    {
    if(aktuell->relType == rel)
    {
    while (aktuell2 != NULL)
    {
    if(aktuell2->relType == rel &&
    strcmp(aktuell2->word, aktuell->dest)== 0 &&
    strcmp(aktuell->word, aktuell2->dest) == 0)

    {
    printf("match found for: %c %s %s\n",
    aktuell->relType, aktuell->word, aktuell->dest);
    aktuell2 = NULL;
    }
    else
    printf("no match found for: %c %s %s\n", aktuell->relType,
    aktuell->word, aktuell->dest);
    aktuell2 = NULL;
    }
    aktuell2 = aktuell;
    }
    aktuell = aktuell->next;
    }
    return 0;
    }
    [/cpp]

    In der IF-Anweisung steckt der Teufel drin - wenn Du mich fragst. Ist aber erstmal nur so ein Gefühl; check das nochmal. 🙂



  • ich glaub eher dass es damit zusammenhängt, wie die pointer sitzen. insbesondere aktuell2. wenn ihr wollt kann ich euch auch das ganze programm schicken, dann könnt ihrs laufen lassen und die funktion selbst testen. sagt mir einfach eure email adressen, falls ihrs haben wollt



  • aktuell2 = NULL;                //Was soll das?
               }
               else
                 printf("no match found for: %c %s %s\n", aktuell->relType,
                 aktuell->word, aktuell->dest);
               aktuell2 = NULL;                 //Was soll das?
           }
           aktuell2 = aktuell;                  //...und das?
        }
        aktuell = aktuell->next;
      }
    return 0;
    }
    


  • picknicker187 schrieb:

    wenn ihr wollt kann ich euch auch das ganze programm schicken, dann könnt ihrs laufen lassen und die funktion selbst testen. sagt mir einfach eure email adressen, falls ihrs haben wollt

    Mit welchem Compiler arbeitest Du?



  • ich versuche halt (im moment leider mehr durch probieren, weil mir nichts mehr einfällt). die zeiger richtig zu setzten. wenn ein match gefunden wurde muss ja die innere schleife vorbei sein, also ist das denke ich schonmal richtig. und nachdem die innere schleife durchlaufen ist muss aktuell2 ja wieder auf den anfang der liste gebracht werden, für den nächsten durchlauf. dass nach dem falschen match die schleife nicht zu ende sein darf weiss ich ja, aber ich habs mal zum testen hingemacht. ich kann dir aber gerne das programm schicken, damit dus selber laufen lassen kannst. ich glaube dann wird es dir um einiges leichter fallen, das problem zu verstehen



  • gcc 3.3



  • picknicker187 schrieb:

    gcc 3.3

    Ist das nicht Unix bzw. Linux? Ach egal...meine Mail ist w.kappesser@arcor.de



  • jein, ist osx

    mail mit dem code hab ich dir gerade geschickt



  • Okay, auf meinem System läuft es nicht...
    Aber ich hab's trotzdem versucht.
    Was passiert wenn Du folgendes compilierst?

    bool isRel(*Relations r){
    
    	return r->relType == rel;
    }
    
    bool isSyn(*Relations r1, *Relations r2){
    	return	( (strcmp(r2->word, r1->dest) == 0) && (strcmp(r1->word, r2->dest) == 0));
    }
    
    int checksyn(Relations *head)
    {
    	char rel = 'S';
    	Relations *aktuell = head;
    	Relations *aktuell2 = head;
    
    	while (aktuell != NULL)
    	{
    		if(isRel(aktuell))	//Test auf rel = "S"
    		{	
    			while (aktuell2 != NULL)
    			{
    			if(isRel(aktuell2) && isSyn(aktuell,aktuell2))
    				{
    				printf("match found for: %c %s %s\n",aktuell->relType, aktuell->word, aktuell->dest);
    				}
    			else
    				{
    				printf("no match found for: %c %s %s\n", aktuell->relType, aktuell->word, aktuell->dest);
    				}
    			aktuell2 = aktuell2->next;	//incrementiert die 2.Liste
    			}
    		}
    		aktuell = aktuell->next;		//incrementiert die 1.Liste
    		aktuell2 = head;				//setzt die 2.Liste auf ihren Ursprung zurück
    	}
    	return 0;
    }
    

Anmelden zum Antworten