Аналог сишного типа данных

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: Аналог сишного типа данных

Сообщение fedan »

Vadim писал(а):int128_t


https://www.freepascal.org/docs-html/rtl/sysutils/int128rec.html

Правда единственное применение это InterlockedCompareExchange128
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

fedan
Большое спасибо!
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

Что-то мне никак не приходит в голову, как можно в Паскале объявить такую сишную константу:

Код: Выделить всё

#define UNWEIGHTED           ((int *) 2)

Про типизированные константы я знаю, но их значения можно менять.
Как правильно сделать константу?
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: Аналог сишного типа данных

Сообщение fedan »

Код: Выделить всё

const
   UNWEIGHTED = PInteger(2);
Последний раз редактировалось fedan 04.04.2019 12:01:21, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

fedan
А прочитать значение потом можно будет?
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: Аналог сишного типа данных

Сообщение fedan »

Нет. Скорее получишь Access violation. Это адрес 0x00000002 (i386)
И как бы это константа - флаг для чего-то, указывающего что оно UNWEIGHTED :)

Изображение
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

fedan
Так мне с этой константой надо сравнивать ответы функций. Если значение константы получить не удастся, то как же её использовать?
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: Аналог сишного типа данных

Сообщение fedan »

А функции возвращают указатель или целое число?

Код: Выделить всё

if myFunc1 = UNWEIGHTED then
  ...

if Pinteger(myFunc2) = UNWEIGHTED then
  ...


Что вообще за проект, он в паблике есть?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

fedan
Тут я неполную информацию дал. Функция возвращает чёрте-то... :-D Целочисленный массив. Который, естественно, указатель, но вот сравнивается он именно с такой константой.

fedan писал(а):Что вообще за проект, он в паблике есть?

Проект - застрелиться и не встать ( :-D ) - более-менее автоматизированный перевод сишных заголовков в паскалевские. Делается на примере OpenMPI.
Проекта-переводчика в паблике пока нет - там пока ещё чёрт ногу сломит, а OpenMPI (в процессе работы) здесь:
https://github.com/VadimAnIsaev/FreePascal-MPI
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: Аналог сишного типа данных

Сообщение fedan »

Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

fedan
Ага.
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: Аналог сишного типа данных

Сообщение fedan »

Ну, вот например
можно преобразовать к такому
в C/C++ const int sourceweights[] = const int* sourceweights

Код: Выделить всё

{$POINTERMATH ON}
...
// sourceweights: PInteger вместо массива
// } else if (MPI_UNWEIGHTED != sourceweights && sourceweights[i] < 0) {
end else if (MPI_UNWEIGHTED <> sourceweights) and (sourceweights[i] < 0) then begin

Тут проверяется что массив sourceweights не является невзвешенным и содержит веса больше 0.
Последний раз редактировалось fedan 04.04.2019 14:37:30, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог сишного типа данных

Сообщение Vadim »

fedan
Остаётся только вопрос, а будет ли такое работать в паскале:

Код: Выделить всё

Const
  MPI_UNWEIGHTED = PInteger(2);

...

Var
  arr: array of Integer;

...

  If arr = MPI_UNWEIGHTED Then
    ...

?
Я, к сожалению, не могу найти реальных примеров с применением подобных констант, чтобы можно было повторить на Паскале и проверить.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Re: Аналог сишного типа данных

Сообщение Дож »

будет ли такое работать в паскале

Зависит от того что называть словом "работать". Если подразумевается какой-то смысл у кода, то нет -- т.к. arr является Managed типом, то в него нельзя записать произвольную пользовательскую константу, а, значит, и сравнивать с произвольной пользовательской константой нет смысла.
Ответить