Глюк компилятора

Предыдущая тема Следующая тема Перейти вниз

Глюк компилятора

Сообщение  Miha в Ср Авг 19, 2009 5:14 am

При вызове функции программа выдаёт ошибку.

Код:

type structTexture
   imageData as ubyte ptr   
   bpp as uinteger         
   texwidth as uinteger   
   height as uinteger   
   texID as uinteger   
   textype   as uinteger
end type

function ImportTGA( byval FileName as string, byval flags as integer, byval usealpha as string, byval ext1 as string, byval ext2 as string, byval ext3 as string ) as uinteger
dim LoadResult as structTexture
dim LoadTGAResult as integer
dim Alpha as byte ptr
dim tex as uinteger
dim a as integer
dim as string atest1, atest2, atest3
dim as integer a2test1, a2test2, a2test3
LoadTGAResult = LoadTGA( @LoadResult, FileName )
glGenTextures 1, @tex
glBindTexture GL_TEXTURE_2D, tex
   
    if not LoadTGAResult = 0 then
    if lcase(usealpha) = "standart" then
        GoTo NoAlphaTex
    elseif lcase(usealpha) = "picture" then
        Alpha = LoadAlpha( ext1, ext2 )
        if Alpha <> 0 and LoadResult.texwidth = AlphaTexX and LoadResult.height = AlphaTexY then
      for a=0 to LoadResult.texwidth*LoadResult.height - 1
         Alpha[4*a] = LoadResult.ImageData[a*(LoadResult.bpp \ 8)]                '' R
         Alpha[4*a+1] = LoadResult.ImageData[a*(LoadResult.bpp \ 8)+1]            '' G
         Alpha[4*a+2] = LoadResult.ImageData[a*(LoadResult.bpp \ 8)+2]            '' B
      next
        GoTo AlphaTex
        else
        GoTo NoAlphaTex
        end if
    elseif lcase(usealpha) = "point" then
        Alpha = allocate( 4*LoadResult.texwidth*LoadResult.height)
        for a=0 to LoadResult.texwidth*LoadResult.height - 1
         Alpha[4*a] = LoadResult.ImageData[a*(LoadResult.bpp \ 8)]                '' R
         Alpha[4*a+1] = LoadResult.ImageData[a*(LoadResult.bpp \ 8)+1]            '' G
         Alpha[4*a+2] = LoadResult.ImageData[a*(LoadResult.bpp \ 8)+2]            '' B
            atest1 = Alpha[4*a]
            atest2 = Alpha[4*a+1]
            atest3 = Alpha[4*a+2]
            a2test1 = asc(atest1)
            a2test2 = asc(atest2)
            a2test3 = asc(atest3)
            if a2test1 = val(ext1) and a2test2 = val(ext2) and a2test3 = val(ext3) then
                Alpha[4*a+3] = 0
            else
                Alpha[4*a+3] = -1
            end if
      next
        GoTo AlphaTex
    end if
    end if
   
exit function
NoAlphaTex:
    if flags = 1 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D,0,LoadResult.bpp \ 8,LoadResult.texwidth, LoadResult.height,0,LoadResult.textype,GL_UNSIGNED_BYTE,LoadResult.ImageData)
    end if
    if flags = 2 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST)
    gluBuild2DMipmaps(GL_TEXTURE_2D,LoadResult.bpp \ 8, LoadResult.texwidth, LoadResult.height, LoadResult.textype,GL_UNSIGNED_BYTE,LoadResult.ImageData)
    end if
    if flags = 3 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,LoadResult.bpp \ 8, LoadResult.texwidth, LoadResult.height, LoadResult.textype,GL_UNSIGNED_BYTE,LoadResult.ImageData)
    end if
    if flags = 4 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,g_nMaxAnisotropy-0.1)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,LoadResult.bpp \ 8, LoadResult.texwidth, LoadResult.height, LoadResult.textype,GL_UNSIGNED_BYTE,LoadResult.ImageData)
    end if
    function = tex
AlphaTex:
    if flags = 1 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,LoadResult.texwidth, LoadResult.height,0,GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    if flags = 2 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST)
    gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8, LoadResult.texwidth, LoadResult.height, GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    if flags = 3 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8, LoadResult.texwidth, LoadResult.height, GL_RGBA,GL_UNSIGNED_BYTE,LoadResult.Alpha)
    end if
    if flags = 4 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,g_nMaxAnisotropy-0.1)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8, LoadResult.texwidth, LoadResult.height, GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    function = tex
end function

Если перед GoTo AlphaTex поставить LoadResult.ImageData = Alpha ,а в AlphaTex альфу заменить на
LoadResult.ImageData , то всё идёт нормально. Есть анологичная функция, которая работает без изменений:

Код:

