Jump to content
Origami

Matrizes alocadas dinamicamente! (Escrita e Leitura)

Recommended Posts

Origami

Tive a fazer um exercicio para uma ficha de uma aula de programação e pareceu-me que ficou bom. E queria deixar aqui para o pessoal ver e dar tambem o meu contributo.

Podia ser optimizado mas assim consegue-se ver melhor o que acontece.


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

int randomNumber(int N);

int main(void)
{
/* Variable declaration */
int **ptr = NULL;
int M=0,N=0,i=0,j=0,NM=0,count=0,x=0;

/* PARA A RANDOMIZAçÃO tem de se dar uma seed!*/
unsigned int iseed = (unsigned int)time(NULL);
srand(iseed);	

/* Main code */

/*Pergunto as linhas e colunas e o numero de matrizes*/
printf("\nLinhas:");
scanf("%d",&M);	
printf("\nColunas:");
scanf("%d",&N);
printf("\nMatrizes:");
scanf("%d",&NM);

/*Alocação da memória 1º aloca-se 1 vector com o tipo de dados "Ponteiros" depois a cada um desses ponteiros aloco o tipo de dados e quantos*/
ptr = (int**)malloc(sizeof(int*)*M);									
for(i=0;i<M;i++)														
{																		
	*(ptr+i) = (int*)malloc(sizeof(int) * N);
}
/*Aqui preencho com numeros aleatorios cada matriz*/
printf("\n");
for(x=0;x<NM;x++) // for para o numero de matrizes
{		
		printf("\n");
		printf("%dª Matriz:\n\n",x+1);	
		for(i=0;i<M;i++) // for que preenche a matriz (linhas)
		{		
			for(j=0;j<N;j++) // for que preenche a matriz (colunas)
			{
				*(*(ptr + i)+j) = randomNumber(M*(N*M));
			}
		}
	/*Aqui imprimo os numeros da matrize*/
		for(i=0;i<M;i++)//for para escrever a matriz (linhas)
		{				
			for(j=0;j<N;j++) //for para escrever a matriz (Colunas)
			{	
				count++;				
				printf("[%d]",(*(*(ptr + i)+j)));
				if(count == M)
				{                      //Aqui serve para manter uma estrutura tipo matriz!
				printf("\n");                                                                                  ]
				count=0;	                                                                                     
				} 
			}
		}
		printf("\n");
}
/*Liberto a memoria alocada*/
for(i=0;i<M;i++)
{		
	free(*(ptr+i));
}
free(ptr);
        ptr = NULL; //boas praticas de programação
return 0;
}

int randomNumber(int N)
{	
int r = rand()/(int)(((unsigned)RAND_MAX + 1) / N);
return r;
}

Aceitam-se sugestões e criticas construtivas :)

Sim o código podia estar mais optimizado :P

Share this post


Link to post
Share on other sites
falk0n

Sim, realmente o código poderia estar optimizado, mas como tu bem disseste através desse código é facil perceber o que está a acontecer.

Apenas tenho uma crítica/dúvida:

Libertaste e bem a memória referente à memória que fica apontada no ptr, mas no final não libertaste o ptr.

Como é o final do programa e depois de o programa terminar o SO liberta toda a memória referente ao processo mas de qualquer das formas penso que poderias completar o programa ao libertar tb o ptr.

Boas programações

Share this post


Link to post
Share on other sites
Origami

Hum obrigado pela dica, eu realmente usava o programa em linux alleyoop para ver fugas de memoria e etcc, e aparecia que todos os ponteiros alocados tinham sido "libertados" mas faltava sempre um.

Share this post


Link to post
Share on other sites
pmg

Em vez do

       /* Disable warnings */
        (void)argc; (void)argv;

mete a função main() como não aceitando parametros ...

int main(void)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.