1

bon j'ai essayer de faire une dll mais ca plante :

// Custom DLL example; must be named "mydll"

#define USE_TI89

#include <tigcclib.h>

DLL_INTERFACE

char MessageInDLL[]="Hello!n";
long GlobalVarInDLL;
void HelloFromDLL(void);
int SumFromDLL(int,int); 
void Off(void);

DLL_ID 007 
DLL_VERSION 2,12
DLL_EXPORTS HelloFromDLL,SumFromDLL,MessageInDLL,&GlobalVarInDLL

DLL_IMPLEMENTATION

void HelloFromDLL(void)
{
  printf ("Hello from DLL!n") 
  printf ("Global variable is %ldn", GlobalVarInDLL);
}
 
int SumFromDLL(int a, int b)
{
  return (a + b);
}

void Off(void)
{
asm("Trap #4")
}



et le fichier pour l'utiliser:
#define USE_TI89

#define SAVE_SCREEN

#include <tigcclib.h>

#define HelloFromDLL _DLL_call(void,(void),0)
#define SumFromDLL _DLL_call_attr(int,(int,int),__attribute__((stkparm)),1)
#define MessageInDLL _DLL_reference(const char,2)
#define GlobalVarInDLL _DLL_glbvar(long,3)
#define Off _DLL_call(void,(void),4)


void _main(void)
{
  if (LoadDLL ("xlib", 007, 2, 11) != DLL_OK) 
    { 
      DlgMessage ("ERROR", "Error loading DLL!", BT_OK, BT_NONE);
      return;
    }
  clrscr ();
  GlobalVarInDLL = 1234567;
  HelloFromDLL ();
  printf ("Sum from DLL: 2+3=%dn", SumFromDLL (2, 3));
  printf ("Message from DLL: %sn", MessageInDLL);
  ngetchx ();
  Off();  
  UnloadDLL ();
}

Le fichier etant bien entendu compressé...

Voila ca marche ca charge la dll, mais quand il appelle la fonction off, ca merde (address error, ou alors d'autre prog).

Donc je voulais savoir d'ou venait mon erreur :-(
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

2

-

3

ben pour la fonction Off, faut que tu mette un _Dll_call_attr et comme attribut __ATTR_LIB_ASM__

ceci est une supposition smile grin

4

cf TIGCC 0.94b18... C'est la concurence pour les libs dynamiques du kernel, mais utilisable en _nostub. C'est Zeljko qui a inventé ça grin.
Mon site perso : http://www.xwing.info

5

serait temps de se reveiller Orion_ roll oui

6

On finirait presque par se croire sous Wind0w$ wink
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

7

j'ai essayer dll_call_attr... il me met une erreur de numeric constant fou

Franchment en ce moment TIGCC commence a m'enerver!
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

8

>>DLL_EXPORTS HelloFromDLL,SumFromDLL,MessageInDLL,&GlobalVarInDLL
Il faut que ça soit:
DLL_EXPORTS HelloFromDLL,SumFromDLL,MessageInDLL,&GlobalVarInDLL, Off


Ça doit t'aider.

9

En effet!!
toutes mes excuses, je l'avais lu dans l'aide, mais je l'avais oublié!!!

Maintenant c'est tout a fait normal que ca plante!! je comprend ...
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

10

#define USE_TI89

#include <tigcclib.h>


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DLL_INTERFACE

char MessageInDLL[]="Hello!n";
long GlobalVarInDLL;
void HelloFromDLL(void);
int SumFromDLL(int,int); 
void Off(void);
void XOn(void);
void XOff(void);


DLL_ID 007
DLL_VERSION 2,12
DLL_EXPORTS HelloFromDLL,SumFromDLL,MessageInDLL,&GlobalVarInDLL,Off,XOff,XOn

DLL_IMPLEMENTATION


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

volatile unsigned long XTimer1=0;
volatile unsigned long XTimer5=0;
DEFINE_INT_HANDLER (Xhandler1)  { XTimer1++; }
DEFINE_INT_HANDLER (Xhandler5)  { XTimer5++; }
unsigned long *tigcc0,*tigcc1;
INT_HANDLER save_int_1, save_int_5;



void HelloFromDLL(void)
{
	asm("trap #4")
  printf ("Hello from DLL!n") 
  printf ("Global variable is %ldn", GlobalVarInDLL);
}
 
int SumFromDLL(int a, int b)
{
  return (a + b);
}

void Off(void)
{ 
	asm("trap #4")
}

void XOff(void)
{
	GrayOff();
	SetIntVec(AUTO_INT_5,save_int_5);
	SetIntVec(AUTO_INT_1,save_int_1);
	GKeyFlush();
}

void XOn(void)
{
	save_int_1=GetIntVec(AUTO_INT_1);
	SetIntVec(AUTO_INT_1,Xhandler1);
	save_int_5=GetIntVec(AUTO_INT_5);
	SetIntVec(AUTO_INT_5,Xhandler5);
  if (!GrayOn ())
  {
	DlgMessage("[XLib version 1.00]","ERROR: NOT ENOUGHT RAM",BT_NONE,BT_OK);
	exit(0);  
	}
	tigcc0=GetPlane (0); 
	tigcc1=GetPlane (1); 
}


Et la il me met comme erreur:
1 undefined reference to '__save__sp__'.

Je veux bien mais ca j'y peux rien c'est bien un bug de TIGCC..
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

11

>>c'est bien un bug de TIGCC
NON. Ce n'est pas un bug de TIGCC. Voici ton problem:
>>exit(0);
Il faut avoir __save__sp__ pour utiliser cette fonction, mais tu ne peux pas l'utiliser en DLL. Fais retourner à ta fonction une valeur d'erreur que tu peux utiliser pour dire s'il faut appeler à exit(0);.
TIGCC te donnerait le même si tu essayais de utiliser exit(0); avec #define NO_EXIT_SUPPORT

12

merci.

Mais c'est marqué ou toutes ces remarques... parce que sinon pour les eviter c'est dure sad
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

13

Bon support Joel ! Je n'aurais pas été capable de répondre (je n'ai jamais fait de programme avec des DLLs).

