Страница 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 - вызываемая. Если их перепутать, эффекты проявляются только на вызывающей стороне, для вызваемой стороны ничего не изменяется.
Разницы между передачей по значению или ссылке тоже нет, в обоих случаях что-то записывается на стек: либо само значение, либо указатель на него.