Выбрать главу

Подпрограмма обратного вызова, использующая соглашение cdecl и выдающая результат с плавающей точкой, может не работать с exw. Это происходит из-за особенностей компилятора Watcom C (с ним строится exw), который в формате cdecl нестандартным образом обходится с результатами, имеющими тип с плавающей точкой.

Пример программы:

demo\win32\window.exw, demo\linux\qsort.exu

См. также:

routine_id, platform_r.htm

c_func

Платформа:

WIN32, Linux, FreeBSD

Синтаксис:

x = c_func(i, s)

Описание:

Вызывает Си-функцию, или функцию машинного кода, или транслированную/ компилированную функцию Euphoria, имеющую идентификатор (номер) функции i. Аргумент i должен быть разрешённым номером, выданным функцией define_c_func(). Аргумент s является рядом длины n, содержащим значения аргументов занумерованной функции, где n - число аргументов, требуемых функцией номер i. В переменной x будет содержаться результат, выданный Си-функцией.

Комментарии:

Если Си-функция не требует подачи никаких аргументов, тогда ряд s должен быть пустым рядом {}.

Если в качестве аргумента вы подаёте величину, которая содержит дробную часть, в то время как Си-функция ожидает целочисленный тип Си, аргумент будет округлен в сторону нуля, т.е. 5.9 будет подано как 5, а -5.9 будет подано как -5.

Функция Си может входить в состав библиотеки .dll или .so, созданной транслятором с Euphoria на Си. В этом случае выдаваемая ею величина могла бы быть типа атом или ряд Euphoria. Но функции Си и функции машинного кода могут выдавать только целочисленные величины или, в более общем случае, атомы (числа с плавающей точкой по стандарту IEEE).

Пример:

atom user32, hwnd, ps, hdc

integer BeginPaint

-- открыть user32.dll - она содержит Си-функцию BeginPaint

user32 = open_dll("user32.dll")

-- Си-функция BeginPaint принимает аргументы типа C int и

-- типа C pointer, и выдаёт величину типа C int в качестве результата:

BeginPaint = define_c_func(user32, "BeginPaint",

{C_INT, C_POINTER}, C_INT)

-- вызвать BeginPaint, подавая hwnd и ps в качестве аргументов,

-- присвоить результат hdc:

hdc = c_func(BeginPaint, {hwnd, ps})

См. также:

c_proc, define_c_func, open_dll, platform_r.htm

c_proc

Платформа:

WIN32, Linux, FreeBSD

Синтаксис:

c_proc(i, s)

Описание:

Вызывает Си-функцию или процедуру машинного кода, используя идентификатор (номер) процедуры i. Аргумент i должен быть разрешенным идентификатором процедуры, выданным функцией define_c_proc(). Аргумент s является рядом длины n, содержащим величины аргументов вызываемой Си-функции (процедуры), где n - число аргументов, требуемых Си-функцией (процедурой).

Комментарии:

Если Си-функция не требует подачи никаких аргументов, тогда ряд s должен быть пустым рядом {}.

Если в качестве аргумента вы подаёте величину, которая содержит дробную часть, в то время как Си-функция ожидает целочисленный тип Си, аргумент будет округлен в сторону нуля, т.е. 5.9 будет подано как 5, а -5.9 будет подано как -5.

Функция Си может входить в состав библиотеки .dll или .so, созданной транслятором с Euphoria на Си.

Пример:

atom user32, hwnd, rect

integer GetClientRect

-- открыть user32.dll - здесь содержится Си-функция GetClientRect

user32 = open_dll("user32.dll")

-- GetClientRect - это Си-функция типа VOID, у которой два аргумента - типа C int

-- и типа C pointer:

GetClientRect = define_c_proc(user32, "GetClientRect",

{C_INT, C_POINTER})

-- подать hwnd и rect в качестве аргументов

c_proc(GetClientRect, {hwnd, rect})

См. также:

c_func, call, define_c_proc, open_dll, platform_r.htm

call_func

Синтаксис:

x = call_func(i, s)

Описание:

Вызывает определенную программистом Euphoria-функцию с идентификатором (номером) подпрограммы i. Аргумент i должен быть разрешенным идентификатором (номером), выданным routine_id(). Аргумент s является рядом длины n, содержащим аргументы занумерованной функции, где n - число аргументов, требуемых функцией номер i. Переменная x будет содержать результат, выданный функцией номер i.

Комментарии:

Если функция номер i не требует подачи никаких аргументов, тогда ряд s должен быть пустым рядом {}.

Пример программы:

demo\csort.ex

См. также:

call_proc, routine_id

call_proc

Синтаксис:

call_proc(i, s)

Описание:

Вызывает определенную программистом Euphoria-процедуру с идентификатором (номером) подпрограммы i. Аргумент i должен быть разрешенным идентификатором (номером), выданным routine_id(). Аргумент s является рядом длины n, содержащим аргументы занумерованной процедуры, где n - число аргументов, требуемых процедурой номер i.

Комментарии:

Если процедура номер i не требует подачи никаких аргументов, тогда ряд s должен быть пустым рядом {}.

Пример:

global integer foo_id

procedure x()

call_proc(foo_id, {1, "Hello World\n"})

end procedure

procedure foo(integer a, sequence s)

puts(a, s)

end procedure

foo_id = routine_id("foo")

x()

См. также:

call_func, routine_id

chdir

Синтаксис:

include file.e

i = chdir(s)

Описание:

Изменяет текущий каталог (директорию, фолдер, папку) по пути, который задан рядом s. Аргумент s должен содержать имя каталога, существующего на данной машине. В случае успешного изменения каталога chdir() выдаёт 1. Если перейти в заданный каталог не удалось, chdir() выдаёт 0.

Комментарии:

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

Функция current_dir() выдаёт имя текущего каталога.

Под DOS32 и WIN32 текущий каталог является общим для всех программ и процессов, исполняемых в одной оболочке (т.е. под управлением одного и того же или единственного экземпляра интерпретатора команд ОС).

Под Linux/FreeBSD дочерние программы могут изменять текущий каталог для своих нужд, но эти изменения не будут относиться к текущему каталогу родительской программы.

Пример:

if chdir("c:\\euphoria") then

f = open("readme.doc", "r")

else

puts(1, "Ошибка: отсутствует каталог euphoria?\n")

end if

См. также:

current_dir

check_break

Синтаксис:

include file.e

i = check_break()

Описание:

Выдаёт число нажатий сочетания клавиш control-c или control-Break, имевших место с момента последнего вызова check_break(), или с начала программы, если этот вызов первый.

Комментарии:

Данная функция полезна, если в вашей программе была исполнена команда allow_break(0), которая запрещает прерывание вашей программы по нажатию сочетания клавиш control-c и control-Break. Вы можете использовать check_break(), чтобы выяснить, не нажимал ли всё-таки пользователь одно из этих аварийных сочетаний клавиш. Затем вы можете сделать всё то, что требуется для аккуратного и безошибочного завершения вашей программы без малейшего риска потери данных и повреждений файловой системы на диске.