C ++: доступ к данным динамических структур внутри внешней функции

0

У меня возникла проблема с передачей динамически выделенных структур функции и доступом к ней.

Программа использует 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' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора"

Почему я могу получить доступ к данным в основной функции, а не к вспомогательным функциям?

Как я могу получить доступ к динамически распределенной структуре в других функциях, когда ее размер неизвестен во время компиляции?

Большое спасибо за ваше время!

  • 0
    вы показываете нам только кусочки кода; например, где у вас определены Objects ? Также являются ли create_Objects и create_OpticsObjects одинаковыми? Пожалуйста, предоставьте полную информацию, желательно с минимальным рабочим кодом. В настоящее время вопрос не очень ясен.
  • 0
    Извините, я перепутал вещи, сводя код к тем частям, которые я думал, что они могут иметь решающее значение ... Я редактировал оригинальный пост выше
Показать ещё 2 комментария
Теги:
struct
dynamic
mex

1 ответ

0

Похоже, вы пытаетесь использовать 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 теперь доступна глобально (во всех исходных файлах, которые используют один и тот же заголовочный файл).

  • 0
    Спасибо за вашу помощь,
  • 0
    Надеюсь, это помогло. Пожалуйста, отметьте «ответ» соответственно :).
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню