C библиотека в C ++

0

У меня проблема с использованием библиотеки 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" - флаг, но я бы хотел сделать это без такого взлома.

У кого-то есть идея, как обойти это?

ура

  • 1
    «потому что я не могу разыграть его правильно» Что вы на самом деле пытались разыграть?
  • 0
    Вы должны разыграть его вручную. В приведенном вами примере кода вы не пытались его привести.
Показать ещё 1 комментарий
Теги:

2 ответа

3
Лучший ответ

Ну, вы, вероятно, можете правильно его использовать, чтобы избежать -fpermissive.

На одном уровне это не хак - C и C++ имеют разные правила для неявного литья. Если вы настаиваете на написании C в C++, вам понадобится случайный бросок, чтобы заставить его работать.

На другом уровне проблема заключается в том, что вы пишете C и компилируете ее как C++. Было бы лучше либо

  1. переписать его как хороший, идиоматический C++. Вы должны иметь возможность использовать std::array<char[MAX_CH_NAME], MAX_CHANNELS> и он позаботится о вашем распределении
    • или вы можете использовать std::vector<char[MAX_CH_NAME]> аналогично, если вы хотите изменить его размер
  2. перезаписывать его как менее подходящий C++, с явным новым /delete вместо malloc/free (новые выражения строго типизированы и не требуют кастинга)
  3. напишите свой C-код в C-язычном модуле, выставив некоторый разумный интерфейс, а затем вызовите его из C++
2

Вы можете использовать либо malloc либо new. Если вы используете malloc, вам нужно вернуть возвращаемое значение. Если вы используете new, вам не нужно бросать.

listNameCh = (char (*)[MAX_CH_NAME])malloc(MAX_CHANNELS*MAX_CH_NAME);

или

listNameCh = new char[MAX_CHANNELS][MAX_CH_NAME];
  • 0
    Спасибо, отлично работает таким образом. Я забыл скобки вокруг звезды в "(char (*) [MAX_CHANNELS])" (у меня было "(char * [MAX_CHANNELS])"). Немного ржавый в программировании на C / C ++ и много времени.

Ещё вопросы

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