Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Problem z przesłaniem tablicy obiektów do funkcji

Ostatnio zmodyfikowano 2015-10-11 18:56
Autor Wiadomość
emSon
Temat założony przez niniejszego użytkownika
[C++] Problem z przesłaniem tablicy obiektów do funkcji
» 2015-10-11 17:10:18
Cześć.

Mam funkcje strzal(), którą wywołuje tak:

C/C++
strzal( pole, zajetePola );

Wywołanie jest zawarte w int main(), to chyba oczywiste.
Jej deklaracja znajduje się w pliku klasy.h:

C/C++
void strzal( Pole * x[], int & z );

Jest zaprzyjaźniona z klasą Pole:

C/C++
friend void strzal( Pole * x[], int & z );

Sama funkcja wygląda tak:

C/C++
void strzal( Pole * x[], int & z )
{
    ...
}

Treść błędu:


error: cannot convert 'Pole*' to 'Pole**' for argument '1' to 'void strzal(Pole**, int&)'|

Co jest źle ;) ?
P-138423
Gibas11
» 2015-10-11 17:25:03
Funkcja oczekuje wskaźnika na tablicę obiektów "Pole", zamiast:
C/C++
void strzal( Pole * x[], int & z );
użyj tego:
C/C++
void strzal( Pole x[ n ], int & z );
n - rozmiar tablicy, lub tego:
C/C++
void strzal( Pole * x, int & z );
P-138424
emSon
Temat założony przez niniejszego użytkownika
» 2015-10-11 17:43:10
Obydwa sposoby się kompilują, jednak funkcja nie zmienia atrybutów obiektu Pole.

C/C++
if( x[ s ].zajete == true )
{
    cout << "Trafiono statek ID: " << x[ s ].adres << endl;
    x[ s ].proba == true;
    x[ s ].trafiony == true;
    z--;
}

To jest fragment funkcji, który przypisuje wartość true atrybutom proba i trafiony.

C/C++
cout << x[ s ].proba;

Po dodaniu tego cout'a na koniec kodu wychodzi wartość "0", co oznacza, że funkcja pracuje na kopii tablicy, a nie na oryginale.

Czemu tak się dzieje?
P-138428
Gibas11
» 2015-10-11 18:03:43
Źle musi być coś po drodze, musisz ustawiać to z powrotem na false gdzieś indziej, albo odwołujesz się do złego elementu, trudno powiedzieć bo nie mam całego kodu. Generalnie na pewno pracujesz na oryginale, bo przekazując tablicę, zawsze przekazujesz wskaźnik na nią a nie samą zawartość.
P-138432
emSon
Temat założony przez niniejszego użytkownika
» 2015-10-11 18:25:10
Czytaj uważnie. Napisałem, że dodałem cout'a po tym ifie, co oznaczałoby, że kod wygląda tak:

C/C++
if( x[ s ].zajete == true )
{
    cout << "Trafiono statek ID: " << x[ s ].adres << endl;
    x[ s ].proba == true;
    x[ s ].trafiony == true;
    z--;
    cout << x[ s ].proba;
}

Już w tym momencie cout wyświetla 0, czyli fałsz. Mało prawdopodobne by funkcja pracowała na oryginale, skoro dwie linijki później prawda staje się fałszem.
P-138435
Lora
» 2015-10-11 18:31:32
Może dlatego, że nie używasz operatora przypisania?
P-138436
Gibas11
» 2015-10-11 18:36:07
No rzeczywiście, powinienem był czytać uważnie, że też nie zauważyłem twojej pomyłki w operatorach. :P
P-138438
emSon
Temat założony przez niniejszego użytkownika
» 2015-10-11 18:56:57
O losie, faktycznie! Prościutki błąd. Teraz działa, dzięki!
P-138440
« 1 »
  Strona 1 z 1