Operação ilegal ao armazenar algo na matriz (!)

Operação ilegal ao armazenar algo na matriz (!)

por Marcos Komatsu -
Número de respostas: 5
Aparentemente meu EP compila e funciona direitinho a alocação dinâmica de memória, tanto aloca como libera (usei o exemplo mostrado na aula, coloquei uma mensagem erro caso desse problema na alocação) e não apareceu nenhuma mensagem de erro do Windows e do programa.

Quando manipulo a matriz Campo, de dimensoes(i x j), como:

Campo [i%2][j%2] = 'i';
printf ("%c", Campo [i%2][j%2]);
Ela não retorna nenhuma mensagem de erro do Windows, mas quando faço o seginte:

for (x = 0; x < i; x++)
 for (y = 0; y < j; y++)
 Campo [x][y] = 'i';

for (x = 0; x < i; x++)
 for (y = 0; y < j; y++)
 printf ('%c \n", Campo [x][y]);


O windows retorna uma mensagem de "operação ilegal" e não executa o que eu pedi.

O que será que está acontecendo?


Em resposta à Marcos Komatsu

Re: Operação ilegal ao armazenar algo na matriz (!)

por Wellington Castello -
Se você tentou usar exatamente esse código, então tem um erro no printf, falta um " do lado esquerdo no lugar do '.

Mas se não for isso, você já se certificou se a alocação realmente funcionou para todos os índices? i%2 e j%2 são 0 se i e j são pares.

Outra coisa que eu não entendi é porque você tentou atribuir Campo[i%2][j%2] = 'i'; Se Campo é um vetor de caracteres, então o valor de 'i' é exatamente o caractere i e não o caractere do valor de i e portanto o for aninhado logo abaixo atribui o caractere 'i' para todas as posições do vetor.
Em resposta à Wellington Castello

Re: Operação ilegal ao armazenar algo na matriz (!)

por Marcos Komatsu -

Entao, eu fiz exatamente do jeito que o professor colocou, inclusive o mesmo codigo, soh que adaptei para um tipo char.

http://paca.ime.usp.br/mod/forum/discuss.php?d=4852

Soh que ainda dah mensagem de erro!

Tentei fazer  Campo[i%2][j%2] = 'i'; para testar a alocacao, se o programa estava reservando realmente a memoria...

Tem uma boa sugestao para testar a alocacao?

Em resposta à Marcos Komatsu

Re: Operação ilegal ao armazenar algo na matriz (!)

por Wellington Castello -
Talvez tenha colocado algo errado na adaptação para char e não notou, o código a seguir compila e funciona como esperado:

#include <stdio.h>
#include <stdlib.h>

char **malloc2D(int nLin, int nCol)
{
int i, j;
char **m;
m = (char **) malloc(nLin * sizeof(char *));
if (m == NULL)
return m;
for (i = 0; i < nLin; i++) {
m[i] = (char *) malloc(nCol * sizeof(char));
if (m[i] == NULL) {
for (j = 0; j < i; j++)
free(m[i]);
free(m);
return NULL;
}
}
return m;
}

int main(void)
{
int i, j, nLin, nCol;
char **teste;

nLin = 4;
nCol = 4;

teste = malloc2D(nLin,nCol);

for(i = 0; i < nLin; i++)
for(j = 0; j < nCol; j++)
teste[i][j] = 'w';

for(i = 0; i < nLin; i++)
for(j = 0; j < nCol; j++)
printf("teste[%d][%d] = '%c'\n",i,j,teste[i][j]);

return 0;
}


wcastello@debian:~$ ./teste
teste[0][0] = 'w'
teste[0][1] = 'w'
teste[0][2] = 'w'
teste[0][3] = 'w'
teste[1][0] = 'w'
teste[1][1] = 'w'
teste[1][2] = 'w'
teste[1][3] = 'w'
teste[2][0] = 'w'
teste[2][1] = 'w'
teste[2][2] = 'w'
teste[2][3] = 'w'
teste[3][0] = 'w'
teste[3][1] = 'w'
teste[3][2] = 'w'
teste[3][3] = 'w'
wcastello@debian:~$