TiMad: ne critique pas TIGCC aussi rapidement que ça. Heureusement que Joel est là et que lui, il ne s'énerve pas trop. Parce que je pense que Kevin, lui s'énerverait plus que ça (et il aurait raison, en plus) !

Si tu as ce genre de bugs, tu demandes sans dire tout de suite que c'est un bug de TIGCC. C'est tout ce que je te demande, ce n'est pas compliqué, et tu seras plus apprécié sur le forum !

Un autre exemple de 'bug' de TIGCC qui est en fait dû à une mauvaise écriture:
#define ARb_real_count
((MIN_AMS >= 204 || TIOS_entries >= 0x5C2)?(*((ESI)(_rom_call_addr(5C2))))
sad*(ESI)(unsigned long)*((unsigned short *)_rom_call_addr(330)+4))

void _main(void) {
printf_xy(0,0,"%c",ARb_real_count);
}
Cela donne une quarantaine d'erreurs car il manque une parenthèse sur la dernière ligne de la macro. Et ce n'est pas un bug de TIGCC, mais un bug de ton code.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

14

Je me suis un peu emporté a cause de l'autre topic sur les 3 problemes de _rowread...
Je pense que le temps que j'ai perdu entre reconstruire des projet a cause des bugs de l'ide et ce probleme de *.a est non négligeable, ce qui a tendance a me mettre sur les ners..
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

15

J'ai encore un autre problème sad

Voila, si je veux faire passer une structure.. c'est un type comme un long (il y a un exemple sur un lon gqu ej'ai repris...
donc j'ai mis:

&Press dans dllexport (ca compile la dll...)

dans le fichier pour utiliser la dll, je met:

#define Press _DLL_glbvar(struct { char Up; char Down; char Left; char Right; char Enter; char Esc; char Apps; char B1; char B2; char B3; char B4;},36)

