2013-07-11 68 views
2

您好我正在研究排序算法,因爲我想做一個簡單的程序從文本文件中獲取整數數組。雖然這樣做我有一些麻煩和問題,關於數組和函數,他們作爲參數。這是我做的:通過任意尺寸的二維數組

#include<stdio.h> 
#include<stdlib.h> 

#define MAX_SIZE 64 
#define MAX_INT_SIZE 10000 

void itobuff(const char* istring,const int** sint); 
int getistring(FILE* file,char strbuffer[][MAX_SIZE],int max_int,int max); 

int main(int argc,char*argv[]){ 

    char buffer[MAX_INT_SIZE][MAX_SIZE]; 

    int int_counter=0; 
    int int_buffer[MAX_INT_SIZE]; 

    FILE *file = fopen("MYFILE.txt","r"); 

    getistring(file,buffer,MAX_INT_SIZE,MAX_SIZE); 


    return 0; 

} 

我的疑問是關於函數

int getistring(FILE* file,char strbuffer[][MAX_SIZE],int max_int,int max); 

我想編寫一個函數,它允許使用任何大小的數組的定義。我知道這是錯誤的,但從邏輯上講,這是我想達到的,但無法弄清楚。

int getistring(FILE* file,char strbuffer[][],int max_int,int max); 

我知道我想做的事可能會以其他方式完成,但我想知道如何去做。例如,如果我想編寫一個獲取數組的函數並返回該數組的行列式,則不應該強制將自己限制爲k大小的數組。或者更一般地說,用於任何其他數組操作的i-columns,j-rows數組。

回答

3

如果您使用的是支持C 1999年C實現,那麼它支持可變長度數組。

聲明一個函數,它是這樣一個可變長度數組參數:

int getistring(FILE *file, size_t Rows, size_t Columns, char buffer[][Columns]); 

調用該函數是這樣的:

result = getistring(file, Rows, Columns, buffer); 

創建緩衝器陣列是這樣的:

size_t Rows = some calculation for number of rows; 
size_t Columns = some calculation for number of columns; 
char (*buffer)[Columns] = malloc(Rows * sizeof *buffer); 
if (!buffer) 
    Handle error. 

完成後,釋放像這樣的緩衝區陣列:

free(buffer); 

如果行數和列數是小的,則可以定義的,而不是使用mallocfree,像這樣具有自動存儲在緩衝區數組:

char buffer[Rows][Columns]; 
+0

謝謝!就我所知,我的主要參考Kernighan&Ritchie沒有包含任何關於可變大小數組的內容。 –

0

二維數組實際上是放在一個維度。您需要提供步長的原因是編譯器知道如何乘以索引來創建線性索引。如果您想使用任意大小的數組,請使用一維數組並提供一個步長。

考慮一下:

char strbuffer[][MAX_SIZE]; 

編譯器知道在strbuffer[i][j]得到一個元素,它必須使用:

strbuffer + i * MAX_SIZE + j; 

請注意,我用strbuffer,如果它是一個指針。您可以這麼做 - 編譯器會將數組轉換爲指針,以方便使用。

因此,重新定義你的函數取一個1D數組,並使用上面的計算。如果你尚未經過步長(或寬度,或者無論你怎麼稱呼它),然後添加一個放慢參數:

int getistring(FILE* file, char strbuffer[], int max_int, int max); 
+0

沒有必要使用一維數組,除非你使用的是過時的編譯器。 C自1999年以來支持可變長度數組。 –