Strona 1 z 1

Przypisanie wiersza tablicy dwuwymiarowej do jednowymiarowej

: 15 grudnia 2009, 22:25
autor: piter
Przeczytałem w kursie C++ "Od zera do gier kodera", że można przypisać wiersz tablicy dwuwymiarowej do jednowymiarowej w następujący sposób:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main()
{
	unsigned aTab2D[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
	unsigned aTab1D[3];
	
	aTab1D = aTab2D[0];
}
Jednak przy próbie skompilowania otrzymuje błąd:

Kod: Zaznacz cały

kod.cc:9: error: invalid array assignment

: 15 grudnia 2009, 22:58
autor: mq
Coś takiego to mógłbyś (chyba) zrobić w javie, gdzie zmienne aTab2D i aTab1D byłyby referencjami (ruchomymi). W c++ to również są referencje, ale nieruchome, nie możesz ich sobie tak po prostu przypisywać. Z tego co wiem o c++, to przepisania zawartości jednej tablicy (albo jej części) do innej trzeba dokonać w pętli.

: 15 grudnia 2009, 23:06
autor: beel
To może stronę podasz na której to przeczytałeś w tym kursie?

: 15 grudnia 2009, 23:28
autor: Rafal_F
W C++ nie można zmieniać adresu na który wskazuje nazwa tablicy. Więc albo przypisanie zrobisz w pętli, albo zmienną aTab1d zrobisz wskaźnikiem na unsigned a nie tablicą:

Kod: Zaznacz cały

#include <iostream>

using namespace std;

int main()
{
    unsigned aTab2D[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
    unsigned *aTab1D;

    aTab1D = aTab2D[0];
}

: 16 grudnia 2009, 09:35
autor: piter
beel napisał:
To może stronę podasz na której to przeczytałeś w tym kursie?
Kurs znajduje się tu:
http://www.gamedev.pl/files/articles/me ... %20C++.pdf

Strona nr 122

[ Dodano: |16 Gru 2009|, 2009 22:05 ]
Rafal_F napisał:
W C++ nie można zmieniać adresu na który wskazuje nazwa tablicy. Więc albo przypisanie zrobisz w pętli, albo zmienną aTab1d zrobisz wskaźnikiem na unsigned a nie tablicą
Pętla jest chyba najbardziej oczywistym rozwiązaniem, które jako pierwsze nasunęło mi się na myśl. Przykład, który podałem jest bardzo prosty - wystarczy zastosować jedną pętle. Sytuacja komplikuje się gdy tablice będą miały więcej wymiarów - wtedy trzeba robić pętle w pętli np:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main()
{
	unsigned aTab3D[2][2][2] = { { {1, 2}, {3, 4} }, { {5, 6}, {7, 8} } };
	unsigned aTab2D[2][2];
	
	for (unsigned i = 0; i < 2; ++i) for (unsigned j = 0; j < 2; ++j) aTab2D[i][j] = aTab3D[0][i][j];
}
Rozwiązanie podane w kursie:

Kod: Zaznacz cały

aTab2D = aTab3D[0];
jest znacznie prostsze niż użycie kilku pętli:

Kod: Zaznacz cały

for (unsigned i = 0; i < 2; ++i) for (unsigned j = 0; j < 2; ++j) aTab2D[i][j] = aTab3D[0][i][j];
Niestety nie działa.