2013-06-03 7 views
0

Моя программа декодирует изображение, которое покрывается случайными пикселями, чтобы декодировать изображение, я должен умножить красные цветовые компоненты каждого пикселя на 10. Зеленые и синие цветовые компоненты имеют те же значения, что и новый красный компонент. Я создал несколько вспомогательных функций, чтобы сделать код более легким для чтения в основном, но когда я пытаюсь запустить my.out, я продолжаю получать «Ошибка сегментации». Кажется, я не могу найти свои ошибки! Помощь приветствуется.Почему я получаю «Ошибка сегментации» при запуске моей программы?

void check_argument(int arg_list) 
{ 
    if (arg_list < 2) 
    { 
     perror("usage: a.out <input file>\n"); 
    } 
} 

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

    r = a * 10; 

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

    g = r; 
    b = r; 

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

void read_header(FILE *in) 
{ 
    char str[20]; 

    for (int i = 0; i < 3; i++) 
    { 
     fgets(str, 20, in); 
    } 
} 

FILE* open_files(FILE *infile, char *input[]) 
{ 
    infile = fopen(input[1], "r"); 

    if (infile == NULL) 
    { 
     perror("Error: Cannot read file.\n"); 
    } 

    return infile; 
} 

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

    int check, red, green, blue; 

    open_files(input, in); 
    output = fopen("hidden.ppm", "w"); 

    fprintf(output, "P3\n"); 
    fprintf(output, "%d %d\n", 500, 375); 
    fprintf(output, "255\n"); 

    read_header(input); 
    check = fscanf(input, "%d %d %d", &red, &green, &blue); 

    while (check != EOF) 
    { 
     print_pixel(red, output); 
     check = fscanf(input, "%d %d %d", &red, &green, &blue); 
    } 

    fclose(input); 
    fclose(output); 
} 

int main(int argc, char *argv[]) 
{ 
    check_argument(argc); 
    decode(argc, argv); 
} 
+2

Где именно вы получаете сообщение об ошибке? –

+0

После того, как я скомпилирую его, используя: gcc -std = c99 -Wall -pedantic puzzle.c, я получаю файл a.out. Но когда я пытаюсь запустить файл a.out с аргументом командной строки, он говорит мне: «Ошибка сегментации». – Karen

+1

запустите его в отладчике –

ответ

0

После звонка open_files(input, in); у вас не будет дескриптора файла в input.

+0

Да! Благодаря! Я нашел это! :) – Karen

0

Как это должно быть домашнее задание, я постараюсь показать вам некоторые общие источники ошибок и как их найти.

  1. Переменные, которые используются, должны быть назначены перед этим. Это особенно важно для указателей, например. г. FILE *.

  2. Если функция (например, fopen()) не работает, она обычно указывает это, возвращая специальное значение, которое необходимо проверить перед продолжением.

  3. Чтобы проверить, какое значение имеет переменная, вы можете использовать printf(), чтобы ее показать.

Это для поиска основных ошибок, таких как segfaults.

Но логические ошибки также трудно найти: если вы прочитали 3 значения и сохранили их в переменных, возможно, было бы более полезно использовать их все вместо одного из них. (Но, возможно, это одна еще не цель этого упражнения.)


я написал строки до этого, прежде чем я узнал, что это не задача для поиска ошибок в данной программе, но написать программа сама по себе, поэтому я покажу немного более конкретную.

A FILE * что-то возвращено fopen(). Вы можете вернуть его, или вы можете записать его в переменную или другую ячейку памяти, на которую указывает указатель «на один уровень глубже».

Таким образом, вы должны переписать open_files() (BTW: почему файл * s * Это в настоящее время только один ...?):

либо для возвращения значения (preferrable):

FILE* open_files(char *input[]) 
{ 
    FILE *infile = fopen(input[1], "r"); 

    if (infile == NULL) 
    { 
     perror("Error: Cannot read file.\n"); 
    } 

    return infile; 
} 

и назвать его

input = open_files(input); 

или "пройти по ссылке":

void open_files(FILE **infile, char *input[]) 
{ 
    *infile = fopen(input[1], "r"); 

    if (*infile == NULL) 
    { 
     perror("Error: Cannot read file.\n"); 
    } 

    return *infile; 
} 

и назвать его

open_files(&input, in); 

только делает, что вы будете иметь свою переменную input на сайте вызывающего абонента действительно написанном.