Erro em indexação de matriz em c. [RESOLVIDO]

1. Erro em indexação de matriz em c. [RESOLVIDO]

rob
robgeek

(usa Debian)

Enviado em 24/11/2014 - 00:59h

Boa noite!

Eu queria saber o que há de errado no código abaixo. A saída está diferente da que eu espero.

#include <stdio.h>

void showStock(int a, int p, int stock[][p]);

int main( ) {
int a = 3;
int stock[][3] = {{9, 5, 6},
{8, 2, 1},
{7, 3, 4}};

showStock(a, 2, stock);

return 0;
}

void showStock(int a, int p, int stock[][p]) {
int i;
p--;//Para ajustar com o endereço da matriz que começa em 0.

for(i=0; i < a; i++)
printf("(%d, %d) -> %d\n", i, p, stock[i][p]);

}


Saída:
(0, 1) -> 5
(1, 1) -> 8
(2, 1) -> 1


Eu quero obter:
(0, 1) -> 5
(1, 1) -> 2
(2, 1) -> 3


O que eu tenho que fazer para arrumar isso?

Obrigado!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/11/2014 - 19:32h

Eis um problema com VLAs no C99. A informação de tamanho não fica embutida no tipo do argumento, e o compilador confia na declaração do parâmetro e no uso consistente que você vai fazer dela.

Quando você chamou a função passando 2 como argumento do segundo parâmetro, o terceiro argumento automaticamente adquiriu o sentido de que stock é do tipo “ponteiro para arrays com 2 elementos do tipo int” (não deixe aqueles colchetes vazios o enganarem: o sentido de “int a[][n]” é exatamente o mesmo de “int (*a)[n]”). Como numa matriz, independentemente do tamanho e da quantidade de dimensões, os elementos são dispostos todos adjacentes (como se fosse um vetorzão), a função de impressão foi induzida a entender que o layout do array era o seguinte:

{
{9, 5},
{6, 8},
{2, 1},
{7, 3},
{4, /* EPA!!! Memória inválida! */}
}


3. Re: Erro em indexação de matriz em c. [RESOLVIDO]

rob
robgeek

(usa Debian)

Enviado em 27/11/2014 - 13:32h

Nossa, nem em mil anos eu ia descobrir que o motivo era esse.

Obrigado!


4. Re: Erro em indexação de matriz em c. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/11/2014 - 18:22h

No seu caso, como você declarou um “array de (quantidade de elementos calculada pelo compilador) arrays de 3 elementos inteiros”, um jeito de corrigir seria passar 3 como argumento para a função.

Uma maneira “portável” de chamar sua função com as dimensões corretas, qualquer que fosse a dimensão interna da matriz stock, seria a seguinte.

showStock(a, sizeof stock[0]/sizeof stock[0][0], stock); 


Você poderia ainda declarar uma macro para servir de wrapper para showStock(), e usá-la como vai abaixo.

#define showStock_simple(n, matriz)  showStock(n, sizeof matriz[0]/sizeof matriz[0][0], matriz)

/* ... */

showStock_simple(a, stock);







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts