Я работаю над смешением кода 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);
}
#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
, чтобы уменьшить путаницу. Также одна из вещей, которую я считаю лучшей практикой.
Я не скомпилировал это и не проверял вообще.
Других решений пока нет …