1

Bonjour, je viens depuis peut de me lancer dans la programmation en C, le gain de vitesse est impréssionnant. J'ai déja ecrit un programme qui permet de transformé les coordonnées rectangulaire en coordonnées polaire. Maintenant je veut transformée les coordonnées rectangulaire contenue dans une matrice en coordonnées polaire.
Le format de la matrice d'entré est le suivant :
__ __
| ind1 .... indn | entier
| X1 .... Xn | réel
|_Y1 .... Yn_| réel

Le format de la matrice de sortie est le suivant
__ __
| ind1 .... indn | entier
| r1 .... rn | réel, module
|_ teta_1 teta_n_| réel, angle

Voila ce que le programme donne en Ti Basic :

imp2rec(matxy)
Func
local i,x,y
for i,1,dim(matxy)[2]
matxy[2,1]->x
matxy[3,1]->y
rec2pol(x,y)[1]->matxy[2,i]
rec2pol(x,y)[2]->matxy[3,i]
endfor
return matxy
endfunc

J'aimerais faire la même chose en C. Pouvez vous m'expliquer :
* comment faire pour récupérer la 2éme et la troisieme ligne de la matrice
* faire un tableau de réél de dimmension 2*n, avec la 2nd et 3éme ligne de la matrice
* recuperer la 1er ligne de la matrice
* faire une liste de n élements entier avec la premiére ligne
* retourné une matrice constitué de la liste et du tableau de réél dans l'ecrant home de la machine


rec2pol est deja un programme en C :

// transformation coordonnées rectangulaire en poliare
// Try this program donner les coordonnées(x,y)

#define USE_TI89
#define USE_TI92PLUS
#define USE_V200

#define MIN_AMS 101
#include <tigcclib.h>

void _main(void)
{
float pi,r,g,tang,a[3];
int i;
ESI argptr;
InitArgPtr (argptr);
pi=3.141592653589793238462643383279502884;
//Contrôle que les 2 arguments soient des entiers ou des rééls
for(i=0 ; i<3 ; i++)
{
if (GetArgType (argptr) == FLOAT_TAG) a[i] = GetFloatArg (argptr);
else if (GetArgType (argptr) == POSINT_TAG || GetArgType (argptr) == NEGINT_TAG)
{
if (GetArgType (argptr) == POSINT_TAG) a[i]= GetIntArg (argptr);
else a[i] = -(GetIntArg (argptr));
}
else
{
ST_helpMsg("Wrong arg type!");
while (GetArgType(top_estack)!=END_TAG)
top_estack=next_expression_index(top_estack);
top_estack--;
return;
}
}
//efface les arguments en trop
while (GetArgType(top_estack)!=END_TAG)
top_estack=next_expression_index(top_estack);
top_estack--;


//initialise selon le mode angulaire;
if (a[2]==0) tang=180;
else if (a[2]>0) tang=200;
else tang=pi;

//calcule r et g
if ((a[0]==0) || (a[1]==0)) // x=0 ou y=0
{
if ((a[0]==0) && (a[1]==0)) //x et y sont nuls
{
r=0;
g=0;
}
else if ((a[0]==0) && (a[1]!=0)) // x=0
{if (a[1]>0) g=0; //y>0
else g=tang;} // y<0
else if ((a[1]==0) && (a[0]!=0)) // y=0
{if (a[0]>0) g=tang/2; //x>0
else g=3*tang/2;} // x<0
}
else// x et y sont différents de 0
{
if (abs(a[0])<=abs(a[1]))
{
g=atan(a[0]/a[1])*tang/pi;
if (a[1]>0) g=(g<0)*2*tang+g;
else g=tang+g;
}
else
{
g=atan(a[1]/a[0])*tang/pi;;
if (a[0]>0) g=pi/2-g;
else g=3*pi/2-g;
}
}
a[0]=sqrt(a[0]*a[0]+a[1]*a[1]);
a[1]=g;
//retourne la liste de r et g
push_quantum(END_TAG);
push_Float (a[1]);
push_Float (a[0]);
push_quantum(LIST_TAG);
}
Petit à petit on deviens moins petit

2

Ton code est illisible, utilise un tag pre ou source s'il te plaît...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3