type BITMAP_RGBImageRec FIELD = 1
  sizeX as integer
  sizeY as integer
  buffer as ubyte ptr
end type

function ImportBMP( byval FileName as string, byval flags as integer, byval usealpha as string, byval ext1 as string, byval ext2 as string, byval ext3 as string  ) as uinteger
dim LoadResult as BITMAP_RGBImageRec ptr
dim Alpha as byte ptr
dim tex as uinteger
dim a as integer
dim as string atest1, atest2, atest3
dim as integer a2test1, a2test2, a2test3
glGenTextures(1,@tex)
glBindTexture(GL_TEXTURE_2D,tex)
LoadResult=LoadBMP( FileName )
   
    if not LoadResult = 0 then
    if lcase(usealpha) = "standart" then
        GoTo NoAlphaTex
    elseif lcase(usealpha) = "picture" then
        Alpha = LoadAlpha( ext1, ext2 )
        if Alpha <> 0 and LoadResult->sizeX = AlphaTexX and LoadResult->sizeY = AlphaTexY then
      for a=0 to LoadResult->sizeX*LoadResult->sizeY - 1
         Alpha[4*a] = LoadResult->buffer[a*3]                '' R
         Alpha[4*a+1] = LoadResult->buffer[a*3+1]            '' G
         Alpha[4*a+2] = LoadResult->buffer[a*3+2]            '' B
      next
        GoTo AlphaTex
        else
        GoTo NoAlphaTex
        end if
    elseif lcase(usealpha) = "point" then
        Alpha = allocate( 4*LoadResult->sizeX*LoadResult->sizeY)
      for a=0 to LoadResult->sizeX*LoadResult->sizeY - 1
         Alpha[4*a] = LoadResult->buffer[a*3]                '' R
         Alpha[4*a+1] = LoadResult->buffer[a*3+1]            '' G
         Alpha[4*a+2] = LoadResult->buffer[a*3+2]            '' B
            atest1 = Alpha[4*a]
            atest2 = Alpha[4*a+1]
            atest3 = Alpha[4*a+2]
            a2test1 = asc(atest1)
            a2test2 = asc(atest2)
            a2test3 = asc(atest3)
            if a2test1 = val(ext1) and a2test2 = val(ext2) and a2test3 = val(ext3) then
                Alpha[4*a+3] = 0
            else
                Alpha[4*a+3] = -1
            end if
      next   
        GoTo AlphaTex
    end if
    end if

'function = tex
exit function
NoAlphaTex:
    if flags = 1 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D,0,3,LoadResult->sizeX,LoadResult->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,LoadResult->buffer)
    end if
    if flags = 2 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST)
    gluBuild2DMipmaps(GL_TEXTURE_2D,3,LoadResult->sizeX,LoadResult->sizeY,GL_RGB,GL_UNSIGNED_BYTE,LoadResult->buffer)
    end if
    if flags = 3 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,3,LoadResult->sizeX,LoadResult->sizeY,GL_RGB,GL_UNSIGNED_BYTE,LoadResult->buffer)
    end if
    if flags = 4 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,g_nMaxAnisotropy-0.1)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,3,LoadResult->sizeX,LoadResult->sizeY,GL_RGB,GL_UNSIGNED_BYTE,LoadResult->buffer)
    end if
    function = tex
AlphaTex:
    if flags = 1 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,LoadResult->sizeX,LoadResult->sizeY,0,GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    if flags = 2 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST)
    gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8,LoadResult->sizeX,LoadResult->sizeY,GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    if flags = 3 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8,LoadResult->sizeX,LoadResult->sizeY,GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    if flags = 4 then
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,g_nMaxAnisotropy-0.1)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8,LoadResult->sizeX,LoadResult->sizeY,GL_RGBA,GL_UNSIGNED_BYTE,Alpha)
    end if
    function = tex
end function
Это глюк компилятора, или я что-то делаю не так?

Miha

Сообщения : 1
Дата регистрации : 2009-08-19

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Глюк компилятора

Сообщение  tux в Ср Авг 19, 2009 8:49 am

ну во первых надо бы написать че за ошибка, или даже лучше дать кусок исходника, который можно откомпилить, и самому посмотреть, че там происходит, во вторых Alpha является зарезервированным словом, хоть оно и используется в определенном контексте, в других слчаях вполне возможно оно хранит какието свои значения, всетаки я стараюсь не давать такие имена
ЗЫ: за два с половиной года я еще ни разу не видел глюк компилятора, всегда это был либо мой, либо глюк системы
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 28
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Глюк компилятора

Сообщение  Eric-S в Ср Авг 19, 2009 9:14 am

Исходник из первого поста содержит оператор goto и это уже не кашерно.
От этой пакости нужно срочно избавиться!
Наткнувшись на goto я не стал даже ломать голову дальше.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Глюк компилятора

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения