doppelter durchlauf bei verk. liste



  • 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;
    }
    

    Du meist so? 😃



  • jo, mit dem einrücken schon. wie macht man das denn? aber das ist eher unwichtig, mir gehts mehr darum, dass der code richtig funktioniert. hast du da eine idee? 😋



  • Beschreibe bitte mal die gewünschte Funktionsweise deines Programms.
    Eingaben -> Verarbeitungsschritte -> Ausgabe

    PS
    FORMATIERE BITTE DEINE TEXTE!!! 😮



  • dir ist das vielleicht unwichtig. mir ist das lesen von unformattiertem code aber zu mühsam.
    es ist ganz einfach. den code ins eingabefeld pasten. den code anwählen und den button "Code" drücken.
    K.



  • wenn ein synonym in der oben stehenden struct bzw. listen struktur steht (großbuchstabe S), soll die funktion überprüfen ob es auch das synonym in umgekehrter form in der liste gibt. also zb boot nachen, nachen boot und es ausgeben. falls es keine umgekehrte form gibt(zb bei auto kraftfahrzeug) soll es eine warnung ausgeben.

    das problem im moment ist aber, dass es mit den schleifen noch nicht so ganz hinhaut. entweder er findet es nur, wenn beides direkt hintereinander steht oder er läuft in eine endlosschleife



  • 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