tromb Fichier joint : rec2pol.c
Voici donc le fichier du code précédant. // transformation coordonnées rectangulaire en poliare // Try this program donner les coordonnées(x,y) #define USE_TI89 #define USE_TI92PLUS #define USE_V200 #define MIN_AMS 101 #include <tigcclib.h> void _main(void) {   float pi,r,g,tang,a[3];   int i;   ESI argptr;   InitArgPtr (argptr);   pi=3.141592653589793238462643383279502884;   //Contrôle que les 2 arguments soient des entiers ou des rééls       for(i=0 ; i<3 ; i++)       {     if (GetArgType (argptr) == FLOAT_TAG) a[i] = GetFloatArg (argptr);     else if (GetArgType (argptr) == POSINT_TAG || GetArgType (argptr) == NEGINT_TAG)       {       if (GetArgType (argptr) == POSINT_TAG) a[i]= GetIntArg (argptr);       else  a[i] = -(GetIntArg (argptr));       }     else       {       ST_helpMsg("Wrong arg type!");             while (GetArgType(top_estack)!=END_TAG)                  top_estack=next_expression_index(top_estack);             top_estack--;       return;       }          }   //efface les arguments en trop   while (GetArgType(top_estack)!=END_TAG)        top_estack=next_expression_index(top_estack);   top_estack--;        //initialise selon le mode angulaire;      if (a[2]==0) tang=180;      else if (a[2]>0) tang=200;      else tang=pi;       //calcule r et g   if ((a[0]==0) || (a[1]==0)) // x=0 ou y=0        {             if ((a[0]==0) && (a[1]==0)) //x et y sont nuls                  {                       r=0;                       g=0;                  }             else if ((a[0]==0) && (a[1]!=0))   // x=0                  {if (a[1]>0) g=0;    //y>0                  else g=tang;}        // y<0             else if ((a[1]==0) && (a[0]!=0))   // y=0                  {if (a[0]>0) g=tang/2; //x>0                  else g=3*tang/2;}      // x<0        }   else// x et y sont différents de 0        {        if (abs(a[0])<=abs(a[1]))             {                  g=atan(a[0]/a[1])*tang/pi;                  if (a[1]>0) g=(g<0)*2*tang+g;                  else g=tang+g;             }        else             {                            g=atan(a[1]/a[0])*tang/pi;;                  if (a[0]>0) g=pi/2-g;                  else g=3*pi/2-g;             }             }     a[0]=sqrt(a[0]*a[0]+a[1]*a[1]);    a[1]=g;  //retourne la liste de r et g   push_quantum(END_TAG);       push_Float (a[1]);       push_Float (a[0]);      push_quantum(LIST_TAG);      }
Petit à petit on deviens moins petit

4

Bon voila j'ai un nouveau problème, quand j'execute la fonction imp2rec codee en Ti basic (source jointe)

Source imp2lev imp2rec(matxy)    Func    local i,x,y    for i,1,dim(matxy)    matxy[2,i]->x    matxy[3,i]->y    rec2pol(x,y,-1)->matxy[2,i]    rec2pol(x,y,-1)->matxy[3,i]    endfor    return matxy  endfunc 

J'ai le message d'erreur "Data type" l'or de l'execution de "rec2pol(x,y,-1)[1]->matxy[2,i]".
dans Calc Home :

* re2pol(1,2,3) retourne bien une liste de 2 éléments {2.236 29.517}
* "{2.236 29.517} ['1'] retourne bien 2.236
* Mais re2pol(1,2,3)['1'] retourne le message d'erreur "invalide program reférence"

-Est il possible de modifier rec2pol afin de rendre la commande re2pol(1,2,3)['1'] valide (elle devrai me retourner 2.236 ) et re2pol(1,2,3)['2'] valide (elle devrai me retourner 29.517), si oui comment ?
-Si non ben je vais devoir faire imp2rec en C

