wskazniki blad invalid converstion int to int

0

Witam,
Zacząłem przygodę ze wskaźnikami. Utworzyłem dynamiczną tablicę i chcę jej zawartość przekazać do funkcji. W miejscu wywołania funkcji wyrzuca mi błąd. Nie rozumiem w czym jest problem czy ktoś może mnie nakierować?
Poniżej kod:

#include <iostream>

using namespace std;

bool warunek(int n, int tab[]){
    cout<<"test"<<endl;
    for(int j=0; j<n; j++){
        if(tab[j]<2)
            return false;
        for(int i=0; i<2; i++)
            if(tab[j]%2==0)
            return false;
    return true;
    }
}

int main()
{
    int n;
    cin >>n;
    int *tab = new int[n];
    for(int i=0;i<n;i++){
        cin >>tab[i];
    }
    for(int i=0;i<n;i++){
    warunek(n,*tab);
    }
    return 0;
}

2

Przekaż to jako

warunek(n, tab);

*tab przekazujesz tylko element tablicy.

3

Składnia C++ jest strasznie zagmatwana jeśli chodzi o wskaźniki (szczególnie te wszystkie znaczenia symbolu *), ale warto sobie uzmysłowić parę rzeczy.

int* tab;

Deklarujesz zmienną o nazwie tab, która jest typu wskaźnikowego. Nazwa zmiennej to tab, nie *tab (z tego powodu wolę pisać int* tab niż int *tab, choć nie jest rozwiązanie pozbawione wad). Dlatego gdy przekazujesz tę zmienną, piszesz tab.

bool warunek(int n, int tab[])

Mówisz, że przekazujesz parametr tab, który jest tablicą, gdy tak naprawdę to nie jest prawdą. tab jest wskaźnikiem. To że wskazuje na ciągły obszar pamięci i może się zachowywać jak tablica nie oznacza, że jest tablicą. Ten kod niestety zadziała, bo kompilator w ramach tzw. decaying zamienia powyższy kod na

bool warunek(int n, int* tab)

ale warto pisać od razu poprawnie, a nie liczyć na jakąś magię, która przypadkiem sprawia że nasz kod działa.

1

Do tego co napisali poprzednicy dodałbym, że jeśli alokujesz gdzieś pamięć, to należy pamiętać by ją zwolnić.... No i jeśli nie masz potrzeby aby rzeczywiście w jawny sposób dynamicznie alokować pamięć, uzyj std::vector, lub inny standardowy kontener (w zależności od potrzeb)

0

Dziekuje za wszystkie odpowiedzi. Oczywiście nie mogę zapominać o zwalnianiu pamięci poprzez delete. Troche przerobilem kod w ktorym niestety petla w warunku wykonuje sie tylko raz. Rozumiem ze funkcja przerywa działanie po zwróceniu wartosci. Jak zmusic funkcje do kontunuacji sprawdzania warunkow dla reszty elementow tablicy?

bool warunek(int n, int *tab){
    int p=2;
    for(int j=0; j<n; j++){
        cout <<"Indeks wynosci: " <<j<<endl;
        if(tab[j]==p)
            return true;
        else if (tab[j]%p==0)
            return false;
        p+=1;
    }
}

int main()
{
    int n;
    cin >>n;
    int *tab = new int[n];
    for(int i=0;i<n;i++){
        cin >>tab[i];
    }
    for(int i=0;i<n;i++){
            if(warunek(n,tab)==true)
            cout<<"TAK"<<endl;
            else
                cout<<"NIE"<<endl;
    }
    delete [] tab;
    return 0;
}

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