3
I am writing code that should receive a color image file (PPM format) and turn it into grayscale (PGM format in ASC II code) After having done functions to read, convert the colors and save the file, the code is returning a fault Segmentation error right at the start of the main execution. Could you help me identify the mistake? That is the code:
# include <stdlib.h>
# include <stdio.h>
# define MAX 500
typedef struct {
int r, g, b;
} pixel;
void ler_ascii(pixel imagem[MAX][MAX], char *code, int *max, int *coluna, int *linha);
void salvar_ascii(pixel imagem[MAX][MAX], char *code, int max, int coluna, int linha);
void gray_scale(pixel imagem[MAX][MAX], int coluna, int linha);
int main(int argc, char** argv) {
pixel imagem[MAX][MAX]; //cria uma matriz de pixeis para armazenar a imagem
char code[3]; // codigo que identifica se a imagem é ascii ou binária
int max; //o valor máximo de tonalidade de cada pixel
int larg, alt; // largura e altura da imagem em pixeis
ler_ascii(imagem, code, &max, &larg, &alt);
gray_scale(imagem, larg, alt);
salvar_ascii(imagem, code, max, larg, alt);
return 0;
}
void ler_ascii(pixel imagem[MAX][MAX], char *code, int *max, int *coluna, int *linha) {
int i, j;
FILE *arquivo;
char nome_arq[50];
printf("entre com o nome do arquivo: \n");
scanf("%s", nome_arq);
if ((arquivo = fopen(nome_arq, "r")) == NULL) {
printf("Erro ao abrir o arquivo %s\n", nome_arq);
exit(1);
}
fscanf(arquivo, "%s", code);
fscanf(arquivo, "%d", coluna);
fscanf(arquivo, "%d", linha);
fscanf(arquivo, "%d", max);
for (i = 0; i < *linha; i++) {
for (j = 0; j < *coluna; j++) {
fscanf(arquivo, "%d", &imagem[i][j].r);
fscanf(arquivo, "%d", &imagem[i][j].g);
fscanf(arquivo, "%d", &imagem[i][j].b);
}
}
fclose(arquivo);
}
void salvar_ascii(pixel imagem[MAX][MAX], char *code, int max, int coluna, int linha) {
int i, j;
FILE *arquivo;
char nome_arq[50];
printf("entre com o nome que deseja salvar: \n");
scanf("%s", nome_arq);
arquivo = fopen(nome_arq, "w");
fprintf(arquivo, "P3\n");
fprintf(arquivo, "%d\n ", coluna);
fprintf(arquivo, "%d\n", linha);
fprintf(arquivo, "%d\n", max);
for (i = 0; i < linha; i++) {
for (j = 0; j < coluna; j++) {
fprintf(arquivo, "%d ", imagem[i][j].r);
fprintf(arquivo, "%d ", imagem[i][j].g);
fprintf(arquivo, "%d\n", imagem[i][j].b);
}
}
fclose(arquivo);
}
void gray_scale(pixel imagem[MAX][MAX], int coluna, int linha) {
int i, j;
for (i = 0; i < linha; i++) {
for (j = 0; j < coluna; j++) {
imagem[i][j].r = (int) ((0.299 * imagem[i][j].r) + (0.587 * imagem[i][j].g) + (0.144 * imagem[i][j].b)); //calcula o valor para conversão
imagem[i][j].g = imagem[i][j].r; //copia o valor para
imagem[i][j].b = imagem[i][j].r; //todas componentes
//testa o valor para ver se o mesmo não passou de 255
if (imagem[i][j].r > 255) {
imagem[i][j].r = 255;
imagem[i][j].g = 255;
imagem[i][j].b = 255;
}
}
}
}´
Thank you
Do you know how to use a debugger, such as ddd or gdb? It helps a lot to discover the cause of targeting failures.
– hugomg
In other words, would you know at least to indicate more or less the line where the segmentation error is occurring? Your code has some potential for failure in some places. For example, reading the "code" (on the line with
fscanf(arquivo, "%s", code);
) can produce memory invasion if the code string read has more than the 3 bytes allocated in the variablecode
.– Luiz Vieira