2014-02-13 4 views
1

У меня есть многомерный массивФункция возврата массива с

double coeff[10][3][12][519][11];

и я установить значения для этого массива в файле include-(#include "call_of_functions.h") в другой функции:

#include <stdio.h> 

void func_T5_D1(double s, double t, double mt, double coeff[10][3][12][519][11]) 
{ 
#include "call_of_functions.h" 
} 

и зову эта функция в main.c

int main(){ 
double s, t, mt; 
double coeff[10][3][12][519][11]={0}; 
double ex; 

printf("enter 3 values for s, t and mt:\n"); 
scanf("%lf %lf %lf", &s, &t, &mt); 

printf("%lf %lf %lf\n", s, t, mt); 
func_T5_D1(s, t, mt, coeff); 
ex = coeff[5][1][10][309][10]; 

printf("%.14e \n",ex); 
return 0; 
} 

Однако я получаю повреждение. Если я включу #include "call_of_functions.h" в main.c, он работает хорошо.

  • Как я могу вернуть значения этого 5-мерного массива в главном?
  • Или есть другой альтернативный способ сделать это?
+2

У нас недостаточно информации для диагностики проблемы. Пожалуйста, либо уменьшите проблему до того, что мы можем воспроизвести, либо запустите отладчик вашего кода, чтобы получить подсказку, где произошла ошибка. – hivert

+2

Сначала создайте с помощью отладочной информации (используйте флаг '-g' для' gcc'), затем запустите в отладчике. Когда вы запустите в отладчике, он остановится на месте сбоя, и там вы сможете изучить и даже подойти к стеке вызовов функций и изучить значения переменных. По крайней мере, отредактируйте свой вопрос, чтобы включить стек вызовов функции (используйте команду 'bt' в отладчике' gdb'). –

+2

Ваш массив 'coeff' имеет размер около 16 МБ, поэтому у вас, вероятно, есть [переполнение стека] (https://en.wikipedia.org/wiki/Stack_overflow) - либо сделать его' static' (быстрое и грязное исправление) или распределить его динамически с помощью 'malloc' (правильное исправление). –

ответ

4

10 * 3 * 12 * 519 * 11 * sizeof (double), вероятно, 16441920 байт, что может быть больше, чем доступное пространство стека.

Вы можете сделать массив глобальным или распределить его динамически.

Также обратите внимание, что массив не передается по значению функции, а только его адрес, , поэтому у вас нет проблем с «возвратом массива», как вы, кажется, думаете.

PS. Что касается динамического распределения, в вашем случае вы можете сделать:

double (*coeff)[3][12][519][11]; 
coeff = calloc (1, 10 * sizeof (*coeff)); 

и не забудьте free его.

+0

Спасибо. это действительно проблема, я установил «limit stacksize 16M», и это работает. Но как я могу сделать это динамически? – maniA

+0

@chill 'calloc' (как в приведенном выше примере) и' malloc' уже выполняют распределение динамически.Ваш пример в вашем вопросе пытается выделить в стек, который имеет размер, определенный реализацией, и обычно считается небольшим по сравнению с ОЗУ системы. – Brandin

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