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

Форум для изучающих FPC и их учителей.

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

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

Сообщение ya_vanka » 07.08.2013 14:38:00

Есть такая функция:

Код: Выделить всё
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);
то все нормально передается.

Подскажите в чем дело?
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение zub » 07.08.2013 14:40:42

Проверял выключеной оптимизацией?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vada » 07.08.2013 14:44:51

А как сопоставимы типы GLint и TILint?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение ya_vanka » 07.08.2013 15:28:43

zub писал(а):Проверял выключеной оптимизацией?

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

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

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

Добавлено спустя 1 минуту 8 секунд:
Работаю под Ubuntu на виртуалке. Если это имеет значение.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение vada » 07.08.2013 15:40:14

А значение TexWidth не портится?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение ya_vanka » 07.08.2013 15:41:22

vada писал(а):А значение TexWidth не портится?

Не портится.

А вот все параметры, которые идут после TexHeight сдвинуты, т.е. в Border приходит Format, в Format - Type, дальше видимо тоже самое, но типы уже другие, сложно проследить.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение runewalsh » 07.08.2013 16:42:13

> function ilGetInteger(Mode: TILenum): TILint; stdcall;
> stdcall;

Попробуй cdecl.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение ya_vanka » 07.08.2013 16:54:09

stdcall задает соглашение вызова для ilGetInteger. И эта функция отрабатывает корректно. Так что не вижу смысла.

Вот правда сейчас подумал может FPC глючит из-за того, что у ilGetInteger и CreateTexture2D разные соглашения вызова?
Кстати какое соглашение вызова по умолчанию в FPC?
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение Kemet » 07.08.2013 17:05:26

ya_vanka писал(а):Работаю под Ubuntu на виртуалке. Если это имеет значение.

64 бита?

Добавлено спустя 2 минуты 36 секунд:
sizeof GLint и TILint чему равны?
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

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

Сообщение ya_vanka » 07.08.2013 17:17:33

Ubuntu 12.04 32-bit
Host 64-bit (но вроде не важно)

GLint = Integer = TILint
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение Kemet » 07.08.2013 17:24:56

ya_vanka писал(а):Ubuntu 12.04 32-bit
Host 64-bit (но вроде не важно)

GLint = Integer = TILint
чему конкретно равно sizeof
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

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

Сообщение ya_vanka » 07.08.2013 18:11:29

sizeOf(GLint) = 4
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение Kemet » 07.08.2013 18:51:32

таки попробуй для ilGetInteger поставить cdecl а не stdcall, потому как не Винда у тебя
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

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

Сообщение ya_vanka » 12.08.2013 11:30:51

Да, действительно в этом было дело. Спасибо!

Правда, не до конца понятно почему функция ilGetInteger работает с неправильным соглашением вызова?
И почему возникла проблема при передаче параметра по значению, а не по ссылке?
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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

Сообщение Sergei I. Gorelkin » 12.08.2013 12:15:20

Разница между cdecl и stdcall в том, что при возврате при cdecl указатель стека подстраивает вызывающая сторона, а при stdcall - вызываемая. Если их перепутать, эффекты проявляются только на вызывающей стороне, для вызваемой стороны ничего не изменяется.
Разницы между передачей по значению или ссылке тоже нет, в обоих случаях что-то записывается на стек: либо само значение, либо указатель на него.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru