У меня возникла проблема с передачей динамически выделенных структур функции и доступом к ней.
Программа использует mex для передачи данных из Matlab в C++. Я использую Visual Studio.
Структура, которую я определяю в заголовке в 'InOut.h'
#include <string>
#include <cstdint>
#include <cstdlib>
struct sObjects {
std::string Type;
float *Position;
};
typedef struct sObject sObject;
В основной функции I, чем выделить структуру, находится в 'MainFcn_Mex.cpp'
#include "MainFcn_Mex.h"
// ...
// get number of Objects from Matlab
int N_Obj = mxGetNumberOfElements(prhs[1]);
sObjects *Objects = new sObjects[N_Obj];
for (int k=0; k<N_Obj; k++) {
// get the pointer pointer map
pMap = mxGetField(prhs[1],k,"Type");
Objects[k].Type = mxArrayToString(pMap);
// get the pointer pointer map
pMap = mxGetField(prhs[1],k,"Position");
// setting pointer to the first Element
Objects[k].Position = (float*)mxGetPr(pMap);
mexPrintf("Objects(%d,1).Type: %s \n", k+1, Objects[k].Type);
}
create_Objects(Objects, N_Obj);
Функция create_Objects находится в другом файле "create_Objects.cpp" и включается через "MainFcn_Mex.h":
#include <stdio.h>
#include <direct.h>
#define _USE_MATH_DEFINES
#include "math.h"
#include <cmath>
#include "mex.h"
#include "matrix.h"
#include <cuda.h>
#include <cuda_runtime.h>
#include "device_launch_parameters.h"
#include "InOut.h"
void create_Objects(sObjects *Objects, int N_Obj);
До сих пор содержимое "create_Objects.cpp":
#define _USE_MATH_DEFINES
#include "math.h"
#include <cmath>
#include "InOut.h"
#include "mex.h"
void create_Objects(sObjects *Objects, int N_Obj)
{
for (int k=0; k<N_Obj; k++) {
mexPrintf("Objects(%d,1).Type: %s \n", k+1, Objects[k].Type);
}
}
Visual Studio говорит мне:
"ошибка C2676: двоичная '[': 'sObjects' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора"
Почему я могу получить доступ к данным в основной функции, а не к вспомогательным функциям?
Как я могу получить доступ к динамически распределенной структуре в других функциях, когда ее размер неизвестен во время компиляции?
Большое спасибо за ваше время!
Похоже, вы пытаетесь использовать struct
напрямую как typedef
. Просто добавьте typedef
в определение struct
, превратит его в тип.
Как это:
... #include "mex.h"
typedef struct sObjects {
std::string Type;
float *Position;
};
(В противном случае вы должны использовать полное ключевое слово struct
как в void create_OpticsObjects(struct sObjects &Objects, int N_Obj)
.)
Для прототипов ваших функций не требуется extern
.
Вам не нужен extern
если вы не хотите переменные глобальных переменных. Вам кажется, что в вашем примере требуется просто глобальная struct
или типы, поэтому extern
не требуется.
Использование extern для globals
Вы можете ссылаться на экземпляр вашего объекта (или указатель на свой объект), и это можно сделать глобальным с помощью extern
. как в этой выдержке из файла заголовка:
... #include "mex.h"
typedef struct sObjects {
std::string Type;
float *Position;
};
extern sObjects *pointerToOnesObjects;
Затем в ОДНОМ исходном файле вам нужно объявить "реальную" переменную, как в (это полезно для ее инициализации):
sObjects *pointerToOnesObjects = NULL;
С помощью этого метода переменная pointerToOnesObjects
теперь доступна глобально (во всех исходных файлах, которые используют один и тот же заголовочный файл).
Objects
? Также являются лиcreate_Objects
иcreate_OpticsObjects
одинаковыми? Пожалуйста, предоставьте полную информацию, желательно с минимальным рабочим кодом. В настоящее время вопрос не очень ясен.