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
Ton code est illisible, utilise un tag pre ou source s'il te plaît...
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
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
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
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...

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.
j'utilise quoi alor pour compiler?
Petit à petit on deviens moins petit
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
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
merci pour le liens je vais essayer avec preos mais est il possible de le faire sans kermel?
Petit à petit on deviens moins petit
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.