Woodstock Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 Hallo! Habe eine Funktion: #include "WordSearch.h" /* Index.idx wird geöffnet, existiert diese nicht wird das Programm mit dem Hinweis die Index Datei existiere nicht, und müsse erstellt werden beendet! Erste Unterscheidung: and || or: bei Beiden: Datei wird nach Wörter ausgelesen (zahlen werden abgeschnitten) bei and: VerifyAnd wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden: Aufruf OutAnd bei or: VerifyOr wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden: Aufruf OutOr */ void ReadOut(char szInput[][1001], int &nSearchedWords, char szSearchCriterion[50]) { FILE *File; char szReadOut[500], szToken[]="\t", *Token, szBuffer[1500], szBufferCopy[1500]; bool fFirst=true, fWord=false; int nA=0, Test=0, anFiles[500], nK=0, i, QuantityFiles=0; File = fopen(gszIndex, "r"); if((File!=0)&&(strstr(szSearchCriterion, "and"))) { while(fgets(szBuffer, 1500, File)) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); strcpy(szReadOut, Token); if(fFirst==true) { VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles, szSearchCriterion, fFirst); for(i=0; i<500; i++) { if(anFiles[i]!=0) fFirst = false; } } else if(fFirst==false) { VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles, szSearchCriterion, fFirst); } } fclose(File); for(i=0; i<500; i++) { if(anFiles[i]!=0) { fWord = true; QuantityFiles++; } } if(fWord==true) { if(nSearchedWords==1) cout << "Das Wort "; else cout << "Die Woerter "; for(i=0; i<nSearchedWords; i++) { if(i==0) cout << szInput[i]; if(i>0) cout << " & " << szInput[i]; } if(nSearchedWords==1) { if(QuantityFiles==1) cout << " kommt in folgender Datei vor:\n\n" << endl; else cout << " kommt in folgenden Dateien vor:\n\n" << endl; } else { if(QuantityFiles==1) cout << " kommen in folgender Datei vor:\n\n" << endl; else cout << " kommen in folgenden Dateien vor:\n\n" << endl; } OutAnd(anFiles); } else { cout << "Leider wurden die Woerter nicht zusammen in einer Datei gefunden!" << " Versuchen Sie" " bitte einmal die Suche mit 'or' oder waehle Sie andere Suchbegriffe!" << endl; } } else if((File!=0)&&(strstr(szSearchCriterion, "or"))) { while(fgets(szBuffer, 1500, File)) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); strcpy(szReadOut, Token); for(i=0; i<nSearchedWords; i++) { if(_stricmp(szReadOut, szInput[i])==0) { cout << "Das Wort " << szInput[i] << " kommt in folgender/folgenden Datei/Dateien vor: "; VerifyOr(szBuffer, anFiles); OutOr(anFiles); cout << "\n"; } } } cout << "\n\n" << VER_PRODUCTNAME_STR << " " << VER_PRODUCTVERSION_STR << " " << VER_LEGALCOPYRIGHT_STR << " " << NAME; fclose(File); } else { cout << "Index Datei existiert nicht. Bitte führen Sie zunächst die Index-Erstell-Programm aus!\n\n"; } cout << "\n"; } Der funktioniert unter Windows einwandfrei. Wenn ich den unter Unix compilieren will, dann sagt er mir allerdings 'implicit declaration of function 'int _stricmp(...)'. Warum, und wie kann ich den Compiler dazu bekommen es zu compilieren? Bine Zitieren
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 Lass mal den Unterstrich weg... Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Das ist es nicht! Der Befehl strimpc bzw. _stricmp funktioniert nicht unter Unix. Ist dort nicht bekannt. Das gleiche unter Unix bekommt man mit 'strcasecmp' hab ich jetzt herusgefunden! Aber wie sieht es mit toupper, tolower bzw. _strlwr und _strupr aus??? Kannst Du mir da helfen? Ich finde da einfach nichts zu! Bine Zitieren
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 toupper und tolower sollten funktionieren. Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Hmm, aber wie??? Ich habe da ein Array xy[10]. Da hinein schreibe ich sachen die über sie CommandLine mit übergeben wurde. Danach will ich alles auf Lower setzen. Wie mache ich das dann? Bine Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Ach so, das Array ist vom Typ char! Bine Zitieren
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 char* p = xy; while( *p ) { *p = tolower( *p ); p++; }[/CODE] Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Hmm, zweidimensionales Array! Und er sagt mir beim compilieren: assignment to 'char *' from 'char (*)[...]' Was darf ich damit anfangen? Bine Zitieren
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 Original geschrieben von Woodstock Hmm, zweidimensionales Array! Kann ich ja nicht riechen In dem Fall musst Du noch eine Schleife drumherum packen: for( int i=0; i<stringanzahl; i++ ) { char* p = stringarray[i]; while( *p ) { *p = tolower( *p ); p++; } }[/CODE] Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Was bedeutet das p++ in Deinem Queltext? Willst Du den Pointer erhöhen??? Bine Zitieren
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 Original geschrieben von Woodstock Was bedeutet das p++ in Deinem Queltext? Willst Du den Pointer erhöhen???Jepp Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Hmm, es klappt auch, aber warum tust Du das? Bine Zitieren
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 Original geschrieben von Woodstock Hmm, es klappt auch, aber warum tust Du das? Wenn ich einen Zeiger, der auf ein Element eines Arrays zeigt, inkrementiere, zeigt er danach auf das nächste Element des Arrays. So gehe ich Zeichen für Zeichen durch den String. Das Zeichen selbst erhalte ich, wenn ich den Zeiger dereferenziere (*p). Wenn *p Null ist, dann ist das Ende des Strings erreicht, und ich kann aufhören. Man hätte das ganze auch mit Indexoperatoren machen können: for( int i=0; i<stringanzahl; i++ ) { int j=0; while( stringarray[i][j] ) { stringarray[i][j] = tolower( stringarray[i][j] ); j++; } }[/CODE] Letztendlich ist es dasselbe. Zitieren
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Ok, jetzt is es klar. Kannte ich nur noch nicht so! Danke Dir! Bine Zitieren
Woodstock Geschrieben 19. Juni 2002 Autor Geschrieben 19. Juni 2002 Hab dazu noch ein Problem: Also, ich habe folgende Quelltexte (unter Windows):#include "WordSearch.h" /* Index.idx wird geöffnet, existiert diese nicht wird das Programm mit dem Hinweis die Index Datei existiere nicht, und müsse erstellt werden beendet! Erste Unterscheidung: and || or: bei Beiden: Datei wird nach Wörter ausgelesen (zahlen werden abgeschnitten) bei and: VerifyAnd wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden: Aufruf OutAnd bei or: VerifyOr wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden: Aufruf OutOr */ void ReadOut(char szInput[][1001], int &nSearchedWords, char szSearchCriterion[50]) { FILE *File; char szReadOut[500], szToken[]="\t", *Token, szBuffer[1500], szBufferCopy[1500]; bool fFirst=true, fWord=false; int nA=0, anFiles[500], nK=0, i, QuantityFiles=0; File = fopen(gszIndex, "r"); if((File!=0)&&(strstr(szSearchCriterion, "and"))) { while(fgets(szBuffer, 1500, File)) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); strcpy(szReadOut, Token); if(fFirst==true) { VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles, szSearchCriterion, fFirst); for(i=0; i<500; i++) { if(anFiles[i]!=0) fFirst = false; } } else if(fFirst==false) { VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles, szSearchCriterion, fFirst); } } fclose(File); for(i=0; i<500; i++) { if(anFiles[i]!=0) { fWord = true; QuantityFiles++; } } if(fWord==true) { if(nSearchedWords==1) cout << "Das Wort "; else cout << "Die Woerter "; for(i=0; i<nSearchedWords; i++) { if(i==0) cout << szInput[i]; if(i>0) cout << " & " << szInput[i]; } if(nSearchedWords==1) { if(QuantityFiles==1) cout << " kommt in folgender Datei vor:\n\n" << endl; else cout << " kommt in folgenden Dateien vor:\n\n" << endl; } else { if(QuantityFiles==1) cout << " kommen in folgender Datei vor:\n\n" << endl; else cout << " kommen in folgenden Dateien vor:\n\n" << endl; } OutAnd(anFiles); } else { cout << "Leider wurden die Woerter nicht zusammen in einer Datei gefunden!" << " Versuchen Sie" " bitte einmal die Suche mit 'or' oder waehle Sie andere Suchbegriffe!" << endl; } } else if((File!=0)&&(strstr(szSearchCriterion, "or"))) { while(fgets(szBuffer, 1500, File)) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); strcpy(szReadOut, Token); for(i=0; i<nSearchedWords; i++) { if(stricmp(szReadOut, szInput[i])==0) { cout << "Das Wort " << szInput[i] << " kommt in folgender/folgenden Datei/Dateien vor: "; VerifyOr(szBuffer, anFiles); OutOr(anFiles); cout << "\n"; } } } cout << "\n\n" << VER_PRODUCTNAME_STR << " " << VER_PRODUCTVERSION_STR << " " << VER_LEGALCOPYRIGHT_STR << " " << NAME; fclose(File); } else { cout << "Index Datei existiert nicht. Bitte führen Sie zunächst die Index-Erstell-Programm aus!\n\n"; } cout << "\n"; } und #include "WordSearch.h" /* Bei 1. Aufruf: Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die zugehörigen Zeilennummern (aus szBuffer) in das Array anFiles geschrieben. Bei weiteren Aufrufen: Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die Zahlen die nicht mit denen aus dem ersten (oder anderen vorhergehenden Durchläufen) übereinstimmen wegnommen. */ void VerifyAnd(int &nSearchedWords, char szInput[][1001], char *szReadOut, char *szBuffer, int *anFiles, char *szSearchCriterion, bool &fFirst) { int i = 0, nToken = 0; int nFiles2[500], nFiles3[500], nFiles4[500]; int j = 0, k, i3 = 0, i2 = 0, i1; char *Token, szToken[]="\t", szBufferCopy[1000]; bool fFound = false, fFound2=false;; for(i=0; i<500; i++) nFiles3[i] = anFiles[i]; strcpy(szBufferCopy, szBuffer); for(i2=0; i2<nSearchedWords; i2++) { if(stricmp(szReadOut, szInput[i2])==0) { while(i3<nSearchedWords) { Token = strtok(szBufferCopy, szToken); while(Token!=0) { nToken = atoi(Token); if(nToken!=0) { if(fFirst==true) { nFiles4[j] = nToken; j++; } if(fFirst==false) { nFiles2[j] = nToken; j++; } } Token = strtok(NULL, szToken); } i3++; } // while j=0; if(fFirst==false) { for(i=0; i<500; i++) { for(k=0; k<500; k++) { if(anFiles[i]==nFiles2[k]) { for(i1=0; i1<500; i1++) { if((nFiles3[i1])!=(anFiles[i])) fFound = true; } if(fFound==true) { nFiles4[j] = anFiles[i]; j++; } fFound=false; } } } } for(i=0; i<500; i++) { anFiles[i] = 0; } j=0; for(i=0; i<500; i++) { anFiles[j] = nFiles4[i]; j++; } } // if } // for } Habe diese Texte (alle anderen aus dem Programm sind im Moment nicht interessant) für Unix umgeschrieben. Sehe jetzt so aus: [folgt im nächsten Beitrag wegen Überlänge!] Zitieren
Woodstock Geschrieben 19. Juni 2002 Autor Geschrieben 19. Juni 2002 #include "WordSearch.h" /* Index.idx wird geöffnet, existiert diese nicht wird das Programm mit dem Hinweis die Index Datei existiere nicht, und müsse erstellt werden beendet! Erste Unterscheidung: and || or: bei Beiden: Datei wird nach Wörter ausgelesen (zahlen werden abgeschnitten) bei and: VerifyAnd wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden: Aufruf OutAnd bei or: VerifyOr wird aufgerufen (nach jedem Wort), sind alle Wörter überprüft worden: Aufruf OutOr */ void ReadOut(char szInput[][1001], int &nSearchedWords, char szSearchCriterion[50]) { FILE *File; char szReadOut[500], szToken[]="\t", *Token, szBuffer[1500], szBufferCopy[1500]; bool fFirst=true, fWord=false; int nA=0, anFiles[500], nK=0, i, QuantityFiles=0; File = fopen(gszIndex, "r"); if((File!=0)&&(strstr(szSearchCriterion, "and"))) { while(fgets(szBuffer, 1500, File)) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); strcpy(szReadOut, Token); if(fFirst==true) { VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles, szSearchCriterion, fFirst); for(i=0; i<500; i++) { if(anFiles[i]!=0) fFirst = false; } } else if(fFirst==false) { VerifyAnd(nSearchedWords, szInput, szReadOut, szBuffer, anFiles, szSearchCriterion, fFirst); } } fclose(File); for(i=0; i<500; i++) { if(anFiles[i]!=0) { fWord = true; QuantityFiles++; } } if(fWord==true) { if(nSearchedWords==1) cout << "Das Wort "; else cout << "Die Woerter "; for(i=0; i<nSearchedWords; i++) { if(i==0) cout << szInput[i]; if(i>0) cout << " & " << szInput[i]; } if(nSearchedWords==1) { if(QuantityFiles==1) cout << " kommt in folgender Datei vor:\n\n" << endl; else cout << " kommt in folgenden Dateien vor:\n\n" << endl; } else { if(QuantityFiles==1) cout << " kommen in folgender Datei vor:\n\n" << endl; else cout << " kommen in folgenden Dateien vor:\n\n" << endl; } OutAnd(anFiles); } else { cout << "Leider wurden die Woerter nicht zusammen in einer Datei gefunden!" << " Versuchen Sie" " bitte einmal die Suche mit 'or' oder waehle Sie andere Suchbegriffe!" << endl; } } else if((File!=0)&&(strstr(szSearchCriterion, "or"))) { while(fgets(szBuffer, 1500, File)) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); strcpy(szReadOut, Token); for(i=0; i<nSearchedWords; i++) { if( strcasecmp(szReadOut, szInput[i])==0) { cout << "Das Wort " << szInput[i] << " kommt in folgender/folgenden Datei/Dateien vor: "; VerifyOr(szBuffer, anFiles); OutOr(anFiles); cout << "\n"; } } } cout << "\n\n" << VER_PRODUCTNAME_STR << " " << VER_PRODUCTVERSION_STR << " " << VER_LEGALCOPYRIGHT_STR << " " << NAME; fclose(File); } else { cout << "Index Datei existiert nicht. Bitte führen Sie zunächst die Index-Erstell-Programm aus!\n\n"; } cout << "\n"; } und#include "WordSearch.h" /* Bei 1. Aufruf: Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die zugehörigen Zeilennummern (aus szBuffer) in das Array anFiles geschrieben. Bei weiteren Aufrufen: Stimmt das gefundene Wort (aus szBuffer) mit einem gesuchten Wort überein, werden die Zahlen die nicht mit denen aus dem ersten (oder anderen vorhergehenden Durchläufen) übereinstimmen wegnommen. */ void VerifyAnd(int &nSearchedWords, char szInput[][1001], char *szReadOut, char *szBuffer, int *anFiles, char *szSearchCriterion, bool &fFirst) { int i = 0, nToken = 0; int nFiles2[500], nFiles3[500], nFiles4[500]; int j = 0, k, i3 = 0, i2 = 0, i1; char *Token, szToken[]="\t", szBufferCopy[1000]; bool fFound = false, fFound2=false;; for(i=0; i<500; i++) nFiles3[i] = anFiles[i]; strcpy(szBufferCopy, szBuffer); for(i2=0; i2<nSearchedWords; i2++) { if( strcasecmp(szReadOut, szInput[i2])==0) { while(i3<nSearchedWords) { Token = strtok(szBufferCopy, szToken); while(Token!=0) { nToken = atoi(Token); if(nToken!=0) { if(fFirst==true) { nFiles4[j] = nToken; j++; } if(fFirst==false) { nFiles2[j] = nToken; j++; } } Token = strtok(NULL, szToken); } i3++; } // while j=0; if(fFirst==false) { for(i=0; i<500; i++) { for(k=0; k<500; k++) { if(anFiles[i]==nFiles2[k]) { for(i1=0; i1<500; i1++) { if((nFiles3[i1])!=(anFiles[i])) fFound = true; } if(fFound==true) { nFiles4[j] = anFiles[i]; j++; } fFound=false; } } } } for(i=0; i<500; i++) { anFiles[i] = 0; } j=0; for(i=0; i<500; i++) { anFiles[j] = nFiles4[i]; j++; } } // if } // for }aus. Unter Windows bekomme ich genau die Ausgabe (steht in einer anderen Funktion, greift aber auch das hier erstellte Array zu, also muss hier schon was falsche reingeschrieben worden sein). Und zwar möchte ich das wenn diese Wörter zusammen in einer Datei stehen mir diese Datei einmal ausgegeben wird. Dasklappt aber nicht immer. Die erste Datei gibt er mir genau so oft aus, wie die beiden Wörter vorkommen, und nicht nur insgesamt einmal. Kann mir da wer helfen? Bine Zitieren
Klotzkopp Geschrieben 19. Juni 2002 Geschrieben 19. Juni 2002 Ich habe jetzt eine halbe Stunde lang versucht zu verstehen, was dieser Code macht. Leider ist die Wahl der Variablennamen "unglücklich" (unseren Praktikanten würde ich die Ohren langziehen ), die Kommentare im Code sind, sagen wir, sparsam gesetzt, und einige Verwirrungstaktiken hast Du auch eingesetzt (Variablen als Referenz übergeben, obwohl sie nicht verändert werden). Ehrlich, ich steig nicht durch. Villeicht beschreibst Du mal, wie die Funktionen im Detail funktionieren *sollen*. Eins ist mir aufgefallen: Das hier: for(i=0; i<500; i++) { anFiles[i] = 0; } j=0; for(i=0; i<500; i++) { anFiles[j] = nFiles4[i]; j++; } [/CODE] ist m.M.n nichts anderes als: [CODE]for(i=0; i<500; i++) { anFiles[i] = nFiles4[i]; } Zitieren
Woodstock Geschrieben 19. Juni 2002 Autor Geschrieben 19. Juni 2002 Hmm, ok, mache ich gleich von zu Hause aus. Das mit der Referenz kann daher kommen, das die Funktion umgeschrieben würde, weil sie früher anders funktioniert hat, und ich habe eine extra Kommentar Datei. Aber ich gebe mich nachher mal dran. Danke Dir schonmal. Bine Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.