Как мне перевести char dbcc_name [1] на Delphi? - PullRequest
0 голосов
/ 10 ноября 2019

У меня проблема с переводом следующего кода C ++ в Delphi. Это код:

char dbcc_name[1]

И вот, что я думаю, что это должно быть:

dbcc_name : array [0..0] of Char;

Однако я знаю, что это поле должно возвращать имя, а не только один символ.

Итак, это может быть что-то вроде этого:

dbcc_name: array of Char;

Теперь это выглядит хорошо, но нет никакого способа предсказать, как долго будет длиться имя, и оно, вероятно, вернет что-то скуча мусора и где-то в нем терминатор # 0, но это, я думаю, не правильный путь. Не было бы разумно использовать указатель на этот массив? Нравится:

dbcc_name: PChar;

Заранее спасибо.

1 Ответ

1 голос
/ 10 ноября 2019

Вы были правы в первый раз, только с неправильным типом данных. Вместо этого используйте AnsiChar, то есть char в C / C ++:

dbcc_name: array[0..0] of AnsiChar;

В Delphi 2009+ Char - это псевдоним для WideChar, который в C / C ++ равен wchar_tв Windows и char16_t на других платформах.

Тем не менее, в C / C ++ имеет смысл существовать в структуре 1-элементный массив, когда он представляет данные переменной длины, и являетсяПоследнее поле в структуре. В этом случае структура обычно существует внутри большего блока выделенной памяти. В C / C ++ нет проверки границ массива, содержимое массива может превышать границы массива, если оно не превышает границ памяти, в которой выделен массив. Ссылаясь на массив по имени распадается в указатель на первый элемент. В C очень распространено использование этого для определения структуры, в которой непосредственно в нее встроены данные переменной длины, на которые можно ссылаться по имени, без необходимости выделять данные в другом месте в памяти. Это особенно полезно во встроенных системах с ограниченной памятью.

В Win32 API есть несколько структур, которые используют этот подход для данных переменной длины. Раймонд Чен обсуждает это более подробно в своем блоге:

Почему некоторые структуры заканчиваются массивом размера 1?

...