Пропустить произвольный размерный размерный массив

Привет, я изучаю алгоритмы сортировки, для чего хочу создать простую программу для получения массива целых чисел из текстового файла. Выполняя это, у меня возникают проблемы и вопросы относительно массивов и функций, которые воспринимают их как параметры. Вот что я делаю:

#include #include #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 для любой другой операции с массивом.

Если вы используете реализацию C, которая поддерживает C 1999, то она поддерживает массивы переменной длины.

Объявите функцию, которая принимает параметр массива переменной длины следующим образом:

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

Если числа строк и столбцов малы, вы можете определить массив буфера с автоматическим хранилищем вместо использования malloc и free , например:

 char buffer[Rows][Columns]; 

Двумерные массивы фактически выложены в одном измерении. Причина, по которой вам нужно предоставить размер шага, заключается в том, что компилятор знает, как умножать индексы для создания линейного индекса. Если вы хотите использовать массивы произвольного размера, используйте 1-мерный массив и укажите размер шага.

Учти это:

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