2014-09-03 138 views
-3

請耐心等待,因爲我幾乎不知道我在說什麼。我試圖從PGM文件讀取數據(不包括標題)。我有一個函數(read_data),它接受一個雙指針(char **數據)作爲參數。指向一維數組的雙指針

在函數中,我可以將數據放入一個數組(arr),但我的問題是將該指針(**數據)分配給該數組。這是我的代碼到目前爲止:

read_data(char* file, char** data) { 
FILE *fp = fopen(file, "rb"); 
char type[3], dump; 
int i =0, data_length; 
int w, h; // width & height 

fgets(type, sizeof(type), fp); 
fscanf(fp, "%d", &w); 
fscanf(fp, "%d", &h); 

if (strcmp(type, "P5 ")) { 
    data_length = w * h; 
    } 
else { 
    data_length = (w * h) * 3; 
    } // this is to work out the size of the array (how many bits of data are in the file) 

char arr[data_length]; 

while ((dump = fgetc(fp)) != '\n'); // just to skip the header 

for (i; i < data_length; i++) { 
arr[i] = fgetc(fp); 
} 

data = &arr; // <--- The problem 

fclose(fp); 

return data_length; 

} 

main() { 
int data_length; 
char **data = malloc(sizeof(int*)*data_length); 

read_data("file.pgm",data); 

} 

希望這是可讀的。謝謝。

+1

什麼是'image_data'?它在哪裏宣佈?你爲什麼認爲你可以分配給一個數組?數組是不可修改的l值,您不能分配給數組。 – 2014-09-03 04:32:01

回答

-1

試試這個

int n = 0; 

while(condition) 
    nextchar = fgetc(filepointer); 
    (*image_data)[n]= nextchar; 
    // or (*data)[n]= nextchar; 
    n++; 
2

要結合兩個不同的問題:文件I/O和指針處理。由於真正的問題是指針處理,我們使用一個更簡單的例子。首先,可以創建和填寫的char陣列功能:

#include <stdio.h> 
#include <string.h> 

void foo() 
{ 
    char arr[6]; 
    strcpy(arr, "hello"); 
    printf("%s\n", arr); 
} 

到目前爲止,一切都很好。 (從這裏開始,我將忽略#include指令。)但是這是一個堆棧中的數組,所以當控制超出函數時,它會變回荒野。我們要動態分配,在堆:

void foo() 
{ 
    char *arr = malloc(6*sizeof(char)); 
    strcpy(arr, "hello"); 
    printf("%s\n", arr); 
} 

注:在你的問題你聲明的功能外陣列,但是這意味着你必須這樣做不知道它應該是什麼長度,這沒有按這似乎是你想要的,這是一種更清潔的方法,如果你真的想在外面聲明數組,你可以做到這一點,只需稍作更改。)

現在關於指針。這很容易分配此數組的地址(這是分配給arr值)到另一個指針:

char *p; 
p = arr; 

,但我們不希望分配該值在函數一些地方指針變量;我們想把它分配給代碼的範圍內的指針值,這個函數調用。要做到這一點與普通變量的方法是使用一個指針的變量:

void bar(int *k) 
{ 
    *k = 5; 
} 

... 
int n; 
bar(&n); 
... 

所以我們用這個指針變量相同:

void foo(char **p) 
{ 
    char *arr = malloc(6*sizeof(char)); 
    strcpy(arr, "hello"); 
    *p = arr; 
} 

int main() 
{ 
    char *z; 
    foo(&z); 
    printf("%s\n", z); 
} 

(我們甚至可以用做掉但是讓我們慢慢來吧。)

一旦清楚了,就可以將它拼接到處理文件I/O的代碼。請記住,始終獨立開發新功能。

+0

+1指針指針的覆蓋範圍很好。 – WhozCraig 2014-09-03 04:40:22

+0

+1 this.helped.me.lots。感謝堆。 – 2014-09-03 04:41:58