Sequenzielle Suche
-
So genau habe ich mir das jetzt auch nicht angesehen.
Es ist dein Programm. Du musst wissen was es machen soll.
Bau in den Schleifen ein paar printf ein in denen du die Werte ausgibst (Datum, k ,n1,n2,...).
Dann siehst du doch ob das doppelt vorkommt.Es gibt übrigens auch noch den Debugger
Damit kannst du das Problem auch finden.
-
Was ich nicht ganz verstehe ist folgendes...
int seqSearchKDat(const Fehler fdata[], const KDatum *kdP, int n1, int n2) { int k; for (k=n1-1; k<=n2-1; k++) { if(equalKDatum(&fdata[k].kdat, kdP)) return k+1; } return -1; }
Wenn ich diese Funktion folgendermaßen aufrufe, müsste doch k+1 als Ausgabe erscheinen, falls denn k+1 dieses Datum beeinhaltet.
printf("%d", seqSearchKDat(&err[k], dat, n1, n2));
Die gibt aber jetzt immer -1 zurück. Wieso?
-
1. Wirf einen Debugger an
2. step durch die Funktion und die Unterfunktion
3. Sobald etwas von dir unerwartetes geschieht guckst du dir an, warum (z.B. mal die Werte der Variablen an der Stelle angucken)
4. ???
5. Profit!
-
Dann nimm doch mal den Debugger.
Oderprintf("equalKDatum : %3d: %02d.%02d.%4d <-> %02d.%02d.%4d\n", k, kd1P->jahr, kd1P->monat, kd1P->tag , kd2P->jahr, kd2P->monat, kd2P->tag);
und
printf("seqSearchKDat: %3d: %02d.%02d.%4d <-> %02d.%02d.%4d\n", k, fdata[k].kdat.jahr, fdata[k].kdat.monat, fdata[k].kdat.tag , kdP->jahr, kdP->monat, kdP->tag);
Und schau nach ob es wirklich gleiche Daten sind.
-
Die Daten sind definitiv gleich, wie ich mit diesem Code überprüft habe:
for(k=n1-1; k<=n2-1; k++){ printf("%d", equalKDatum(&err[k].kdat, dat)); }
Hier erhalte ich als Ausgabe 0 und im Falle der Gleichheit eine 1.
Ich will aber die Indices also bei welchem k sich die gesuchten Fehlerdaten befinden, deshalb die Funktion seqSearchKDat, die mir k+1 ( +1 wg. Initialisierung von 0 beginnend). @seppj: 4. und 5. ?
-
Das ist aber trotzdem etwas anderes.
Du interpretierst/übergibst die Daten in seqSearchKDat anders als in equalKDatum
Genauer: beim ersten Paramter.An seqSearchKDat wird die Anfangsadresse von Feld übergeben. Dann stimmen auch die Indizes.
An equalKDatum übergibst du aber die Adresse von einem Element. Behandelst es aber wie die Anfangsadresse. Dann stimmen die Indizes nicht mehr.
Das Problem mit den zwei for-Schleifen.
-
Deshalb wohl auch dieses hier im Debugger:
&fdata[k].kdat 0x00076b50 {tag=-858993460 monat=-858993460 jahr=-858993460 }Wie biege ich das gerade?
-
Indem du seqSearchKDat mit dem gesamten Feld aufrufst oder in seqSearchKDat nur das übergebene Element vergleichst.
w=seqSearchKDat(&err[0], dat, n1, n2);
oder
if(equalKDatum(&(fdata->kdat), kdP))
Was du dadurch noch ändern solltest, musst du mal selber schauen.
-
Das verstehe ich nicht.
Hast du Stichworte für diese Thematik, dann informiere ich mich dadrüber lieber nochmal.
-
Arrays und Zeiger.
-
Bisschen genauer vllt?
-
Indizes fangen immer bei 0 an.
Eine Funktion kann nicht feststellen wie groß das Array ist.
Da ich dein Buch nicht kenne, kann ich dir leider nicht die Seite nennen.