problema ao mandar uma matriz para uma função(linguagem C)

Iniciado por tatsu3pt, 04 de Novembro de 2010, 00:49

tópico anterior - próximo tópico

tatsu3pt

sou iniciante e gostaria de saber oq esta errado nesse codigo.
Eu quero mudar os valores dentro da funcao mesmo.

vou ter q fazer malloc em todas as linhas?

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

void copia(int **m,  int **n){
    int i, j;
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
            m[i][j] = n[i][j];
}
}         
}

int main(){
int i, j, a= 0;
int origem[8][8], dest[8][8];
for(i=0;i<8;i++){
for(j=0;j<8;i++){
origem[i][j] = a; a++;
dest[i][j] = -1;
}
}
copia(origem, dest);

for(i=0;i<8;i++){
for(j=0;j<8;i++){
printf("%d", dest[i][j]);
}
printf("\n");
}
return 0;
}

zeroday

Olá tatsu ,

Vc poderia nos dizer uma breve descrição de o que seu problema faz. Não entendi o ponteiro para ponteiro como argumento para a função.

E poderia colar aqui o erro quando tenta compilar?

Até mais
"Lutar sempre , vencer na medida do possível , desistir jamais."

fpissarra

Citação de: tatsu3pt online 04 de Novembro de 2010, 00:49
sou iniciante e gostaria de saber oq esta errado nesse codigo.
Eu quero mudar os valores dentro da funcao mesmo.

Acho que seria mais fácil fazer assim:

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

int main()
{
  int i, j, a= 0;
  int origem[8][8], dest[8][8];

  for(i=0; i<8; i++)
    for(j=0; j<8; j++)
      origem[i][j] = a++;

  /* Mostra matriz "origem" */
  for (i=0;i<8;i++) {
    for(j=0;j<8;j++)
      printf("%d,", origem[i][j]);
    printf("\n");
  }
  printf("\n\n");

  /**** Usa função de copia para "copiar" matriz. ****/
  memcpy(&dest[0][0], &origem[0][0], sizeof(int) * 8 * 8);

  /* Mostra vetor destino */
  for (i=0;i<8;i++) {
    for(j=0;j<8;j++)
      printf("%d,", dest[i][j]);
    printf("\n");
  }

  return 0;
}


Ahhh. Note que, no seu código, trocou o 'j' pelo 'i' no incremento em 2 loops!

Darcamo

Já que o fpissarra já respondeu (e de maneira bem elegante e eficiente com o memcpy), vou dizer apenas uma pequena dica estética.
No printf use
printf("%2d,", dest[i][j]);

Com isso cara número vai ocupar o espaço de dois caracteres e a matriz ficará mais organizada.

RonaldoRG

O erro deve ser nessa linha:
copia(origem, dest);
Porque você declarou a função com a matriz com ponteiro para ponteiro e tá passando a matriz do tipo m[][].
Assim ou você declara a função com o tipo [][], ou você declara no main um ponteiro para ponteiro, aloca memória e atribui os valores.
Se for utilizar matrizes de dimensão arbitrária então tem que usar matriz dinâmica, se for matriz fixa então usa o tipo [][].
Eu dei uma verificada no seu código.

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

void copia(int m[8][8],  int n[8][8]){
    int i, j;
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
            m[i][j] = n[i][j];
}
}         
}

int main(){
int i, j, a= 0;
int origem[8][8], dest[8][8];
for(i=0;i<8;i++){
for(j=0;j<8;j++){
origem[i][j] = a; a++;
dest[i][j] = -1;
}
}
copia(dest, origem);

for(i=0;i<8;i++){
for(j=0;j<8;j++){
printf("%2d ", dest[i][j]);
}
printf("\n");
}
return 0;
}

T+
Ubuntu 12.04

fpissarra

RonaldoRG apresentou uma solução perfeita para o problema em questão.

Eu só fico meio cabreiro com a passagem de vetores ou matrizes para funções porque alguns compiladores tendem a descarregar o conteúdo na pilha. Por isso prefiro lidar com ponteiros...

O GCC não parece sofrer desse problema... Assim, é bastante segura a solução do RonaldoRG!