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);

我知道我想做的事情可能会以其他方式完成,但我想知道如何去做。例如,如果我想编写一个函数来获取一个数组并返回该数组的行列式,则不应强迫您将自己限制为 ak 大小的数组。或者更一般地,对于任何其他数组操作的 i-columns,j-rows 数组。

4

2 回答 2

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);

如果行数和列数很少,可以使用自动存储来定义缓冲区数组,而不是使用mallocand free,如下所示:

char buffer[Rows][Columns];
于 2013-07-11T02:00:35.977 回答
0

二维数组实际上是在一维中布局的。您需要提供步长的原因是编译器知道如何将索引相乘以生成线性索引。如果要使用任意大小的数组,请使用一维数组并提供步长。

考虑一下:

char strbuffer[][MAX_SIZE];

编译器知道要在 处获得一个元素strbuffer[i][j],它必须使用:

strbuffer + i * MAX_SIZE + j;

请注意,我使用strbuffer它好像它是一个指针。您可以这样做 - 为了方便起见,编译器会将数组转换为指针。

因此,重新定义您的函数以采用一维数组,并使用上面的计算。如果您尚未通过步长(或宽度,或任何您称之为的),则将其添加为参数:

int getistring(FILE* file, char strbuffer[], int max_int, int max);
于 2013-07-11T01:54:21.773 回答