mais pour cela j'ai toujour les problèmes :
--comment connnaitre le nombre d'élements dans la pile est ce qu'un botom_estack - top_estack suffit.
--comment manipuler les élements de la pile (par exemple renverser la pile, prendre le dernier, le premier élement, effacer l'élément n, déplacer les éléments etc...).
--Où trouver de la doc sur le fonctionnement de la pile et ses manipulations.

Mon but est de décomposer la matrice dans la pile, calculer la taille de mon tableau, effacer la pile, déclarer mon tableau, faire mes oppérations, mêtre les éléments du tableau dans la pile reconstituer la matrice. Dans ce cas une matrice de 1000 réel et 500 entier peut-elle être traitée?


Les ' 'sont juste là pour que l'on puisse voir les crochets et leur contenu

Source de rec2pol // transformation coordonnées rectangulaire en poliare // Try this program donner les coordonnées(x,y) #define USE_TI89 #define USE_TI92PLUS #define USE_V200 #define MIN_AMS 101 #include <tigcclib.h> void _main(void) {   float pi,r,g,tang,a[3];   int i;   ESI argptr;   InitArgPtr (argptr);   pi=3.1415926535897932;   //Contrôle que les 2 arguments soient des entiers ou des rééls       for(i=0 ; i<3 ; i++)       {     if (GetArgType (argptr) == FLOAT_TAG) a[i] = GetFloatArg (argptr);     else if (GetArgType (argptr) == POSINT_TAG || GetArgType (argptr) == NEGINT_TAG)       {       if (GetArgType (argptr) == POSINT_TAG) a[i]= GetIntArg (argptr);       else  a[i] = -(GetIntArg (argptr));       }     else       {       ST_helpMsg("Wrong arg type!");             while (GetArgType(top_estack)!=END_TAG)                  top_estack=next_expression_index(top_estack);             top_estack--;       return;       }          }   //efface les arguments en trop   while (GetArgType(top_estack)!=END_TAG)        top_estack=next_expression_index(top_estack);   top_estack--;        //initialise selon le mode angulaire;      if (a[2]==0) tang=180;      else if (a[2]>0) tang=200;      else tang=pi;       //calcule r et g   if ((a[0]==0) || (a[1]==0)) // x=0 ou y=0        {             if ((a[0]==0) && (a[1]==0)) //x et y sont nuls                  {                       r=0;                       g=0;                  }             else if ((a[0]==0) && (a[1]!=0))   // x=0                  {if (a[1]>0) g=0;    //y>0                  else g=tang;}        // y<0             else if ((a[1]==0) && (a[0]!=0))   // y=0                  {if (a[0]>0) g=tang/2; //x>0                  else g=3*tang/2;}      // x<0        }   else// x et y sont différents de 0        {        if (abs(a[0])<=abs(a[1]))             {                  g=atan(a[0]/a[1])*tang/pi;                  if (a[1]>0) g=(g<0)*2*tang+g;                  else g=tang+g;             }        else             {                            g=atan(a[1]/a[0])*tang/pi;;                  if (a[0]>0) g=pi/2-g;                  else g=3*pi/2-g;             }             }     a[0]=sqrt(a[0]*a[0]+a[1]*a[1]);    a[1]=g;  //retourne la liste de r et g   push_quantum(END_TAG);       push_Float (a[1]);       push_Float (a[0]);      push_quantum(LIST_TAG);      }
Petit à petit on deviens moins petit

5

Bon je viens de lire une partie de Ti-89/Ti-92 Pllus Developer Guide, je comprends mieux le fonctionnement de l'estack, et j'ai eu éléments de réponse.
Mais comment faire pour que mon programme rec2pol se comporte comme une fonction. C'est à dire re2pol(1,2,3) me retourne {2.236 29.517} dans l'ecran Home, mais si je fais re2pol(1,2,3) +{1,2}, ou re2pol(1,2,3) ->a j'ai le message "invalide program reférence" ce que je demmande est peut être impossible...
c'est peut être juste une comfiguration de compilation (j'utilise Tigcc 0.94)... Je ne sais pas....

Petit à petit on deviens moins petit

6

C'est écrit dans la documentation: http://tigcc.ticalc.org/doc/htretval.html#retval.

