Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Devils Never Cry

[Resolvido] Declaração/definição de arrays

Recommended Posts

Olá a todos. Sou programador Java há anos e iniciei recentemente em C++. Apesar de várias similaridades, ainda há algumas diferenças que não estou entendendo. Bem, vamos lá:

 

Tenho um array bidimensional declarado em uma determinada classe, mas não quero atribuir seu valor na declaração. A atribuição de seu valor é feita em uma subclasse (porém, preciso do array declarado na classe pai, pois alguns métodos definidos nesta classe pai que não convém definir na subclasse utilizam o tal array; tudo funciona pois a classe pai nunca é instanciada, entretanto, não é conviniente torna-la abstrata).

 

Bom, desculpas para não declarar e atribuir valores ao tal array ao mesmo tempo a parte, quando definir os valores, quero defini-los todos ao mesmo tempo, tipo array = {1, 2, 3, 4, 5...} ao invés de array[0] = 1; array[1] = 2, etc, pois são muitos os valores (o array é utilizado para pintar um mapa de tiles na tela). Mas na compilação, recebo um famigerado "expected primary expression before '{' token", sendo que o '{' referido é o '{' logo após array =. Com isso, concluo que este tipo de atribuição para arrays (array = {(valores)}; ) só é valido na sua declaração, estou certo?

 

Então, como posso fazer isso?

 

Partes relevantes do código:

 

arquivo classe_pai.h:

int array[0][0];

 

arquivo subclasse.h

int array[x][y]; (é sobrescrito)

 

arquivo subclasse.cpp

array = {(valores do array)};

erro: "expected primary expression before '{' token" como eu disse antes, o "token {", é a chave logo após o =.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce está certo, esse modo de inicializar um array só pode ser feito na declaracão da variável.

 

Bom, desculpas para não declarar e atribuir valores ao tal array ao mesmo tempo a parte, quando definir os valores, quero defini-los todos ao mesmo tempo, tipo array = {1, 2, 3, 4, 5...} ao invés de array[0] = 1; array[1] = 2, etc, pois são muitos os valores (o array é utilizado para pintar um mapa de tiles na tela). Mas na compilação, recebo um famigerado "expected primary expression before '{' token", sendo que o '{' referido é o '{' logo após array =. Com isso, concluo que este tipo de atribuição para arrays (array = {(valores)}; ) só é valido na sua declaração, estou certo?

Funcionou porque voce criou um novo atributo na subclasse.

Voce declarou outro atributo.

 

 

 

 

A solucao seria o preenchimento como voce sugeriu e para isso o loop for ajuda muito.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehe, logo em seguida percebi isso, e percebi que funcionou só pq eu ainda não estava usando aquele array para coisa alguma, por isso deletei o edit =p

 

Sim, o loop é uma solução, mas o que estou fazendo com essas subclasses é um modo para que vários mapas diferentes sejam criados através de subclasses diferentes, para isso, "ver" a matriz no código ajudaria muito um programador que planeje criar novos mapas:

1=grama

2=água

3=arvore

{

{1, 1, 1, 1, 1, 1, 1, 1, 1, 2},

{1, 1, 1, 1, 1, 1, 1, 1, 2, 2},

{1, 1, 1, 3, 1, 1, 1, 2, 2, 2},

{1, 1, 1, 1, 1, 3, 1, 2, 1, 1},

{1, 1, 1, 3, 1, 1, 1, 2, 1, 1},

{1, 1, 1, 1, 1, 1, 1, 2, 1, 1},

{1, 1, 1, 3, 1, 3, 1, 2, 1, 1},

{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}

}

Desta forma, dá de ver mais ou menos como o mapa vai ficar, entende?

E outra, são valores que não vão mudar, o programador vai inserir uma vez e deu... Imagina a treta pra fazer isso num for...

 

Bom, uma forma de contornar isso que tentei e não deu certo é criar um array "temp" com os valores inicializados e em seguida definir array = temp, mas aparentemente, "ISO C++ forbids assignment of arrays". Existe outra forma de fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça um método na classe pai que inicie o array.

Passe para ele a referencia do array temp e compie um a um atravé do loop.

Algo do tipo:

 

c=7;
l=10;

for (i=0; i<l; i++)
   for (j=0; j<c; j++)
	  array[i][j] = temp[i][j];

Voce pode também usar a classe vector que permite o uso do operador "=" para copiar um array.

 

http://www.cplusplus.com/reference/stl/vector/vector.html

http://www.cplusplus.com/reference/stl/vector/operator=.html

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, o que era pra ser algo simples acabou me dando dor de cabeças denovo. Funciona da seguinte forma:

 

classe_pai.h:

...
int ground_matrix[0][0];
...

subclasse.h

#define MATRIX_X_AXIS 16
#define MATRIX_Y_AXIS 12
...
int ground_matrix[MATRIX_Y_AXIS][MATRIX_X_AXIS]; //redefinição de ground_matrix
...

subclasse.cpp:

...
int temp[MATRIX_Y_AXIS][MATRIX_X_AXIS] = {
	  {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
	  {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3},
	  {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
	  {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3},
	  {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
	  {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3},
	  {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
	  {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3},
	  {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
	  {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3},
	  {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
	  {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3},
};

	for(int i = 0; i < MATRIX_Y_AXIS; i++)
		for(int j = 0; j < MATRIX_X_AXIS; j++)
			ground_matrix[i][j] = temp[i][j];
...

Bom, assim que sai do loop, todas as linhas de ground_matrix assumem o valor da última linha de temp (sei que são os valores da última linha pois alterei os valores de temp para testar), mas se uso um cout dentro do loop, logo após a atribuição de valores, vejo que a atribuição está sendo feita corretamente.

 

O que pode estar acontecendo? Me parece algo bem idiota na real, mas não estou percebendo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, fazerndo mais alguns testes, eu percebi que a cada passada do loop

 

for(int i = 0; i < MATRIX_Y_AXIS; i++)
		for(int j = 0; j < MATRIX_X_AXIS; j++)
			ground_matrix[i][j] = temp[i][j];

TODOS os valores da matriz ground_matrix são preenchidos com os valores da linha i de temp, logo, no fim do loop, todos os valores são preenchidos com o valor da ultima linha de temp. Por exemplo, presumindo que a primeira linha de temp seja {1,0,1,0,1,0,1...} e a segunda linha de temp seja {2,3,2,3,2,3,2,3...} e eu faço

 

for(int i = 0; i < MATRIX_Y_AXIS; i++)
				if(i == 2)
						break;
		for(int j = 0; j < MATRIX_X_AXIS; j++)
			ground_matrix[i][j] = temp[i][j];

na primeira passada, todas as linhas de ground_matrix assumem o valor {1,0,1,0,1,0,1...} e na segunda passada, todos os valores de ground_matrix assumem o valor {2,3,2,3,2,3,2,3...}, inclusive, sobrescrevendo a linha anterior. O que pode estar acontecendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.