Array von einer Funktion zur anderen - wie?



  • Hallo allerseits. Ich habe hier ein Programm mit zwei Funktionen. Eine davon sammelt ein int Array, das die zweite Funktion wiederum verwendet. Nachdem ich jetzt alles mögliche ausprobiert habe und meine Denkblockade anscheinend gerade zu groß ist, als dass ich auf eine Lösung käme, frage ich einfach mal hier nach:

    Wie schaffe ich es, das Array von einer zur anderen Funktion zu bekommen?

    Das ganze sieht wie folgt aus:

    void kmp_prefix_table(char *w) {
    	int n = 8;
    	int i = 0;
    	int j = -1;
    	int N[2000];
    
    	N[i] = j;
    
    	while (i < n) {
    		while (j >= 0 && w[j] != w[i]) {
    			j = N[j];
    		}
    		i++;
    		j++;
    		N[i] = j;
    	}
    }
    
    void kmp_search(char *t, int m, char *w) {
    
    	kmp_prefix_table(w);
    	int *N = &N[0];
    
    	cout << N[1] << endl;
    
    	int n = 8;
    	int i = 0;
    	int j = 0;
    
    	while (i < m) {
    		while (j >= 0 && t[i] != w[j]) {
    			j = N[j];
    		}
    
    		i++;
    		j++;
    
    		if (j == n) {
    			cout << i - n << endl;
    		}
    
    		j = N[j];
    	}
    }
    

    Von der ersten Funktion soll nun das Array N an die zweite Funktion weitergegeben werden. Wie schaffe ich das?

    Danke für jede eventuelle Hilfe.



  • void kmp_prefix_table(char *w, std::vector<int>& N)
    {
        // ...
    }
    
    void kmp_search(char *t, int m, char *w, const std::vector<int>& N)
    {
        // ...
    }
    

    Aufruf:

    std::vector<int> N;
    kmp_prefix_table (w, N);
    kmp_search (t, m, w, N);
    


  • nimm anstatt von
    "void kmp_prefix_table(char w)"
    eben
    "int
    kmp_prefix_table(char *w)"
    und schreib am ende rein
    "return N;"

    dann wo du das array benutzen willst:
    N = kmp_prefix_table(BLA);
    und N normal benutzen



  • ä schrieb:

    nimm anstatt von
    "void kmp_prefix_table(char w)"
    eben
    "int
    kmp_prefix_table(char *w)"
    und schreib am ende rein
    "return N;"

    dann wo du das array benutzen willst:
    N = kmp_prefix_table(BLA);
    und N normal benutzen

    Wobei noch zu erwähnen ist, daß das Array innerhalb der Funktion mit new erzeugt werden muß (bloß nicht Zeiger auf lokale Variable zurückgeben!). Außerdem muß das Array irgendwo wieder mit delete [] freigegeben werden. Und darüber hinaus, unterläuft ein nacktes Array leicht die Exception Sicherheit, weswegen man oft einen try-catch-Block braucht. Schlußfolgerung: std::vector ist um Welten einfacher.



  • Ich würde das Array an beide Funktionen übergeben und es generell von aussen kommen lassen. Somit wird es eigentlich ziemlich egal ob man ein native array nimmt oder einen vector.

    btw.: der vector lässt es bei verwendung von op[] auch krachen und wirft nur bei at() eine entsprechende Exception.


Anmelden zum Antworten