Et TIGCC 0.94 appartient à l'ère des dinosaures! Mets à jour à la 0.96 Beta 8 s'il te plaît. (Oublie la 0.95 qui est également totalement dépassée.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

Ok merci pour les conseil je telecharge de suite la version0.96 Beta 8
si j'ai bien compris je doit compiller avec Doors et installer DoorsOs sur la machine, ou biens créer une variable global, je vais tester avec Doors
Petit à petit on deviens moins petit

8

Ouch, DoorsOS aussi appartient à l'ère des dinosaures grin
Tu n'es pas obligé de compiler pour DoorsOS ou compatible (PreOS, de nos jours). Depuis plusieurs années, la majorité des programmes n'a pas besoin de PreOS.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

9

Kevin : Ca montre une fois de plus que ton site est mal foutu. Met en valeur la dernière version et envoie-là sur ticalc...
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.

10

j'utilise quoi alor pour compiler?
Petit à petit on deviens moins petit

11

GTC grin
Non : TIGCC 0.96 Beta 8. Tu le trouveras ici dans le paragraphe "Unofficial Downloads". Je sais, c'est pas du tout évident à deviner. Kevin doit être devin et prend son cas pour une généralité wink
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.

12

ok merci pour le liens Thibault, et avec TIGCC 0.96 Beta 8 sans modifier rec2pol je peut faire les re2pol(1,2,3) +{1,2}, ou re2pol(1,2,3) ->a sans avoir le message "invalide program reférence".
Petit à petit on deviens moins petit

13

Bon avec TIGCC 0.96 Beta 8, je compile mon programme et toujour le même problème "invalide program reférence" , avec ou sans DoorOs, quand je fais re2pol(1,2,3) +{1,2}, ou re2pol(1,2,3) ->a cela viens peut être de ma source? // transformation coordonnées rectangulaire en poliare // Try this program donner les coordonnées(x,y) #define USE_TI89 #define USE_TI92PLUS #define USE_V200 #define MIN_AMS 101 #include <tigcclib.h> void _main(void) {   float pi,r,g,tang,a[3];   int i;   ESI argptr;   InitArgPtr (argptr);   pi=3.1415926535897932;   //Contrôle que les 2 arguments soient des entiers ou des rééls       for(i=0 ; i<3 ; i++)       {     if (GetArgType (argptr) == FLOAT_TAG) a[i] = GetFloatArg (argptr);     else if (GetArgType (argptr) == POSINT_TAG || GetArgType (argptr) == NEGINT_TAG)       {       if (GetArgType (argptr) == POSINT_TAG) a[i]= GetIntArg (argptr);       else  a[i] = -(GetIntArg (argptr));       }     else       {       ST_helpMsg("Wrong arg type!");             while (GetArgType(top_estack)!=END_TAG)                  top_estack=next_expression_index(top_estack);             top_estack--;       return;       }          }   //efface les arguments en trop   while (GetArgType(top_estack)!=END_TAG)        top_estack=next_expression_index(top_estack);   top_estack--;        //initialise selon le mode angulaire;      if (a[2]==0) tang=180;      else if (a[2]>0) tang=200;      else tang=pi;       //calcule r et g   if ((a[0]==0) || (a[1]==0)) // x=0 ou y=0        {             if ((a[0]==0) && (a[1]==0)) //x et y sont nuls                  {                       r=0;                       g=0;                  }             else if ((a[0]==0) && (a[1]!=0))   // x=0                  {if (a[1]>0) g=0;    //y>0                  else g=tang;}        // y<0             else if ((a[1]==0) && (a[0]!=0))   // y=0                  {if (a[0]>0) g=tang/2; //x>0                  else g=3*tang/2;}      // x<0        }   else// x et y sont différents de 0        {        if (abs(a[0])<=abs(a[1]))             {                  g=atan(a[0]/a[1])*tang/pi;                  if (a[1]>0) g=(g<0)*2*tang+g;                  else g=tang+g;             }        else             {                            g=atan(a[1]/a[0])*tang/pi;;                  if (a[0]>0) g=pi/2-g;                  else g=3*pi/2-g;             }             }     a[0]=sqrt(a[0]*a[0]+a[1]*a[1]);    a[1]=g;  //retourne la liste de r et g   push_quantum(END_TAG);       push_Float (a[1]);       push_Float (a[0]);      push_quantum(LIST_TAG);      }
Petit à petit on deviens moins petit

14

15

merci pour le liens je vais essayer avec preos mais est il possible de le faire sans kermel?
Petit à petit on deviens moins petit

16

Thibaut (./9) :
Kevin : Ca montre une fois de plus que ton site est mal foutu. Met en valeur la dernière version et envoie-là sur ticalc...

Elle est où sur ticalc.org ou tigcc.ticalc.org, l'antique version 0.94? Je ne peux rien faire si certains sites redistribuent des versions antiques (enfin si, je pourrais leur envoyer des mails menaçants s'ils ne distribuent pas les sources complètes y compris celles de GCC et GNU as, mais j'ai autre chose à faire aussi avec mon temps).
stugeol (./7) :
si j'ai bien compris je doit compiller avec Doors et installer DoorsOs sur la machine, ou biens créer une variable global, je vais tester avec Doors

Ce n'est pas du tout ça, tu as quoi comme moyenne en anglais? Ou as-tu choisi chinois et russe comme tes 2 langues étrangères?
This does not mean that your program must be compiled in "Doors" mode: it may be a "nostub" program, but DoorsOS, Universal OS, PreOs, KerNO or IPR must be present on the calculator (to intercept stupid behavior of AMS 2.xx).

Je traduis et je mets en relief certains mots:
Ceci ne
veut pas dire que ton programme doit être compilé en mode "Doors" ("kernel"): il peut être un programme "nostub", mais il faut installer DoorsOS, Universal OS, PreOS, KerNO ou IPR sur la calculatrice.


Et comme TSR sur la calculatrice, je te conseille IPR ou PreOs, pas DoorsOS qui est totalement obsolète. IPR intercepte seulement cette erreur (et l'erreur "ASAP or Exec string too long"), il ne fait pas tourner les programmes "kernel". PreOs est un "kernel" complet (ce qui implique qu'il prend nettement plus de place, évidemment, à toi de choisir ce dont tu as réellement besoin).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

stugeol (./15) :
merci pour le liens je vais essayer avec preos mais est il possible de le faire sans kermel?

Oui, avec IPR que tu trouveras sur http://membres.lycos.fr/sirryl/.

Mais il faut obligatoirement un petit programme pour intercepter l'erreur produite par AMS, on ne peut pas la contourner sans installer quelque chose, IPR est à peu près le plus petit possible.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

Kevin Kofler (./16) :
Elle est où sur ticalc.org ou tigcc.ticalc.org, l'antique version 0.94? Je ne peux rien faire (...)
Tu peux au moins mettre à jour ton site à toi wink
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.

19

Je viens de trouver un patch qui me permet de resoudre mon problème merci a tous de votre aide, pour le moment je n'ais pas trop le temps de me pencher serieusement sur le problème, mais d'ici quelque mois j'etudirais tous ca de plus près mur
IPR - Patch pour les programmes nostub

voici l'adresse pour les personnes intéréssées:
love http://membres.lycos.fr/sirryl/download/index.php?url=download.php
Petit à petit on deviens moins petit

20

Bon le temps de tapper le message, vous en aviez deja tapper plein.
Merci pour la traduction Kevin pour mes lacunes en Anglais, j'ai du boulo de ce côté (J'ai fais latin et allemand) des langues qui me sont trés peut utiles je l'avoue....
top Mais encore merci à vous le patch me suffit amplement.
Petit à petit on deviens moins petit

21

Encore une petite question je veu vider l'estack mais la sequence suivante plante :
while (GetArgType(top_estack)!=END_OF_SEGMENT_TAG)
  	delete_between(next_expression_index(top_estack),top_estack);
  top_estack--;
»
Celle ci ne plante pas mais efface t elle tous les elements de l'estack?

while (GetArgType(top_estack)!=END_TAG)
  	delete_between(next_expression_index(top_estack),top_estack);
  top_estack--;
»
Petit à petit on deviens moins petit

22

Tu n'as pas le droit de tout effacer, seulement ce qui n'était pas déjà là au départ.
Et ce n'est pas la peine d'utiliser delete_between ici, top_estack=next_expression_index(top_estack); suffit.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité