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