Неопределенная ссылка при передаче массива из Fortran в переполнение стека

Я работаю над смешением кода Fortran с C ++. Моя основная программа написана на фортране. Сейчас я передаю массив, например измерение x(0:100,1) к моему C++ функция. Мне нужно изменить значение в функции C ++. Затем верните массив обратно. Я гуглил некоторые решения. Но они не работают.

Фортран часть:

integer m = 10
dimension x(0:100,1)
common /cart/ x
.... set the value for x
call cfun(m)

часть c ++:

#include <stdio.h>
#include <math.h>
#include "defineMaxlen.h"
extern "C"{
extern struct {
double a[MAXINTERFACES][MAXLEN+1];  2 paras are defined in definemaxlen.h
} cart_;
}

int cfun_(int m){
printf("x value: %f2.6\n ", cart_.a[0][5]);
printf("From doublecart: \n");
for (int i=0;i<m+1;i++)
{
cart_.a[0][i] = cos(cart_.a[0][i]);
}

printf("x NEW value: %f2.6\n ", cart_.a[0][5]);

return(1);
}

-2

Решение

#include <stdio.h>
#include <math.h>
#include "defineMaxlen.h"
// because C is stupid.
typedef struct cart cart;

struct cart {
double a[MAXINTERFACES][MAXLEN + 1]; // why do you need one more than you can use?
};

extern cart cart_;
#ifdef __cplusplus
extern "C"#endif
int cfun_(int m)
{
printf("x value: %f2.6\n ", cart_.a[0][5]);
printf("From doublecart: \n");
for (int i=0;i<m+1;i++)
{
cart_.a[0][i] = cos(cart_.a[0][i]);
}

printf("x NEW value: %f2.6\n ", cart_.a[0][5]);

return 1;
}#ifdef __cplusplus
}
#endif

Оригинальный код был написан на C, но, я полагаю, скомпилирован с помощью компилятора C ++. Это сделало функцию, cfun_ функция C ++, включая искажение имен. Оборачивая функцию в extern "C"имя функции больше не искажено и доступно как обычная функция C.

struct больше не оборачивается extern "C", так как это не приносит никакой пользы. Я заявил, typedef struct cart cart; и определены, struct cart {...}; отдельно — я считаю, что это лучшая практика в C, потому что C глуп, когда речь идет об определении типов.

Переменная cart_ определяется за пределами struct cart, чтобы уменьшить путаницу. Также одна из вещей, которую я считаю лучшей практикой.

Я не скомпилировал это и не проверял вообще.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]