Ir ao conteúdo
  • Cadastre-se

Problema de alocacao de memoria em c


Posts recomendados

Galera estou com um problema numa funcao que faz a leitura de uma imagem ppm.... O erro provavelmente esta na hora da alocacao de memoria. Alguem sabe com consertar isso? 

#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct _cor { //Essa struct é onde vão ficar armazenados os indices de cor da matriz.
    int val[3];         //0 = Vermelho
} Cor;                  //1 = Verde
                        //2 = Azul
 
typedef struct _colorimage {
    int nx,ny; /* dimensoes da imagem */
    Cor **cor; /* matriz com a cor dos pixels */
    int tamanho_maximo; // ate onde vai a intensidade dos pixels
    char cabecalho[2]; //cabecalho que vem em TODAS as imagens ppm... para ver isso é só abrir a imagem com um bloco de notas
} ColorImage;
 
 
ColorImage Leitura(char*Nome_Da_Imagem) { //Essa funcao vai fazer a leitura de uma imagem... lembra que a imagem é uma matriz
 
FILE *img; //ponteiro pro arquivo
   int i,j;
   int linhas,colunas,max;//variaveis auxiliares para guardar os dados
   ColorImage ppm; // "objeto" que vai apontar pra matriz que vai guardar os dados da imagem
   img = fopen(Nome_Da_Imagem,"r"); //abre a imagem
   if(img == NULL){
       printf("Erro ao abrir imagem\n");
       exit(0);
   }
   fscanf(img,"%s %d%d%d",ppm.cabecalho,&linhas, &colunas, &max); //aqui é onde é feita a leitura dos dados inciais da imagem(As primeiras 4 linhas)
   ppm.nx = colunas; //guarda a informação das colunas DENTRO da variável das matrizes
   ppm.ny = linhas;  //mesma coisa, porém com as linhas
   ppm.tamanho_maximo = max; //intensidade máxima dos pixels (na maioria dos casos é até 255)
 
   ppm.cor = (Cor**)malloc(sizeof(Cor*)* colunas); //alocação dinâmica para a matriz das cores (bidimensional até o momento)
   i=0;
   while(i<linhas){
       ppm.cor = (Cor*)malloc(sizeof(Cor) * colunas); //alocação
       i++;
   }
   printf("Errooooo2\n");
   int k;
   for(i=0;i<linhas;i++){         //aqui é o pulo do gato... uuma imagem RGB é uma matriz tridimensional, onde apenas UM pixel da imagem é formado por 3 tons diferentes(RED, GREEN, BLUE)
       for(j=0;j<colunas;j++){     //tenta sacar esse loop.... lembra daquela struct de índices lá em cima, que armazena os valores "0,1,2"
           for(k=0;k<3;k++){
               fscanf(img,"%d",&ppm.cor[j].val[k]); //se entender isso aqui entendeu tudo
           }
       }
   }
   fclose(img);
   return ppm;
}
int main()
{
     ColorImage ImagemBase;
    char nome_do_arquivo_entrada[500];
 
    printf("Insira o endereco da imagem: ");
    scanf("%s", nome_do_arquivo_entrada);
 
    printf("\n");
    ImagemBase = Leitura(nome_do_arquivo_entrada);
}
 
 
Link para o comentário
Compartilhar em outros sites


#include <stdio.h>

#include <stdlib.h>

typedef struct _cor {

int val[3];

} Cor;

typedef struct _colorimage {

Cor **cor;

char tipo[3]; // 2+nulo SEMPER!!!

int colunas;

int linhas;

int maxNumberColorColor;

} ColorImage;

ColorImage cargarImagem(char nome[100]){

int i, j;

FILE *arquivo = fopen ( nome, "r" );

if ( arquivo == 0 ) { perror ( "Erro: " ); getchar(); exit(EXIT_FAILURE); }

ColorImage imagem;

fscanf(arquivo, "%s%d%d%d%*c", imagem.tipo, &imagem.colunas, &imagem.linhas, &imagem.maxNumberColorColor);

size_t TAM = ( sizeof ( Cor ) * imagem.colunas ) * imagem.linhas;

imagem.cor = ( Cor** ) malloc ( TAM );

for ( i = 0; i < imagem.linhas; i++ ){

for ( j = 0; j < imagem.colunas; j++ )

fscanf ( arquivo, "%d%d%d",

&imagem.cor[j].val[0],

&imagem.cor[j].val[1],

&imagem.cor[j].val[2]

);

}

fclose ( arquivo );

return imagem;

}

int main() {

int i, x, z;

ColorImage imagem = cargarImagem("prova.ppm");

printf("%s \n%d %d \n%d\n", imagem.tipo, imagem.colunas, imagem.linhas, imagem.maxNumberColorColor);

for ( i = 0; i < imagem.linhas; i++ ){

for ( x = 0; x < imagem.colunas; x++ ){

for ( z = 0; z < imagem.colunas; z++ ){

printf("%.3d ", imagem.cor[x].val[z]);

}

printf(" ");

}

printf("\n");

}

//Liberar muito importante

for ( i = 0; i < imagem.linhas; i++ ) {

free ( imagem.cor );

}

free ( imagem.cor );

getchar();

return 0;

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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!