У меня проблема с использованием библиотеки C в C++. Я боюсь, что решение очень просто, но я хочу глупо это получить.
Библиотека определяет такую функцию:
CAENHVLIB_API CAENHVRESULT CAENHV_GetChName(int handle, ushort slot,
ushort ChNum, const ushort *ChList, char (*ChNameList)[MAX_CH_NAME]);
В этом примере он называется так:
char (*listNameCh)[MAX_CH_NAME];
// ... leaving out the other lines since they are not the problem ...
listNameCh = malloc(MAX_CHANNELS*MAX_CH_NAME);
ret = CAENHV_GetChName(handle, slot, NrOfCh, listaCh, listNameCh);
Так что теперь проблема. В C++ я не могу использовать malloc (MAX_CHANNELS * MAX_CH_NAME), потому что я не могу его корректно использовать. Он работает с "-fpermissive" - флаг, но я бы хотел сделать это без такого взлома.
У кого-то есть идея, как обойти это?
ура
Ну, вы, вероятно, можете правильно его использовать, чтобы избежать -fpermissive
.
На одном уровне это не хак - C и C++ имеют разные правила для неявного литья. Если вы настаиваете на написании C в C++, вам понадобится случайный бросок, чтобы заставить его работать.
На другом уровне проблема заключается в том, что вы пишете C и компилируете ее как C++. Было бы лучше либо
std::array<char[MAX_CH_NAME], MAX_CHANNELS>
и он позаботится о вашем распределении std::vector<char[MAX_CH_NAME]>
аналогично, если вы хотите изменить его размер Вы можете использовать либо malloc
либо new
. Если вы используете malloc
, вам нужно вернуть возвращаемое значение. Если вы используете new
, вам не нужно бросать.
listNameCh = (char (*)[MAX_CH_NAME])malloc(MAX_CHANNELS*MAX_CH_NAME);
или
listNameCh = new char[MAX_CHANNELS][MAX_CH_NAME];