2013-06-02 9 views
0

Мне дан файл изображения, и реальное изображение скрыто за случайными пикселями. Я должен декодировать изображение, умножив красное значение на 10 и установив значения зеленого/синего, равные этому новому красному значению. (И я не могу пройти за максимальное значение для цвета, которое равно 255). Когда я запускаю эту программу, он должен создать выходной файл под названием «hidden.ppm». Я запускал свою программу, но все, что у меня было, это «Ошибка сегментации», и я не могу понять, почему.Что случилось с моей программой для декодирования изображения?

void print_pixel(int a) 
{ 
    int r, g, b; 

    r = a * 10; 
    g = r; 
    b = r; 

    if (r > 255) 
    { 
     r = 255; 
    } 

    if (g > 255) 
    { 
     g = 255; 
    } 

    if (b > 255); 
    { 
     b = 255; 
    } 

    printf("%d\n", r); 
    printf("%d\n", g); 
    printf("%d\n", b); 
} 

void decode(int arg_list, char *in[]) 
{ 
    FILE *input, *output; 
    int check, value; 

    fprintf(output, "P3\n"); 
    fprintf(output, "%d %d\n", 1024, 768); 
    fprintf(output, "255\n"); 

    input = fopen(in[1], "r"); 
    output = fopen("hidden.ppm", "w"); 

    check = fscanf(input, "%d\n", &value); 

    while (check != EOF) 
    { 
     print_pixel(value); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc == 0) 
    { 
     printf("usage: a.out <input file>\n"); 
     return 1; 
    } 

    decode(argc, argv); 
} 
+1

является то, что фактический код? Потому что это бесконечный цикл –

+0

Это код, и как бы исправить бесконечный цикл? Не останавливается ли она, когда она достигает конца входного файла? – Karen

ответ

1
  1. Вы используете output перед тем fopen ИНГ его.

  2. Ваш цикл while является infinte, потому что вы выполняете только check = fscanf(input, "%d\n", &value);. Вы, вероятно, имел в виду:

    do{ 
        check = fscanf(input, "%d\n", &value); 
        print_pixel(value); 
    while(check != EOF); 
    
+0

О! Итак, check = ... и print_pixel оба входят в цикл while? (Так как я только выполнил check = ... один раз) Извините, я не видел этого: do {notation before, значит ли это сделать это в цикле while? Или раньше? Благодаря! – Karen

+0

Кроме того, мне интересно, есть ли проблема с моей функцией print_pixel. Потому что я хочу распечатать его в выходной файл, так что мне нужно использовать fprintf вместо printf? (Я пробовал это делать, но это означало бы, что мне нужен «вывод» в качестве первого аргумента fprintf, и я не объявляю «вывод» до тех пор, пока функция print_pixel) – Karen

+0

Вы можете передать 'output' как аргумент 'print_pixel':' void print_pixel (FILE * output, int a) {... ' – Kninnug

0

В вашем decode реализации, вы получаете доступ к выходному потоку перед инициализацией его. Переместите открытие выходного файла выше fprintf.

void decode(int arg_list, char *in[]) 
{ 
    FILE *input, *output; 
    int check, value; 

    input = fopen(in[1], "r"); 
    output = fopen("hidden.ppm", "w"); 

    fprintf(output, "P3\n"); 
[...] 
+0

Спасибо за помощь! – Karen