2012-12-22 1 views
0

Я пишу Haskell привязку к какому-либо проекту C и есть функция типаКак передать NULL внешней функции с аргументом type char *?

void foo(char *); 

Проблема заключается в том, что foo проверяет этот указатель для NULL значения и сделать что-то отличное от нормального поведения. В моей исходной оболочке Haskell для этой функции есть тип foo :: String -> IO() и с использованием newCString внутри для маршала аргумента.

Интересно, как я могу передать пользователю NULL? Я ожидал, что newCString "" даст мне 0 с "" /= "\0", но это не тот случай.

Единственный способ, который я вижу на данный момент, - использовать «» как индикатор того, что пользователь хочет NULL, но это кажется хакерским. Я ожидаю, что эта проблема довольно распространена, но не нашла вопроса о SO.

+0

«... поскольку« "/ =" \ 0 ", ..." В C один символ 'char s [1] = {0};', другой 'char t [2] = {0 , 0}; '. Оба являются пустыми строками в отношении функций обработки строк, а также 'NULL'. –

+0

Никогда не думал, что 'String' хранятся с 0-терминатором в Haskell. Тогда это имеет смысл. – arrowd

+0

Нет, не в Haskell, но если вы сделаете из них 'CString' (что вам нужно, чтобы передать его на C), добавляется 0-терминатор. Во всяком случае, главное, что пустая строка отличается от «NULL». –

ответ

4

Вы можете изменить функцию

foo :: Maybe String -> IO() 

а затем Nothing отправить nullPtr в вашу функцию C.

+0

Этот путь абсолютно прав от логического POV, но использование 'Just 'blabla'' всего кода будет раздражать пользователя так же, как напрямую использовать 'newCString' и' nullPtr'. – arrowd

+0

@arrowdodger Затем напишите 'foo'', который использует ваше первоначальное определение и позволяет пользователям использовать оба. – Pubby

+1

@arrowdodger. Ваше возражение можно решить, указав настраиваемый тип, такой как 'data NullStr = Null | Str String' и указав для него экземпляр IsString. Затем вы можете использовать расширение «OverloadedStrings», чтобы GHC автоматически конвертировал литералы, такие как «blabla», в «Str» blabla «» для вас. –

 Смежные вопросы

  • Нет связанных вопросов^_^