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

zwracanie przez funkcje tablicy dwuwymiarowej

Ostatnio zmodyfikowano 2020-08-09 17:47
Autor Wiadomość
lewus
Temat założony przez niniejszego użytkownika
zwracanie przez funkcje tablicy dwuwymiarowej
» 2020-08-08 14:14:38
Witam
Potrzebuje wysłać do funkcji tablice 2-wymiarową, następnie zwrócić ją do funkcji main. Program działa na tablicy 1-wymiarowej, ale po dodaniu drugiego wymiaru pojawia się błąd: C2664 „int **fun(int *[])”: nie można dokonać konwersji argumentu 1 z „int [2][2]” do „int *[]”. Problem pojawia się w miejscu wywolania funkcji fun.



C/C++
#include <iostream>

using namespace std;

int ** fun( int ** t )

{
    t[ 0 ][ 0 ] += 1;
    t[ 1 ][ 0 ] += 2;
    return t;
}

int main()
{
    int tab[ 2 ][ 2 ] =
    {
        { 11, 12 },
        { 13, 14 },
    };
   
    fun( tab );
    cout << tab[ 0 ][ 0 ] << " " << tab[ 1 ][ 0 ];
    return 0;
}
P-177433
pekfos
» 2020-08-09 09:28:43
C/C++
int tablica[ 100 ][ 2 ];
int( * wskaznik )[ 2 ] = tablica;
Nie zapomnij o nawiasie, zmienia tu całkowicie typ wskaźnika. Wskaźnik na tablicę wielowymiarową ma zakodowane w swoim typie rozmiary drugiego i następnych wymiarów, więc coś takiego zadziała tylko dla tablic int[N][2].
P-177436
lewus
Temat założony przez niniejszego użytkownika
» 2020-08-09 13:58:51
Dzięki za wskazówke. Czy mógłbyś napisać jak powinien teraz wyglądać naglówek funkcji? Czy coś trzeba zmienić w wywołaniu funkcji albo w jej ciele?
P-177437
pekfos
» 2020-08-09 15:49:25
Trzeba zmienić typy argumentu i wartości zwracanej. Argument jest prosty, taki wskaźnik dokładnie jak podałem. Co do wartości zwracanej przez ten nawias składnia może wyglądać dziwnie:
C/C++
int( * funkcja( int( * tab )[ 2 ] ) )[ 2 ]
{
    // ...
    return tab;
}
W tej sytuacji lepiej może zdefiniować alias na typ wskaźnika
C/C++
typedef int( * wskTabNx2 )[ 2 ];

wskTabNx2 funkcja( wskTabNx2 tab )
{
    return tab;
}

Tak na marginesie, nie zwracasz tu tablicy, tylko wskaźnik który dostałeś przez argument, wiec w zasadzie zwracanie tu czegokolwiek jest zbędne.
P-177438
lewus
Temat założony przez niniejszego użytkownika
» 2020-08-09 16:09:09
Dzięki, działa. A co oznacza ta ostatnia [2]? Pierwszy wymiar tablicy?
P-177439
pekfos
» 2020-08-09 17:07:53
Drugi wymiar tablicy. Wspominałem o tym w pierwszym poście. Wskaźnik na tablicę N-wymiarową, wskazuje na tablicę (N-1)-wymiarową, w tym sensie że (N-1)-wymiarowa tablica jest wskazywanym elementem:
C/C++
#include <iostream>

int main()
{
    int( * p )[ 100 ];
    std::cout << sizeof * p << '\n';
}
400
Wskaźnik wskazuje na jeden element, ale równie dobrze może to być sekwencja takich elementów. Wynikiem wskaznik[i] jest odniesienie do jakiejś (N-1)-wymiarowej tablicy w pamięci i można pisać po tym dalsze [] żeby ją indeksować, ale żeby w ogóle dało się napisać wskaznik[i] musi być znany rozmiar wskazywanego elementu (więc wymiary 2..N). Z tego samego powodu tworząc nową tablicę wielowymiarową można pominąć pierwszy wymiar, a kompilator wydedukuje jego wartość na podstawie danych podanych do inicjalizacji.
C/C++
int a[][ 2 ] = /// ileś tablic jednowymiarowych o dwóch elementach
{
    1, 2, 3, 4 //, ...
};
P-177440
lewus
Temat założony przez niniejszego użytkownika
» 2020-08-09 17:47:49
Dzięki za pomoc. Pisze pokera i teraz elegancko sortuje karty funkcją. Bez tablic i wskaźników ani rusz.
P-177441
« 1 »
  Strona 1 z 1