С Новым годом! Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53

FFI и пользовательский тип данных

03.01.2020, 19:27. Показов 1717. Ответов 3

Студворк — интернет-сервис помощи студентам
Начал изучать FFI и не могу понять как свой тип данных передать в импортируемую функцию. Пытаюсь представить на Хаскелле нужный той самой функции тип:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- https://wiki.haskell.org/Foreign_Function_Interface#Data_structures
-- https://fresh2refresh.com/c-programming/c-structure-padding/
 
{-# LANGUAGE ForeignFunctionInterface #-}
 
import Foreign
import Foreign.C.Types
import System.Win32.Types (HANDLE, BOOL)
import Control.Applicative ((<$>), (<*>))
import Foreign.Storable
 
data COORD = COORD { x :: Int16
                               , y :: Int16 }
 
instance Storable COORD where
        alignment _ = 2
        sizeOf _    = 4
        peek ptr    = COORD
            <$> peekByteOff ptr 0
            <*> peekByteOff ptr 2
        poke ptr (COORD x y) = do
            pokeByteOff ptr 0 x
            pokeByteOff ptr 2 y
 
foreign import ccall "windows.h SetConsoleCursorPosition"
При компиляции получаю ошибку: Unacceptable argument type in foreign declaration: `COORD' cannot be marshalled in a foreign call
Как сделать свой тип marshallable? В 1 и 2 строке источники, которыми руководствовался. Если можно, то, пожалуйста, объясните как можно проще.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2020, 19:27
Ответы с готовыми решениями:

Пользовательский тип данных
Подскажите как реализовать что-то такое: MyClass a = new MyClass() a = 100; По сути мне нужно сделать что-то вроде типа данных в...

Пользовательский тип данных для C
Помогите пожалуйста создать пользовательский тип данных для языка C, так как мне не хватает обычных....

Пользовательский тип данных и его использование в C#
Доброго времени суток! Есть база данных с определенным пользователем типом данных и функциями с использованием данного типа, необходимо...

3
Модератор
 Аватар для Curry
5153 / 3453 / 536
Регистрация: 01.06.2013
Сообщений: 7,520
Записей в блоге: 9
04.01.2020, 09:13
Лучший ответ Сообщение было отмечено Explain как решение

Решение

Для небольших структур, которые передаются по значению, лучше их значение так прямо и составить через ИЛИ и сдвиги.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{-# LANGUAGE CPP,ForeignFunctionInterface #-}
 
#if defined(i386_HOST_ARCH)
#   define WINDOWS_CCONV stdcall
#elif defined(x86_64_HOST_ARCH)
#   define WINDOWS_CCONV ccall
#else
#   error Unknown mingw32 arch
#endif
 
import System.Win32.Types (HANDLE, BOOL, SHORT, DWORD)
import Graphics.Win32.Misc (getStdHandle,sTD_OUTPUT_HANDLE)
import qualified Control.Monad as CM (void)
import Data.Bits
 
newtype COORD = COORD DWORD
 
foreign import WINDOWS_CCONV "windows.h SetConsoleCursorPosition"
            setConsoleCursorPosition :: HANDLE -> COORD -> IO BOOL
 
mkCOORD:: SHORT -> SHORT -> COORD
mkCOORD x y = COORD $ ((fromIntegral y) `shiftL` 16) .|. (fromIntegral x)
 
main :: IO ()
main = do
    putStrLn "Hellow world"
    hOut <- getStdHandle  sTD_OUTPUT_HANDLE
    let cp = mkCOORD 5 3
    CM.void $ setConsoleCursorPosition hOut cp 
    CM.void $ getLine
Добавлено через 7 минут
Кстати, на stackage.org лежит, как всегда, старая Win32 версии 2.6.1.0. Не любят они Винду.
А на hackage версия 2.8.5.0, и там уже описание COORD есть.
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
09.01.2020, 20:43  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
Для небольших структур, которые передаются по значению, лучше их значение так прямо и составить через ИЛИ и сдвиги.
Работает, спасибо. Однако на таком простом примере хотелось бы понять, что делать, если структуры данных будут не такими простыми.
0
Модератор
 Аватар для Curry
5153 / 3453 / 536
Регистрация: 01.06.2013
Сообщений: 7,520
Записей в блоге: 9
09.01.2020, 22:27
Цитата Сообщение от Explain Посмотреть сообщение
хотелось бы понять, что делать, если структуры данных будут не такими простыми.
Точнее, если они должны передаваться не по значению, а по указателю.
Смотрим внутр. http://hackage.haskell.org/pac... DlgItemInt
Haskell
1
2
3
4
5
6
7
8
getDlgItemInt :: HWND -> Int -> Bool -> IO Int
getDlgItemInt dlg item signed =
  alloca $ \ p_trans -> do
  res <- c_GetDlgItemInt dlg item p_trans signed
  failIfFalse_ "GetDlgItemInt" $ peek p_trans
  return (fromIntegral res)
foreign import WINDOWS_CCONV "windows.h GetDlgItemInt"
  c_GetDlgItemInt :: HWND -> Int -> Ptr Bool -> Bool -> IO UINT
Здесь аргумент сырой сишной функции Ptr Bool. Написана функция - обёртка, которая временно выделяет память под такой аргумент, вызывает, сырую функцию. Если бы аргумент был не Ptr Bool, а Ptr VeryCompicatedStruct, то можно было бы сделать сериализацию с помощью Storable, а сосбственно, память под сишную структуру выделять с помощью одной из функций модуля https://www.stackage.org/haddo... Alloc.html
и других Foreign.Marshal.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2020, 22:27
Помогаю со студенческими работами здесь

WCF Получить пользовательский тип данных
Добрый день! Я подключаюсь к своей службе программным образом. Не используя ссылку на службу. Как мне получить объект...

Компилятор не опознает пользовательский тип данных
Не понимаю, почему не компилируется, вроде все делаю правильно, а ошибка вот в этой строке AUZ a; int main(int argc, char *argv) { ...

Шаблон класса. Пользовательский тип данных
Всем привет. Помогите с кодом. Не получается сделать пользовательский тип данных. Создаю объект в главной функции, но выдаёт ошибку если...

ostream_iterator, copy и пользовательский тип данных
Здравствуйте. #include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;string&gt; #include&lt;sstream&gt; #include&lt;set&gt; #include&lt;vector&gt; ...

Описать функцию, возвращающую пользовательский тип данных
реализуемо ли это? написал код, компилятор ругается: type shape = array of integer; ... function Moving: shape; ошибка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru