Ir ao conteúdo
  • Cadastre-se
Ivan Santos_607246

Problema de alocacao de memoria em c

Recommended Posts

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);
}
 
 

Compartilhar este post


Link para o post
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;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×