Ir para conteúdo

POWERED BY:

Arquivado

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

Beraldo

[Resolvido] Alocar memória para matriz passada como parâmetro

Recommended Posts

Estou com problemas para alocar memória para uma matriz de inteiros passada como parâmetro.

 

Tentei fazer assim:

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

void alocar(int **matriz, int l, int c)
{
	int i;	
	
	if (l < 1 || c < 1) 
	{
		printf ("** Erro: Parametro invalido **\n");
		exit(1);
	}

	matriz = (int **) malloc(l * sizeof(int*));
	
	if (matriz == NULL) 
	{
		printf("** Erro: Memoria Insuficiente **");
		exit(1);
	}

	for ( i = 0; i < l; i++ )
	{
		matriz[i] = (int*) malloc(c * sizeof(int));
		
		if (matriz[i] == NULL)
		{
			printf("** Erro: Memoria Insuficiente **");
			exit(1);
		}
	}
	
	printf("Alocado\n");
}



void Liberar_matriz(int m, int n, int **v)
{
	int  i;
	if (v == NULL) return;
	if (m < 1 || n < 1)
	{
		printf("** Erro: Parametro invalido **\n");
		return;
	}

	for (i=0; i<m; i++) free (v[i]);
	free (v);
}


void popular(int **matriz, int l, int c)
{
	int i, j, cont = 0;
	
	for (i = 0; i < l; i++)
	{
		for (j = 0; j < c; j++)
		{
			matriz[i][j] = cont;
			cont++;
		}
	}
}


void imprime(int **matriz, int l, int c)
{
	int i, j;
	
	for (i = 0; i < l; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf(" %03d ", matriz[i][j]);
		}
		printf("\n");
	}
}



int main (void)
{
	int **matriz = NULL, l = 10, c = 5;
	
	
	alocar(matriz, l, c);
	popular(matriz, l, c);
	imprime(matriz, l, c);
	Liberar_matriz(l, c, matriz);
	
	return 0;
}

 

Parece que a função alocar() não está alterando o parâmetro matriz.

 

Testei desta forma, transferindo o conteúdo de alocar() para a função main(), e deu certo:

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

void Liberar_matriz(int m, int n, int **v)
{
	int  i;
	if (v == NULL) return;
	if (m < 1 || n < 1)
	{
		printf("** Erro: Parametro invalido **\n");
		return;
	}

	for (i=0; i<m; i++) free (v[i]);
	free (v);
}


void popular(int **matriz, int l, int c)
{
	int i, j, cont = 0;
	
	for (i = 0; i < l; i++)
	{
		for (j = 0; j < c; j++)
		{
			matriz[i][j] = cont;
			cont++;
		}
	}
}


void imprime(int **matriz, int l, int c)
{
	int i, j;
	
	for (i = 0; i < l; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf(" %03d ", matriz[i][j]);
		}
		printf("\n");
	}
}



int main (void)
{
	int **matriz = NULL, l = 10, c = 5, i;
	
	if (l < 1 || c < 1) 
	{
		printf ("** Erro: Parametro invalido **\n");
		exit(1);
	}

	matriz = (int **) malloc(l * sizeof(int*));
	
	if (matriz == NULL) 
	{
		printf("** Erro: Memoria Insuficiente **");
		exit(1);
	}

	for ( i = 0; i < l; i++ )
	{
		matriz[i] = (int*) malloc(c * sizeof(int));
		
		if (matriz[i] == NULL)
		{
			printf("** Erro: Memoria Insuficiente **");
			exit(1);
		}
	}

	popular(matriz, l, c);
	imprime(matriz, l, c);
	Liberar_matriz(l, c, matriz);
	
	return 0;
}

 

Eu poderia fazer alocar() retornar a matriz, maas deve haver uma froma de não precisar retorná-la.

 

 

Deve ser uma coisa simples, da qual não estou me dando conta... http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

 

[]s

Beraldo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você tentou atribuir o endereco da alocação ao argumento e não deu, fique com a opção de retornar a área de memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Retornando o ponteiro dá certo.

 

O que achei estranho é o fato de a função popular() funcionar corretamente (sem precisar retornar o ponteiro) e alocar(), não.

 

Agora há pouco estava pensando nisso. Talvez seja normal esse comportmente, pois matriz inicialmente aponta para NULL. Dentro de alocar(), passa a apontar para um endereço de memória. Como a chamada é por valor (e o valor passxado foi NULL), não há como recuperar o novo endereço sem retorná-lo por meio de return.

 

Pensando dessa forma, faz sentido o fato de popular() funcionar, pois o endereço passado como parâmetro não é modificado.

 

Será que estou certo ou viajei muito... ? :rolleyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldão desculpe meu comentario esto iniciando em C, mas não utilizo ponteiros para enviar uma matriz porque uma matriz ja é um ponteiro, tipo o que aprendi é que quanto mando envio ela sem mostrar o tamanho tipo:

 

verificamatriz(matriz); //envio da matriz por parametro

E quando recebo na função descrevo o tamanho da mesma:

 

int verificamatriz(int matriz[5][5]){ //Recebimento da matriz na função

Desculpa ai pois não entendi tambem o porque este valor NULL para a matriz... isso seria para uma matriz de tamanho indefinido?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala, Edultra! Tranquilo?

 

Não defino o tamanho da matriz no protótipo da função pois ela não tem tamanho definido. Faço alocação dinâmica para a matriz.

Nesse código, o tamanho é fixo, mas geralmente esse valor não é pré-definido.

 

O valor NULL é atribuído ao ponteiro por "boas práticas". Li isso em vários lugares. É bom sempre iniciar um ponteiro para NULL, para que ele não aponte para um local aleatório da memória, a fim de evitar que lixo seja exibido ao percorrer o ponteiro, por exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, pode nos mostrar como ficou retornando o ponteiro? Tentei fazer aqui, mas não rolou =(

 

Edit: Já consegui ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não guardei o código, mas ficou assim, pelo que me lembro:

 

A função de alocação:

int ** alocar(int **matriz, int l, int c)
{
	int i;	
	
	if (l < 1 || c < 1)
	{
		printf ("** Erro: Parametro invalido **\n");
		exit(1);
	}

	matriz = (int **) malloc(l * sizeof(int*));
	
	if (matriz == NULL)
	{
		printf("** Erro: Memoria Insuficiente **");
		exit(1);
	}

	for ( i = 0; i < l; i++ )
	{
		matriz[i] = (int*) malloc(c * sizeof(int));
		
		if (matriz[i] == NULL)
		{
			printf("** Erro: Memoria Insuficiente **");
			exit(1);
		}
	}
	
	return matriz;
}

 

A função main()

int main ()
{
	int **matriz = NULL, l = 10, c = 5;
	
	
	matriz = alocar(matriz, l, c);
	popular(matriz, l, c);
	imprime(matriz, l, c);
	Liberar_matriz(l, c, matriz);
	
	return 0;
}

 

 

Acho que foi só isso que mudei.

Teste aí se funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.