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
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
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 toupper und tolower sollten funktionieren.
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
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Ach so, das Array ist vom Typ char! Bine
Klotzkopp Geschrieben 18. Juni 2002 Geschrieben 18. Juni 2002 char* p = xy; while( *p ) { *p = tolower( *p ); p++; }[/CODE]
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
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]
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Was bedeutet das p++ in Deinem Queltext? Willst Du den Pointer erhöhen??? Bine
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
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Hmm, es klappt auch, aber warum tust Du das? Bine
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.
Woodstock Geschrieben 18. Juni 2002 Autor Geschrieben 18. Juni 2002 Ok, jetzt is es klar. Kannte ich nur noch nicht so! Danke Dir! Bine
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!]
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
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]; }
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden