2016-09-16 2 views
1

Мой вопрос, у меня есть проект C, который имеет .c файлы:C - Возвращение массива из функции

trab.c 
ordena.c 
persistencia.c 

persistencia.c где мне нужно прочитать X целых чисел из текстового файла

trab.c имеет главный. Где я должен позвонить persistencia.c, чтобы получить массив из X (заданный параметром в основных) целых числах и функции сортировки вызовов от ordena.c, передав этот массив как параметр.

Мой вопрос есть. Каким образом это сделать? Могу ли я объявить глобальный массив вместо передачи через параметры? Могу ли я использовать malloc для доступа к var из другого класса?

+0

Зачем объявлять глобальный массив? Когда вы передаете массив функции, он ухудшается до указателя ... что делает его очень простым. Для массива 'int' вы можете попробовать' void func (int * array, size_t length) '... чем, просто отредактируйте массив на месте. – Myst

+0

C не имеет класса – user3629249

ответ

0

Logan Ракаи имеет хороший ответ, тем не менее, Я хочу предложить другой подход, так как мой опыт показывает, что лучше не, чтобы вернуть динамическую выделенную память, когда это возможно (а иногда и нет).

Более гибкий дизайн должен был бы написать функцию, которая принимает указатель и размер массива.

Кроме того, при написании долгосрочных проектов, которые необходимо поддерживать (возможно, не только от вас самих, но и от других программ), полезно сохранять «проблемы» вместе.

Хорошим примером является то, что когда управление памятью (free) выполняется вызывающей функцией, лучше, если распределение памяти (malloc) выполняется в одной и той же функции вызова ... При разбиении проблемы управления памятью между различные функции, более вероятно, что будущие сопровождающие будут вводить утечки памяти в код.

В этом случае довольно просто выделить массив с использованием стека или malloc и передать его.

, т. Е. Это быстрый (несколько бесполезный) пример для переноса проблемы управления памятью в вызывающую функцию (main). Обратите внимание, что это позволяет использовать как распределение динамической памяти, так и распределение стека при вызове связанных с массивом функций.

size_t get_array_size(void /* or any parameters */) { 
    /* do whatever you need */ 
    return 10; /*for our example */ 
} 

void fill_array(int *arry, size_t size) { 
    while (size) { 
    size--; 
    arry[size] = 1; /* fill in data here */ 
    } 
} 

int use_array(int *arry, size_t size) { 
    fprintf(stderr, "***\n"); 
    while (size) { 
    size--; 
    arry[size] -= 1; /* do whatever */ 
    fprintf(stderr, "array[%lu] == %d\n", size, arry[size]); 
    } 
    return 0; /* or return -1 for error */ 
} 

int main(int argc, char const *argv[]) { 
    int array1[20]; 
    int *array2; 
    size_t array2_size = get_array_size(); 
    array2 = malloc(sizeof(*array2) * array2_size); 
    fill_array(array1, 20); 
    fill_array(array2, array2_size); 
    if (use_array(array1, 20)) 
    perror("WTF?! "), exit(0); 
    if (use_array(array2, array2_size)) 
    perror("WTF?! "), exit(0); 
    return 0; 
} 

Это мое 2 ¢. Возможно, мой код управления ошибками несколько извращен, но возвращение -1 на ошибки более распространено, чем можно было бы верить.

3

Вы можете использовать malloc выделить массив Xint с (я предполагаю, что вы знаете, и у #define d X заранее).

int *array = malloc(X * sizeof(int)); 

malloc возвращает pointer (переменную, хранящую адрес в памяти) в массиве. Если X не известно apriori, вы можете прочитать файл, чтобы определить, сколько int s есть и добавить еще один аргумент int*, чтобы передать звонящему, сколько из них было прочитано. Вы можете вернуть ptr из функции в persistencia.c, если будет ясно, что ответственность вызывающего абонента равна free памяти. Объявление функции будет выглядеть

int *readInts(); 

Чтобы передать массив в функцию в ordena.c вы могли бы дать его в качестве аргумента типа int*

void ordena(int *array, size_t length); 
+0

Два оговорки: 1. Для функций возвращать динамически выделенную память нередко, поскольку это способствует утечке памяти (из-за смешанных проблем, связанных с управлением памятью); 2. Как насчет информации о количестве элементов? Как это вписывается в 'readInts'? – Myst

+0

Спасибо, я уточню ответ, чтобы отметить эти оговорки. –

+0

@Myst: Я не думаю, что для функции обычно возвращать указатель на выделенную память. Ясно, что всякий раз, когда память выделяется через 'malloc()' et al, существует риск того, что она будет протекать, но это может произойти, даже если оно не возвращается. Конструкция функции и документация о том, как ее использовать, должны сделать это понятным. Подобные комментарии относятся к передаче предварительно выделенной памяти в функцию. Рекурсивная функция добавляет некоторые завихрения - особенно если интерфейс не может быть изменен. Это в значительной степени требует некоторой глобальной переменной. –

 Смежные вопросы

  • Нет связанных вопросов^_^