Beraldo 864 Denunciar post Postado Setembro 20, 2008 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
_Isis_ 202 Denunciar post Postado Setembro 21, 2008 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
Beraldo 864 Denunciar post Postado Setembro 21, 2008 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
Edultra 13 Denunciar post Postado Setembro 22, 2008 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
Beraldo 864 Denunciar post Postado Setembro 22, 2008 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
gRoOvE 0 Denunciar post Postado Setembro 29, 2008 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
Beraldo 864 Denunciar post Postado Outubro 1, 2008 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
gRoOvE 0 Denunciar post Postado Outubro 2, 2008 É isso ai mesmo :D Compartilhar este post Link para o post Compartilhar em outros sites