Zamiana karpa rabina na przypadek 2D

0

Mam problem z zamianą karpa rabina na 2D oraz z wywołaniem funkcji.
Oto kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int licznik = 0;
int pozycja_x = 0;
int pozycja_y = 0;
int w1 = 84, k1 = 13;
int w2 = 9, k2 = 3;

int _hash(int start, int start2, int ile, int ile2, char **tab)
{
    int suma = 0;
    for(int i = 0; i < start + ile; i++)
        for(int j = 0; j < start2 + ile2; j++)
            suma += tab[i][j];
    return suma;
}

int wyszukanieKR(char **tekst, char **wzorzec)
{
    int hash_wzorzec = _hash(0, 0, w2, k2, wzorzec);
    int hash_tekst = 0;
    int *wspolrzedne = new int[2];
    wspolrzedne[0] = pozycja_x;
    wspolrzedne[1] = pozycja_y;

    for(int i = 0; i < w1; i++)
    {
        for(int j = 0; j < k1; j++)
        {
            hash_tekst = _hash(i, j, 0, 0, tekst);
            if(hash_wzorzec == hash_tekst)
            {
                bool znalazlem=0;
                for (int k = 0; k < w2; k++)
                {
                    for (int l = 0; l < k2; l++)
                    {
                        if (tekst[k+pozycja_x][l+pozycja_y] != wzorzec[k][l])
                            break;
                        if(k ==w2-1 && l == k2-1)
                            znalazlem = 1;
                    }
                }
                if(znalazlem)
                {
                    return *wspolrzedne;
                }
                licznik = licznik+1;
            }
            pozycja_x++;
        }
        pozycja_x = 0;
        pozycja_y++;
    }

    return *wspolrzedne;
}

int main()
{
    char tekst[w1][k1];
    char wzorzec[w2][k2];

    ifstream macierz1("macierz1.txt");
    for(int i = 0; i < w1; i++)
        for(int j = 0; j < k1; j++)
            macierz1 >> tekst[i][j];

    for(int i = 0; i < w1; i++)
    {
        for(int j = 0; j < k1; j++)
            cout << tekst[i][j] << " ";
        cout <<endl;
    }

    ifstream macierz2("macierz2.txt");
    for(int i = 0; i < w2; i++)
        for(int j = 0; j < k2; j++)
            macierz2 >> wzorzec[i][j];

    for(int i = 0; i < w2; i++)
    {
        for(int j = 0; j < k2; j++)
            cout << wzorzec[i][j] << " ";
        cout <<endl;
    }

    wyszukanieKR(tekst, wzorzec);

    //cout << "Suma wzorca: " << _hash(wzorzec, 0,4) << endl;
    //cout << "Licznik:" << licznik;

    return 0;
}

W kompilatorze generuje się błąd:
cannot convert 'char (*)[k1]' to 'char**' for argument '1' to 'int wyszukanieKR(char**, char**)'|
i niestety nie potrafię poradzić sobie z tym...

0

Co to znaczy zamiana Karpa Rabina na przypadek 2D?

0

chodzi o zastosowanie algorytmu Rabina-Karpa przy wyszukiwaniu wzorca w tablicy dwuwymiarowej

0

Uważasz, że założenie nowego tematu z tym samym problemem w innym dziale przyniesie inny rezultat od poprzedniego? Algorytm Karpa Rabina - problem z kompilacją

Dalej błędnie przekazujesz dwuwymiarowe tablice do funkcji. Poza tym w tej funkcji chcesz zwracać dwa argumenty, a zwracasz jeden. Alokujesz dynamicznie pamięć (Po co? Skoro tam zawsze będą 2 wartości?), i nigdzie potem jej nie zwalniasz.

int wyszukanieKR(char **tekst, char **wzorzec)
{
    int *wspolrzedne = new int[2];
 
    ...

   return *wspolrzedne;
}

Jak chcesz zwrócić dwie wartości z funkcji, to możesz:

  1. zwrócić wartości przez wskaźniki;
  2. zwrócić wartości przez referencje;
  3. stworzyć własny typ złożony;
  4. skorzystać z istniejącego typu złożonego jak np.:
  • std::pair
  • std::array
  • std::vector
  • std::tuple

1 użytkowników online, w tym zalogowanych: 0, gości: 1