doppelter durchlauf bei verk. liste
-
hallo,
folgende schleife(soll das vorhandensein von wortsynonymen aus einer liste suchen) steigt immer aus, nachdem die liste in der inneren schleife das erste mal durchlaufen wurde. so als ob das aktuell = aktuell->next in der vorletzten zeile garnicht beachtet wird. kann mir jemand sagen woran das liegt?
gru,
bastian
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 && aktuell2->word == aktuell->dest && aktuell->word == aktuell2->dest)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;
}}
aktuell = aktuell->next;
}
return 0;
}
-
Du solltest nach dem Durchlaufen der inneren Schleife aktuell2 wieder auf den Anfang der Liste setzen, oder besser noch auf aktuell, dann ersparst du dir doppelte Vergleiche.
P.S.:
Ich hoffe, word und dest sind keine char-Zeiger.
-
ich hab aktuell2 nach derschleife auf aktuell gesetzt(auch an mehreren stellen probiert), aber jetzt kommt er garnicht mehr aus der schleife raus.
was mache ich denn falsch ???
word und dest sind übrigens char pointer. ist das schlimm?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 && aktuell2->word == aktuell->dest && aktuell->word == aktuell2->dest)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);//Relations *aktuell2 = head;
}
aktuell2 = aktuell;
}aktuell = aktuell->next;
}
return 0;
-
Wie sieht denn die Struktur "Relations" aus?
-
der struct sieht so aus:
typedef struct relations {
char relType;
char *word;
char *dest;
struct relations *next;
}Relations;das problem mit dem vergleich hab ich jetzt im griff. nur wird in der inneren schleife, falls ein match gefunden wird trotzdem noch vorher ein nicht match ausgegeben. zb so:
Darwin:~/Desktop bastianbolender$ ./1
Auto
Fahrzeug
Maschine
Boot
Nachen
Kraftfahrzeug
Blechkiste
Gegenstand
H Fahrzeug Auto
H Fahrzeug Boot
S Auto Kraftfahrzeug
S Auto Blechkiste
S Boot Nachen
S Nachen Boot
H Maschine Auto
Y Auto Fahrzeug
Y Boot Fahrzeug
Y Fahrzeug Gegenstand
no match found for: S Auto Kraftfahrzeug
no match found for: S Auto Blechkiste
no match found for: S Boot Nachen
match found for: S Nachen Boot
Darwin:~/Desktop bastianbolender$fällt noch jemandem ein, wie ich dieses problem lösen könnte? also so dass bei einem match nicht vorher noch "no match" ausgegeben wird?
die funktion sieht momentan so aus:
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;
}p.S: tut mir leid, aber wie rückt man hier den code ein??? mit tabs und leerzeichen gehts bei mir nicht
-
ein weiteres problem dass ich gerade entdeckt hab ist folgendes:
er findet nur synonyme die direkt hintereinander in der liste stehen. aber wenn ich dass aktuell2 = NULL; unter dem else wegmache rennt er in eine endlos schleife. hat jemand bezüglich dessen eine idee?
-
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 -> AusgabePS
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; }