Ir ao conteúdo
  • Cadastre-se

Dúvida com função de matriz transposta


ItIsMoss

Posts recomendados

Olá pessoal, sou novo aqui.

Estou eu se aventurando pela linguagem C (não sou nenhum especialista) até que em um momento me deparei com um erro "Segmentation fault (core dumped)" que não consigo resolver.

Para ser mais claro, meu objetivo é fazer a transposta de uma matriz de ordem m x n qualquer. Sendo m o número de linhas e n o número de colunas.

Então, o que é linha se tornará coluna e o que é coluna passará a ser linha.

Ou seja, a transposta de uma matriz 2x4 passará a ser 4x2.

O código funciona para alguns valores, por exemplo: 1x3, 3x1, 4x4, 4x5, 7x2... Mas para outros não: 1x4, 4x8, 2x7

Vejam:


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

void escreverMatriz(int **p, int l, int c);
void transpostaMatriz(int **p, int l, int c);

int main()
{
int c, l, i, j, n;
int **p;
printf("Quantas linhas: ");
scanf("%d", &l);
printf("\nQuantas colunas: ");
scanf("%d", &c);
p = (int**)(malloc(l*sizeof(int*)));

for (i = 0; i < l; i++)
p[i] = (int*) (malloc(c*sizeof(int)));

n = 0;
for (i = 0; i < l; i++)
for (j = 0; j < c; j++)
{
//printf("Digite o valor para p[%d][%d]= ", i, j);
//scanf("%d", &p[i][j]);
p[i][j] = n++;
}

escreverMatriz(p, l, c);

printf("\nAqui vai a transposta:\n");
transpostaMatriz(p, l, c);
escreverMatriz(p, c, l);
return 0;
}

void escreverMatriz(int **p, int l, int c)
{
int i, j;

for (i = 0; i < l; i++)
for (j = 0; j < c; j++)
{
printf("%d", p[i][j]);
if (j == (c-1))
printf("\n");
else
printf("\t");
}
}

void transpostaMatriz(int **p, int l, int c)
{
int **aux;
int i=0, j;

aux = (int**)(malloc(c*sizeof(int*)));

if(!aux)
{
printf("\nNão foi possível alocar memória para aux");
exit(1);
}
// aloca memória para transposta na matriz aux
for (i = 0; i < c; i++)
{
aux[i] = (int*)(malloc(l*sizeof(int)));
if(!aux[i])
{
printf("\nNão foi possível alocar memória para aux[%d]", i);
exit(1);
}
}

// matriz transposta recebe os valores
for (i = 0; i < c; i++)
for (j = 0; j < l; j++)
{
aux[i][j] = p[j][i];
}

p = (int**)(realloc(p, c*sizeof(int*)));
// faz a realocação de memória
for (i = 0; i < c; i++)
p[i] = (int*)(realloc(p[i], l*sizeof(int)));

// faz a passagem dos valores de aux para p
for (i = 0; i < c; i++)
for (j = 0; j < l; j++)
{
p[i][j] = aux[i][j];
}
// libera memória auxiliar
free(aux);
}


Aceito todo tipo de sugestão/dica para melhorar o código ou para entender o que está acontecendo.

Agradeço a atenção.

Link para o comentário
Compartilhar em outros sites

ItIsMoss,

Depois de criar a matriz auxiliar e transferir os elementos, basta retorná-la. Atente também para a forma como liberar a memória. Lembre-se, para cada chamada à malloc(), use um free().

Poderia fazer assim:

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

void escreverMatriz(int **p, int l, int c);
int **transpostaMatriz(int **p, int l, int c);

int main()
{
int c, l, i, j, n;
int **p;

printf("Quantas linhas: ");
scanf("%d", &l);
printf("\nQuantas colunas: ");
scanf("%d", &c);

p = (int**)(malloc(l*sizeof(int*)));

for (i = 0; i < l; i++)
p[i] = (int*) (malloc(c*sizeof(int)));

n = 0;
for (i = 0; i < l; i++)
for (j = 0; j < c; j++)
{
//printf("Digite o valor para p[%d][%d]= ", i, j);
//scanf("%d", &p[i][j]);
p[i][j] = n++;
}

escreverMatriz(p, l, c);

printf("\nAqui vai a transposta:\n");
p = transpostaMatriz(p, l, c);
escreverMatriz(p, c, l);
return 0;
}

void escreverMatriz(int **p, int l, int c)
{
int i, j;

for (i = 0; i < l; i++)
for (j = 0; j < c; j++)
{
printf("%d", p[i][j]);
if (j == (c-1))
printf("\n");
else
printf("\t");
}
}

int **transpostaMatriz(int **p, int l, int c)
{
int **aux;
int i, j;

aux = (int**)(malloc(c*sizeof(int*)));

if (!aux)
{
printf("\nNão foi possível alocar memória para aux");
exit(1);
}

// aloca memória para transposta na matriz aux
for (i = 0; i < c; i++)
{
aux[i] = (int*)(malloc(l*sizeof(int)));
if(!aux[i])
{
printf("\nNão foi possível alocar memória para aux[%d]", i);
exit(1);
}
}

// matriz transposta recebe os valores
for (i = 0; i < c; i++)
for (j = 0; j < l; j++)
{
aux[i][j] = p[j][i];
}

for (j = 0; j < l; j++)
free(p[j]);

free(p);

return aux;
}

[]'s

LNW

Link para o comentário
Compartilhar em outros sites

Olá LNW,

Fiz da forma como você propôs. Realmente é melhor e mais prático retornar uma nova matriz. O que eu estava tentando fazer era modificar a matriz sem ter que retornar uma nova, por questão de curiosidade mesmo, pois é a primeira vez que utilizo esses recursos de alocação dinâmica de memória.

Agradeço a tua ajuda e disposição.

Link para o comentário
Compartilhar em outros sites

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!