2013-06-03 158 views
0

我的程序對隨機像素覆蓋的圖像進行解碼,對圖像進行解碼,我必須將每個像素的紅色分量乘以10.綠色和藍色分量與新紅色分量的值相同。我創建了多個幫助函數,使代碼更易於在main中讀取,但是當我嘗試運行a.out時,我一直在收到「Segmentation Fault」。我似乎無法找到我的錯誤!幫助表示讚賞。當我運行我的程序時,爲什麼會出現「分段錯誤」?

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. 在使用前必須(應該)分配使用的變量。這尤其適用於指針,例如。 G。 FILE *

  2. 如果函數(例如fopen())失敗,它通常通過返回一個特殊的值來指示它,在繼續之前必須檢查該值。

  3. 要檢查變量的值,可以使用printf()來顯示它。

這是爲了找到主要的錯誤,如段錯誤。

但是邏輯錯誤很難找到:如果您讀取3個值並將它們存儲到變量中,則可能更有用的是全部使用它們而不是其中的一個。 (但也許這個人是沒有這個練習的目標。)


我寫這篇前行之前,我得知這是不是搜索在一個給定的程序錯誤的任務,而是寫一個由你自己編程,所以現在我會更具體一些。

A FILE *是由fopen()返回的東西。您可以返回它,也可以將它寫入一個變量或另一個由「更深一層」指針間接指向的內存位置。

所以,你應該重寫你的open_files()(BTW:爲什麼文件* 小號 *目前只有一個...?):

無論是在返回值(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調用它。

相關問題