Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvida sobre atribuir o retorno de uma função que retorna o ponteiro a


spdm

Pergunta

Olá pessoal,

Sou iniciante em c, e estou estudando alocação dinâmica de memória e ponteiros e eu pensei que estava entendendo bem até ocorrer um problema. Refiz um programinha que calcula a multiplicação de duas matrizes que o usuário escolhe quantas linhas e quantas colunas as matrizes vão ter, testa se a coluna da primeira matriz é igual a linha da segunda e em caso positivo, aloca dinamicamente memória para essas matrizes. Para isso criei uma função para multiplicar as matrizes que retorna um ponteiro.

Eu queria atribuir esse ponteiro retornado pela função a outro ponteiro para posteriormente em um laço for imprimir o resultado na tela. O problema é que quando eu atribuo o valor de retorno da função a outro ponteiro e depois vou acessar os elementos desse ponteiro, ele me retorna valores completamente errados que, ao que tudo indica, estão em endereço de memória nada a ver.

No entanto, se eu fizer o mesmo processo de modo direto, usando o retorno da função diretamente no laço for sem atribuí-lo a outro ponteiro, o programa funciona normalmente.

Por que não consigo fazer da primeira maneira? Estou fazendo algo errado?

Se eu faço dessa maneira logo abaixo, não funciona.

matriz3 = multMatriz(linhas,colunas,matriz1,linhas2,colunas2,matriz2);

for(cont=0; cont< linhas; cont++)

{

for(cont2 = 0;cont2 < colunas2; cont2++)

{

printf(" %d ",*(matriz3+(cont * colunas2 + cont2)));

if(cont2 == colunas2 - 1)

{

printf("\n");

}

}

}

Mas se eu faço de maneira de maneira direta funciona:

for(cont=0; cont< linhas; cont++)

{

for(cont2 = 0;cont2 < colunas2; cont2++)

{

printf(" %d ",*(matriz3 = multMatriz(linhas,colunas,matriz1,linhas2,colunas2,matriz2)+(cont * colunas2 + cont2)));

if(cont2 == colunas2 - 1)

{

printf("\n\n");

}

}

}

Onde está meu erro? Se puderem ajudar, eu agradeço.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

E ai Marcelo, beleza?

Bom, o protótipo da função é esse:

int *multMatriz(int la, int ca,int *a,int lb, int cb, int *B);

Do ponteiro é: int *matriz3;

A função é:

int *multMatriz(int la, int ca,int *a,int lb, int cb, int *B)

{

int cont,cont2,cont3,resultado[la][cb],acumula;

for(cont = 0; cont<la;cont++)

{

for(cont2 = 0;cont2 < cb; cont2++)

{

acumula = 0;

for(cont3 = 0;cont3 < ca; cont3++)

{

acumula += *(a+(cont * ca+cont3)) * *(b+(cont3 * cb+cont2));

}

resultado[cont][cont2] = acumula;

}

}

return &resultado[0][0];

}

Grato pela atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

Seu problema é com a variável resultado. Ela é uma variável local da função multMatriz e portanto é destruída após o retorno da função. Usar o endereço retornado imediatamente como você faz onde funciona diminui a probabilidade de a memória ter sido sobrescrita. Ou seja: funciona por uma coincidência! :)

Para retornar uma matriz como você quer fazer, precisa alocar a memória. Veja a questão do CaioBrito, Matrizes e Ponteiros. A função iniciaMatriz inicializa perfeitamente uma matriz exatamente como você quer fazer. Estou no celular agora, não consigo reescrever o código aqui!

Qualquer coisa avise!

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Marcelo, você tinha toda a razão quanto ao fato de precisar alocar memória para o ponteiro antes de retorná-lo. Fiz uma pequena alteração no código da função e funcionou perfeitamente. Valeu mesmo.

Vou deixar o código da função, para caso alguém tenha uma dúvida semelhante:

//Multiplica duas matrizes. São passados como argumentos as linhas e colunas das duas matrizes, e

//um ponteiro para cada matriz

int *multMatriz(int la, int ca,int *a,int lb, int cb, int *B)

{

int cont,cont2,cont3,*p,resultado[la][cb],acumula, *mat;

mat=(int*) malloc(la * cb * sizeof(int));

for(cont = 0; cont<la;cont++)

{

for(cont2 = 0;cont2 < cb; cont2++)

{

acumula = 0;

for(cont3 = 0;cont3 < ca; cont3++)

{

acumula += *(a+(cont * ca+cont3)) * *(b+(cont3 * cb+cont2));

}

*(mat +(cont * cb + cont2))= acumula;

}

}

return mat;

}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...