2013-07-11 3 views
2

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

#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, которая поддерживает 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]; 
+0

Спасибо! Насколько я знаю, моя основная ссылка Kernighan & Ritchie не содержит ничего о массивах переменных размеров. –

0

Двумерные массивы фактически выложены в одном измерении. Причина, по которой вам нужно предоставить размер шага, заключается в том, что компилятор знает, как умножать индексы для создания линейного индекса. Если вы хотите использовать массивы произвольного размера, используйте 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); 
+0

Там нет необходимости использовать одномерный массивы, если вы не используете устаревший компилятор. C поддерживает массивы переменной длины с 1999 года. –