ca me met une parse error end of input :-(
alors ou est le problem fou
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

16

D'abord, mets ta structure en chaque fichier (le dll aussi):
typedef struct
{
char Up; char Down; char Left; char Right; char Enter; char Esc; char Apps; char B1; char B2; char B3; char B4;
} NOMDESTRUCT;
Puis,

#define Press _DLL_glbvar (NOMDESTRUCT, 36)

Maintenant, voici une idée d'utiliser exit(0); dans le dll:
dans le fichier dll:
#define USE_TI89

#include <tigcclib.h>


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DLL_INTERFACE

char MessageInDLL[]="Hello!n";
long GlobalVarInDLL;
void HelloFromDLL(void);
int SumFromDLL(int,int);
unsigned long __save__sp__;
void Off(void);
void XOn(void);
void XOff(void);


DLL_ID 007
DLL_VERSION 2,12
DLL_EXPORTS HelloFromDLL,SumFromDLL,MessageInDLL,&GlobalVarInDLL,Off,XOff,XOn,&__save__sp__

DLL_IMPLEMENTATION


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

volatile unsigned long XTimer1=0;
volatile unsigned long XTimer5=0;
DEFINE_INT_HANDLER (Xhandler1) { XTimer1++; }
DEFINE_INT_HANDLER (Xhandler5) { XTimer5++; }
unsigned long *tigcc0,*tigcc1;
INT_HANDLER save_int_1, save_int_5;



void HelloFromDLL(void)
{
asm("trap #4")
printf ("Hello from DLL!n")
printf ("Global variable is %ldn", GlobalVarInDLL);
}

int SumFromDLL(int a, int b)
{
return (a + b);
}

void Off(void)
{
asm("trap #4")
}

void XOff(void)
{
GrayOff();
SetIntVec(AUTO_INT_5,save_int_5);
SetIntVec(AUTO_INT_1,save_int_1);
GKeyFlush();
}

void XOn(void)
{
save_int_1=GetIntVec(AUTO_INT_1);
SetIntVec(AUTO_INT_1,Xhandler1);
save_int_5=GetIntVec(AUTO_INT_5);
SetIntVec(AUTO_INT_5,Xhandler5);
if (!GrayOn ())
{
DlgMessage("[XLib version 1.00]","ERROR: NOT ENOUGHT RAM",BT_NONE,BT_OK);
exit(0);
}
tigcc0=GetPlane (0);
tigcc1=GetPlane (1);
}

et puis dans l'autre fichier:
//les autres choses dans le dll
il faut ne pas avoir #define NO_EXIT_SUPPORT
#define __save__sp__dll _DLL_glbvar (unsigned long, 7)
void _main (void)
{
//fais d'autres choses....
LoadDLL (/*toutes les choses qu'il faut mettre ici*/);
__save__sp_dll = __save__sp__
//autres choses
}
Je n'ai accune idée si ça marchera ou non, mais tu puex essayer. C'est un "dirty hack" dans les mots de Zeljko, et tu ferais meiux de l'éviter.

17

joelt> pardonne moi cette question "indiscréte", mais tu es anglais ?

en tout cas, si ta langue natale n'est pas le français, je te félicite de trouver le courage de parler français ici smile
-(je ne l'ai pas moi-même de parler anglais sur le forum de la TICT)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

18

Bon pour le probleme de exit(0) j'ai fait renvoyé TRUE ou FALSE.. et apres je le compare et selon le resultat je quite ou non...

Sinon pour la structure ca ne marche pas..
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

19

< erreur>
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

20

Bon finalement j'ai reussi a le faire marcher sans declarer le typedef..
j'ai supprimer le *.o et ca marchais (alors que je recompilais quand meme// fou)
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

21

thx joelt49 smile
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

22

TiMad a écrit :
Bon finalement j'ai reussi a le faire marcher sans declarer le typedef..
j'ai supprimer le *.o et ca marchais (alors que je recompilais quand meme// fou)


Tu utilise l'IDE ?
Si oui c "normal"...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

23

mouai.. il plante pas souvent quand meme..

sinon c'est chian les dll, il faut faire passer par des var externe le type de calc etc...
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

24

squale92 a écrit :
joelt> pardonne moi cette question "indiscréte", mais tu es anglais ?

en tout cas, si ta langue natale n'est pas le français, je te félicite de trouver le courage de parler français ici smile -(je ne l'ai pas moi-même de parler anglais sur le forum de la TICT)


je pense que oué, je l'a vu assez souvent sur le forum de la tict où il y a (trop?) peu de francais smile
ben pareil, félicitation ! Idem pour KK et patrickd

25

Timad: Au fait, un appel a une DLL est tres lent...
Le code genere est :
move.l DLL_global,a0
move.l xxx(a0),a0
jsr (a0)

Pour faire un appel a une DLL.

Une library kernel serait bien mieux a tout niveaux (Et puis c compressable !)

26

Je sais pas si vous le ressentez comme moi, mais on dirait qu'un débat N/K va éclater doom

Si, si ! vous ne sentez pas comme une odeur ?

gni
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

27

Il est pas la. J'en profite tongue

28

Malheureusement XDanger traîne dans le coin en ce moment sad

Y'a un certain joelt aussi, il est du même clan frankie.gif
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

29

Le probleme Pphd, c'est que je veux pas faire une lib kernel pour la simple est bonne raison qu'il y a deja genlib qui est largement suffisante.
Je propose une alternative à genlib en nostu, apres vient bien entendu les avantages tout comme les desavantages.
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

30

nEUrOne> c aussi pr ça que je posait la question...
et aussi pr les tournures de phrases, qui me rappellaient pas mal celles de Verstand (bon, ok, il est pas anglais mais argentin... mais le français est pas sa langue natale)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall