Страница 1 из 1

результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 14:38:00
ya_vanka
Есть такая функция:

Код: Выделить всё
function CreateTexture2D(Level, Components : GLint; TexWidth, TexHeight : GLsizei; Border : GLint; Format, Type: GLenum; PData : Pointer; TexID : GLuint = 0; GenerateMipMaps : GLboolean = false; MipMapMaxLevel : GLint = 1024) : GLuint;


Если я вторым параметром передаю результат другой функции (function ilGetInteger(Mode: TILenum): TILint; stdcall; external OPENILDLL;):
Код: Выделить всё
CreateTexture2D(0, ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL), TexWidth, TexHeight, 0, ImgFormat, GL_UNSIGNED_BYTE, PImgData, 0, GenerateMipMaps, MipMapMaxLevel);


то внутри функции CreateTexture2D параметр TexHeight равен 0, а не реально предаваемому значению.

А если через переменную:
Код: Выделить всё
BPP := ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);
Result := CreateTexture2D(0, BPP, TexWidth, TexHeight, 0, ImgFormat, GL_UNSIGNED_BYTE, PImgData, 0, GenerateMipMaps, MipMapMaxLevel);
то все нормально передается.

Подскажите в чем дело?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 14:40:42
zub
Проверял выключеной оптимизацией?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 14:44:51
vada
А как сопоставимы типы GLint и TILint?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 15:28:43
ya_vanka
zub писал(а):Проверял выключеной оптимизацией?

Оптимизация не влияет.

vada писал(а):А как сопоставимы типы GLint и TILint?

Эквивалентны. А если бы отличались разве приведение типов не сработало бы? Передача параметра ведь по значению идет, не по сылке.

Добавлено спустя 1 минуту 8 секунд:
Работаю под Ubuntu на виртуалке. Если это имеет значение.

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 15:40:14
vada
А значение TexWidth не портится?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 15:41:22
ya_vanka
vada писал(а):А значение TexWidth не портится?

Не портится.

А вот все параметры, которые идут после TexHeight сдвинуты, т.е. в Border приходит Format, в Format - Type, дальше видимо тоже самое, но типы уже другие, сложно проследить.

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 16:42:13
runewalsh
> function ilGetInteger(Mode: TILenum): TILint; stdcall;
> stdcall;

Попробуй cdecl.

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 16:54:09
ya_vanka
stdcall задает соглашение вызова для ilGetInteger. И эта функция отрабатывает корректно. Так что не вижу смысла.

Вот правда сейчас подумал может FPC глючит из-за того, что у ilGetInteger и CreateTexture2D разные соглашения вызова?
Кстати какое соглашение вызова по умолчанию в FPC?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 17:05:26
Kemet
ya_vanka писал(а):Работаю под Ubuntu на виртуалке. Если это имеет значение.

64 бита?

Добавлено спустя 2 минуты 36 секунд:
sizeof GLint и TILint чему равны?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 17:17:33
ya_vanka
Ubuntu 12.04 32-bit
Host 64-bit (но вроде не важно)

GLint = Integer = TILint

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 17:24:56
Kemet
ya_vanka писал(а):Ubuntu 12.04 32-bit
Host 64-bit (но вроде не важно)

GLint = Integer = TILint
чему конкретно равно sizeof

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 18:11:29
ya_vanka
sizeOf(GLint) = 4

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 07.08.2013 18:51:32
Kemet
таки попробуй для ilGetInteger поставить cdecl а не stdcall, потому как не Винда у тебя

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 12.08.2013 11:30:51
ya_vanka
Да, действительно в этом было дело. Спасибо!

Правда, не до конца понятно почему функция ilGetInteger работает с неправильным соглашением вызова?
И почему возникла проблема при передаче параметра по значению, а не по ссылке?

Re: результат функции как параметр, передаваемый в процедуру

СообщениеДобавлено: 12.08.2013 12:15:20
Sergei I. Gorelkin
Разница между cdecl и stdcall в том, что при возврате при cdecl указатель стека подстраивает вызывающая сторона, а при stdcall - вызываемая. Если их перепутать, эффекты проявляются только на вызывающей стороне, для вызваемой стороны ничего не изменяется.
Разницы между передачей по значению или ссылке тоже нет, в обоих случаях что-то записывается на стек: либо само значение, либо указатель на него.