C++ - nadanie wartości tablicy dwuwymiarowej

C++ - nadanie wartości tablicy dwuwymiarowej
verijon
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:47
0

Zadeklarowałem tablicę dwuwymiarową

Kopiuj
 
int SiatkaKlocka[4][4] = {0};

dlaczego nie mogę nadać jej wartości w ten sposób

Kopiuj
SiatkaKlocka[4][4] = {
{ 0, 1, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 1, 0, 0 },
};
 

Proszę o pomoc.

NJ
i to chyba w ogóle nie jest dozwolone. Od razu jak deklarujesz musisz wpisać tak wartości inaczej powinien być błąd kompilacji.
Gracu
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Białystok
1

bo deklarując tablicę zainicjowałeś już jej wartość elementu 0,0

verijon
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:47
0

A nie mogę potem w ten sposób zmieniać jej wartości?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
0

Nie, nie możesz.


Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
2

Z moich prób wynika, że można zrobić co najwyżej coś takiego

Kopiuj
    int tablica[2][2];
    memcpy(tablica, (const int[2][2]){{1,2},{3,4}}, 4*sizeof(int));

ale jest to strasznie brzydkie i pewnie może powodować problemy.

skorzystaj z std::array albo std::vector

2
Kopiuj
std::array<std::array<int, 4>, 4> tablica;
tablica = { {
	{ { 0, 1, 0, 0 } },
	{ { 0, 1, 0, 0 } },
	{ { 0, 1, 0, 0 } },
	{ { 0, 1, 0, 0 } },
} };

Jednakże, nie powinieneś zmieniać zawartość całej tablicy, jeżeli zmieniasz tylko kilka elementów.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
1

Jak się uprzesz to możesz sobie napisać funkcję, która w wygodny sposób będzie uzupełniać tablicę (niestety nie można przeładować operator= poza klasami), ale po co jeśli możesz użyć wygodniejszego std::array tak jak pokazał Aux?

Przerost formy nad treścią:

Kopiuj
template<typename L, typename R>
void fillWith(L& l, R const& r);

namespace b = boost;
template<typename L, typename R>
void fillWithImpl(L& l, R const& r, true_type){

	for(auto&& p: b::make_iterator_range(b::make_zip_iterator(b::make_tuple(begin(l), begin(r))),
										b::make_zip_iterator(b::make_tuple(end(l), end(r))))){
		fillWith(p.get<0>(), p.get<1>());
	}
}

template<typename L, typename R>
void fillWithImpl(L& l, R const& r, false_type){
	copy(begin(r), end(r), begin(l));
}

template<typename L, typename R>
void fillWith(L& l, R const& r){
	typedef typename remove_reference<L>::type l_t;
	fillWithImpl(l, r, integral_constant<bool,(rank<l_t>::value > 1)>{});
}

template<typename L, typename R>
void fillWith(L& l, initializer_list<R> r){
	typedef typename remove_reference<L>::type l_t;
	fillWithImpl(l, r, integral_constant<bool,(rank<l_t>::value > 1)>{});
}

template<typename L, typename R>
void fillWith(L& l, initializer_list<initializer_list<R>> r){
	typedef typename remove_reference<L>::type l_t;
	fillWithImpl(l, r, integral_constant<bool,(rank<l_t>::value > 1)>{});
}

Działanie: http://melpon.org/wandbox/permlink/OWIFIshragxpW82p


verijon
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:47
0

Dziękuję wszystkim za odpowiedź poradziłem sobie z kodem Auxa, ale mam jeszcze jedno takie pytanie, piszę grę Tetris i chciałbym, żeby gracz mógł wybrać ile pól będzie miała plansza, a tworząc normalną tablicę muszę od razu podać ile będzie miała elementów lub stworzyć zmienną statyczną co odpada. Da się jakoś to ominąć?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:6 dni
1

Można jeszcze tak:

Kopiuj
#include <stdio.h>

struct Siatka { int Klocka[4][4]; };

int main()
  {
   struct Siatka siatka={{{0}}};
   
   printf("%d\n",siatka.Klocka[1][1]);
   
   siatka=(struct Siatka)
     {
	     {
	        { 0, 1, 0, 0 },
	        { 0, 1, 0, 0 },
	        { 0, 1, 0, 0 },
	        { 0, 1, 0, 0 },
	     }
     };
   printf("%d\n",siatka.Klocka[1][1]);
 
   return 0;
  }

http://ideone.com/hHHrg3


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.