2017-04-07 38 views
0

因此我從文本文件中加載浮線行並將它們存儲在指針數組中,然後將其保存迴文本文件並添加對其大小的引用。文本文件中值的數量有所不同,因此數組必須是動態的。我像這樣定義了我的主指針數組。指針數組內容被擦除時傳遞給C函數

size_t size = (int)100 * sizeof(float); 
float * val = malloc(size); 

我把指針數組傳遞給加載文本文件,並保存值吧,這樣的功能。

//Read file into array. 
int readFile(float *val, int size) { 

char buf[20] = { 0 }; 
val[0] = 0; 
double temp = 0; 
int i = 1; 
FILE *file; 
file = fopen("C:\\Users\\MoldOffice\\Dropbox\\VS\\finalproj\\ecgproject\\dataStream", "r"); 
if (!file) { 
    printf("Coulding find file.\n"); 
    exit(1); 
} 

while (fgets(buf, 20, file) != NULL) { 
    temp = atof(buf); 
    if (temp != 0) { 
     // Increment i to find the size of the useful data. 
     val[i] = temp; 
     //printf("%d",val[i]); 
     i++; 
     if (i == size/sizeof(float)) { 
      size += 100*sizeof(float); 
      double* val_temp = realloc(val, size); 
      if (val_temp == NULL) { 
       printf("Realloc failed.\n"); 
      } 
      else { 
       val = val_temp; 
      } 
     } 
    } 
} 
//Test that the array is readable. 
for (int i = 0; i < 5; i++) printf("val[%d]=%f\n", i, val[i]); 

return(i); 
fclose(file); 

這工作正常,當我打印主指針數組的內容時,它的工作原理。然後,我將相同的指針數組傳遞給另一個將數組保存到一個新的文本文件中的函數,以及第一行的大小,問題是當我第二次傳遞指針數組時,內容發生了變化0與一些隨機數)。我完全不知道爲什麼會發生這種情況..任何想法?寫入文件的功能是在這裏:

// Write file into array. 
void writeFile(float *val,int size) { 

printf("%d",sizeof(val)); 
FILE *file; 
int sampleNum; 
char buf[10]; 
file = fopen("sampleNum.txt", "r"); 
if (file == NULL) { sampleNum = 0; } 
else { fscanf(file, "%d", &sampleNum); printf("%d",sampleNum);} 
char fileString[10]; 
sprintf(fileString,"sample%d\0", sampleNum); 
file = fopen(fileString, "w"); 

//Test that the array is readable. 
for (int i = 0; i < 5; i++) printf("val[%d]=%f\n", i, val[i]); 

//Print the array to a text file and save. 
fprintf(file, "%d\n", size); 
for (int i = 1; i < size; i++) { 
    fprintf(file, "%f\n", val[i]); 
    printf("%f\n", val[i]); } 
fclose(file); 
} 

主要的其餘部分可以在這裏找到:

int main() { 

size_t size = (int)100 * sizeof(float); 
float * val = malloc(size); 

// Read the data into an array. 
int arraySize = readFile(val, size); 

//Test that the array is readable. 
for (int i = 0; i < 5; i++) printf("val[%d]=%f\n", i, val[i]); 

// Save the array to a text file, with the size of the array as the first element. 
writeFile(val,arraySize); 

} 
+1

請把這個簡化爲[最小測試用例](http://stackoverflow.com/help/mcve)。例如,如果問題涉及調用函數,那麼將數據寫入文件的代碼可能無關緊要。 –

+0

搜索並閱讀關於*模擬c * –

+0

中引用的傳遞將現在這樣做。 –

回答

3
 double* val_temp = realloc(val, size); 
     if (val_temp == NULL) { 
      printf("Realloc failed.\n"); 
     } 
     else { 
      val = val_temp; 

這個函數的調用者沒有辦法知道你感動數組到不同的地方。它仍然有舊的,現在無效的指針。

您有類似的問題size。來電者如何知道你改變了它?

您對責任劃分的選擇很差。如果調用者負責分配緩衝區,那麼這個函數應該要求調用者放大它。如果這個函數負責分配緩衝區,它應該分配它。分配管理內存塊分配的責任通常是一個非常糟糕的主意,這就說明了其中一個原因。

也許傳遞一個指向包含指向緩衝區的指針和它的大小的結構?這將起作用,但仍顯示責任分工不良。

也許有這個函數分配緩衝區並返回一個包含指向它的指針和其中元素的數量的結構?

如果您確實想要這樣做,請考慮將函數指針傳遞給包含指向數組的指針,數組大小以及指向調整數組大小的函數的指針的指針。當然,調用者可以將此指針設置爲指向realloc函數(儘管它可能更適合作爲更改結構的指針和大小成員的函數)。

您也可以使用這樣的代碼:

struct float_buffer 
{ 
    float* buffer; 
    int size; 
}; 

struct float_buffer allocate_float_buffer(int size) 
{ 
    struct float_buffer buf; 
    buf.buffer = malloc (size * sizeof(float)); 
    buf.size = size; 
    return buf; 
} 

bool resize_float_buffer(struct float_buffer* buf, int size) 
{ 
    float* tmp = realloc(buf->buffer, size * sizeof(float)); 
    if (tmp == NULL) 
     return false; 
    buf->buffer = tmp; 
    buf->size = size; 
    return true; 
} 

然後傳遞功能的struct float_buffer *

+0

對不起,函數的調用者是什麼意思?它被分配給的變量?我沒有計算機科學背景! –

+0

「函數的調用者」是指任何代碼調用包含我在答案中摘錄的代碼的函數。您將此函數傳遞給緩衝區及其大小。但它真正需要的是指向緩衝區的指針,其大小以及調整緩衝區大小的方法。 –

+0

你認爲我應該只使用val的realloc嗎? –