Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DevIL Discussion :

problème avec ilSetMemory


Sujet :

DevIL

  1. #1
    Futur Membre du Club
    problème avec ilSetMemory
    Bonjour à tous,

    Je suis en train de programmer un gros projet utilisant entre autre Devil sous linux (Ubuntu 9.10 32 bits) et je voudrais porter mon projet sous windows 7 32bits. Or j'y utilise Devil d'une manière assez particulière car l'allocation et la libération de la mémoire passent par mes propres fonctions grâce à la fonction de Devil : ilSetMemory. Or sous windows, cette fonction semble faire planter mon application. J'ai fait un programme minimal pour ilustrer mon problème :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <iostream>
    #include <IL/il.h>
    #include <cstdlib>
     
    using namespace std;
     
    void * _Alloc_CB(const ILsizei iSize)
    {
        return malloc(iSize);
    }
     
    void _Free_CB(const void * CONST_RESTRICT iBuf)
    {
        free((void *)iBuf);
    }
     
    int main()
    {
        ilSetMemory((mAlloc)_Alloc_CB, (mFree)_Free_CB);
        ilInit();
        ilShutDown();
     
        return 0;
    }


    Pour compiler ce code j'utilise code::block avec mingw32.
    Le programme compile parfaitement mais lors de l'exécution, il plante dans la fonction "_Alloc_CB". Si j'enlève la ligne "ilSetMemory(..." le programme s'exécute de nouveau parfaitement. Si je met "ilInit();" avant "ilSetMemory(...", le programme plante cette fois dans "_Free_CB" (Ce qui me semble assez logique après tout).

    Je précise que ce code compile et s'exécute parfaitement sous linux. J'utilise la version 1.78 de Devil (qui est la dernière version), mais j'ai essayé toutes les versions de la forme 1.7x mais ça plante toujours au même endroit, de plus il est hors de question que je j'utilise une version inférieur aux 1.7 car il y manquerait des fonctions dont j'ai besoin.

    Voila, si vous avez une idée d'où mon problème peux bien venir n'hésitez pas à me le dire.

    Je vous remercie d'avance.
    Koubykoub.

  2. #2
    Futur Membre du Club
    Rebonjour,

    J'ai réglé tout seul mon problème :
    Il faut mettre ILAPIENTRY devant les déclarations des call back (_Alloc_CB et _Free_CB), ce qui donne :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <iostream>
    #include <IL/il.h>
    #include <cstdlib>
     
    using namespace std;
     
    ILAPIENTRY void * _Alloc_CB(const ILsizei iSize)
    {
        return malloc(iSize);
    }
     
    ILAPIENTRY void _Free_CB(const void * CONST_RESTRICT iBuf)
    {
        free((void *)iBuf);
    }
     
    int main()
    {
        ilSetMemory(_Alloc_CB, _Free_CB);
        ilInit();
        ilShutDown();
     
        return 0;
    }


    Notez que l'on est plus obligé de caster "_Alloc_CB" et "_Free_CB" dans "ilSetMemory". La raison pour laquel ça marche bien sous linux est que "ILAPIENTRY" est une définition vide.

    Voila, Désolé pour avoir posté trop vite...

    koubykoub

###raw>template_hook.ano_emploi###