Une question comme ça
Posté le 24/06/2017 17:39
Salut tout le monde,
étant donné Ue j'ai souvent une petite question à poser et que je ne veut pas embêter quelqun sur le live, je crée un topic sur lequel je poserais donc toutes ces questions. Vous pouvez également faire de même sur ce topic.
Donc voilà, 1ere question de ce topic ☺ :
Je bosses actuellement sur des rotations en 3D, et j'ai eu une idée beaucoup plus simple (enfin je pense
) que ce qui a été fait jusqu'à présent, attention : des rotations en utilisant des sinusoides. Rien de nouveau vous me direz, mais si, justement, je ne vous dévoilerai pas toute mon idée mais juste la partie qui me pose problème, voila: pour mes coordonnées de pts j'ai besoin de savoir comment on fait pour avoir les valeurs minimales et maximales de la sinusoide (en cosinus de X) dans deux variables distinctes.
Si quelqun à une idée, il ne se gêne pas
.
PS: ce nouveau systheme (enfin je pense qu'il est nouveau ) n'est q'au stade de test. Je ne sais même pas ce qui va ce passer au lencement du prog (enfin si un peu, mais pas assez pour prédire son conporte ment
)
Citer : Posté le 12/11/2017 13:19 | #
Voyons voir... il y a un « s » devant le nom de la fonction, comme string. Il y a un premier paramètre qui est a priori une chaîne de caractères... mais si tu regardes attentivement, autant le format (control) est de type const char * donc il est en lecture seule, autant le premier paramètre, est de type char *, ce qui laisse entendre que la fonction va vouloir y écrire des choses... toujours pas d'idée ?
printf() effectue le formatage et écrit le résultat sur la sortie standard (ie. dans le terminal, quand on est sur un ordinateur). sprintf() effectue le formatage et écrit le résultat dans une chaîne de caractères, qui lui est passée en premier argument. La calculatrice n'a pas de terminal, c'est pour ça que printf() n'est pas supportée par fxlib. En revanche rien ne l'empêche de posséder sprintf() qui a juste besoin d'un peu de place en mémoire pour écrire son résultat.
Pour information, l'entier renvoyé par sprintf() est le nombre de caractères générés (ie. la longueur du texte après formatage).
Citer : Posté le 12/11/2017 13:25 | #
Ok, je viens de trouver un exemple sur le net, je voyais pas ça comme ça mais maintenant c'est plus clair. OK merci, c'est donc à ça que sert la chaîne de caractères, donc après j'utilisé le print() pour afficher la chaîne. ..si c'est ça (dis le, ne me plante pas ...je plaisante... 8) ) j'essaye tout de suite.
Merci
-Planétarium 2
Citer : Posté le 12/11/2017 13:29 | #
Voilà, c'est ça. Tu ne peux pas faire l'affichage en un seul coup donc :
1. Tu génères la chaîne formatée avec sprintf()
2. Tu l'affiches avec locate() et Print().
Si tu as alloué ta chaîne correctement, ça n'a aucune raison de ne pas marcher.
Citer : Posté le 12/11/2017 14:32 | #
Merci, je teste et je te dis ok
A tout de suite
Ajouté le 12/11/2017 à 15:02 :
heum... j'ai réedité mon code et il ne me reste qu'a corriger une erreur que je ne comprend pas:
message erreur :
set SHC_INC=H:\4) Dossier CASIO fx SDK\Logiciel\OS\SH\include
set PATH=H:\4) Dossier CASIO fx SDK\Logiciel\OS\SH\bin
set SHC_LIB=H:\4) Dossier CASIO fx SDK\Logiciel\OS\SH\bin
set SHC_TMP=H:\4) Dossier CASIO fx SDK\Projets\Projet 2\Debug
"H:\4) Dossier CASIO fx SDK\Logiciel\OS\SH\bin\shc.exe"
-subcommand=C:\Users\CHASSA~1\AppData\Local\Temp\hmkEB88.tmp
H:\4) Dossier CASIO fx SDK\Projets\Projet 2\KeyIndic.c(34) :
C2500 (E) Illegal token "char" <------ ! :mmm:
HMAKE MAKE UTILITY Ver. 1.1
Copyright (C) Hitachi Micro Systems Europe Ltd. 1998
Copyright (C) Hitachi Ltd. 1998
ERROR: Process failed with return code: 1
Build was not successful.
pour le code suivant :
#include "stdio.h"
int AddIn_main(int isAppli, unsigned short OptionNum)
{
unsigned int key;
unsigned char str;
int GetKey(unsigned int *key);
Bdisp_AllClr_DDVRAM();
sprintf(char*str, "KeyValue : %u\n", key);
locate(1,3);
Print((unsigned char*) str);
return 1;
}
voila, si tu peut me guider svp
ah et au passage si tu peut me dire comment a partir de ce code sur le sdk je le met en g1a svp, car le wiki ne le dit pas (il me semble).
-Planétarium 2
Citer : Posté le 12/11/2017 15:08 | #
Normal, tu déclares une variable dans un appel de fonction :
sprintf(char* str, "KeyValue : %u\n", key);
Déclares str en char* puis passe juste str comme argument.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 12/11/2017 15:11 | #
Pense à utiliser la balise [code] ... [/code] pour mettre du code.
T'as plusieurs problèmes qui se combinent. D'abord, ta variable str n'est pas du tout du bon type. Ensuite, le premier argument que passes à sprintf(), c'est quoi ? char*str n'est pas une valeur en C. Ou bien c'est str, la variable elle-même, ou bien c'est (char *)str, le cast de str en char *. Enfin tu ne vas pas tarder à te rendre compte que tu n'as créé aucune mémoire pour stocker le texte "KeyValue : <la valeur>\n". Tu es supposé indiquer à sprintf() où placer le résultat grâce au premier argument... ça ne peut pas marcher si le premier argument ne désigne aucune zone disponible de la mémoire.
Citer : Posté le 12/11/2017 15:13 | #
Je pense d'ailleurs au vu de ton code que tu ferais bien de te documenter un peu plus sur les notions de fonctions, tableau et pointeurs (notamment pour bien comprendre ce que sont les chaînes de caractères et ce qu'on peut faire avec)…
Citer : Posté le 12/11/2017 15:17 | #
ouais mais le display de l'emulateur de l'ecran ne m'afficher rien quand je presse une touche, moi je veut qu'il m'affiche sa valeur...
Ajouté le 12/11/2017 à 17:31 :
Je me suis documenté et il faut bien commencer quelque part,
j'ai modifié le code et ça me fait une erreur sur la calto : "system ERROR"
voici le code modifié:
#include "stdio.h"
int AddIn_main(int isAppli, unsigned short OptionNum)
{
char buffer [5]; unsigned int key;
GetKey(&key);
sprintf(buffer, "KeyValue : %u\n", key);
locate(2,3);
Print((unsigned char*) buffer);
return 1;
}
excuse de toutes ces questions mais je n'ais pas grand chose pour me guider...
-Planétarium 2
Citer : Posté le 12/11/2017 17:35 | #
Encore une fois, utilise la balise [code] pour mettre ton code ! Je te laisse le faire. Par ailleurs, toute la partie avec #pragma et tout... on sait qu'elle est là, t'es pas obligé de la mettre.
Ah, c'est mieux ! Ça valait le coup de te documenter.
Ton buffer est un peu serré. Tu as besoin de 5 caractères pour écrire un numéro de touche de GetKey() dans le cas général, plus un pour le NUL à la fin (le zéro). Il t'en faut donc au moins 6 !
Par ailleurs, un vieux réflexe de développeur Casio est « une System ERROR avec sprintf(), ça pue le <stdio.h> pas inclus ». Là tu l'as inclus, mais la syntaxe que tu aurais dû utiliser est #include <stdio.h>. La notation avec les guillemets est réservée (en gros) aux en-têtes qui ne sont pas de la bibliothèque standard. Je ne sais pas si ça peut avoir eu une influence, mais sait-on jamais, mieux vaut que tu changes.
Citer : Posté le 12/11/2017 17:43 | #
Alors attend...
voila, j'ai fais les modifs mais j'obtient la mème erreur : "system ERROR"
voici le code : (je le mets dans le )
#include <stdio.h>
int AddIn_main(int isAppli, unsigned short OptionNum)
{
char buffer [7]; unsigned int key;
GetKey(&key);
sprintf(buffer, "KeyValue : %u\n", key);
locate(2,3);
Print((unsigned char*) buffer);
return 1;
}
Ajouté le 12/11/2017 à 17:46 :
bon, je n'arrive pas a mettre le ["code"] sur mes précédents messages ...
-Planétarium 2
Citer : Posté le 12/11/2017 17:58 | #
Ton buffer est toujours trop petit : il te faut au moins rentrer KeyValue : dedans, soit au moins 11 caractères, plus les caractères que va prendre l'écriture de la valeur key (cf le message de LePhenixNoir pour ça), plus le caractère final, essaie d'adapter ça pour voir.
Citer : Posté le 12/11/2017 17:58 | #
Il y a un problème assez clair, c'est que le programme se terminant juste après l'affichage, tu n'auras rien le temps de voir avant le retour au menu... mets déjà un GetKey(&key) après le Print().
Et il te faut bien plus que 7 caractères. "KeyValue : \n" tout seul en fait 12, ajoute à ça les 5 de la valeur et le NUL, ça fait 18. x)
Edit : Enlève le \n aussi, il ne sert à rien ici. (La calculatrice a un écran sur lequel on peut écrire en deux dimensions et n'a pas de notion de « retour à la ligne ».)
Citer : Posté le 12/11/2017 18:05 | #
oui mais ça ne change rien.Comment tu fait pour faire en sorte que le prog tourne en boucle (boucle while) et que quand je presse sur "menu" il me renvoie au menu ?
Tu dis si je te barbe...
-Planétarium 2
Citer : Posté le 12/11/2017 18:06 | #
Si, ça change quelque chose. Ça attendra que tu appuies sur une touche avant de retourner au menu.
Si tu veux que ça attende à l'infini jusqu'à ce que tu appuies sur MENU, il te faut ça :
Moi ça me barbe pas, tant que tu donnes l'impression de chercher un minimum, j'ai pas de raison de ne pas t'aider.
Citer : Posté le 12/11/2017 18:12 | #
Je donne l'impression de chercher (ce qui est le cas, ça fait deux jours que je me creuse la tête la dessus ) ?
Ah et c'est bon, j'ai posé la question un peut vite, j'ai trouvé tout seul en m'inspirant du code source du pseudo code que le logiciel te met quand tu crée un nouveau prog sur le sdk ! Merci quand même pour ton aide !
-Planétarium 2
Citer : Posté le 12/11/2017 18:15 | #
Ben, pas toujours en détail. ' Le coup de sprintf(), par exemple, il était évident que tu ne pouvais pas l'utiliser avec les mêmes arguments que printf()... et de manière générale, il vaut mieux que tu testes avant de répondre (plutôt que de répondre puis tester, vu que si ça marche pas tu double-post).
Enfin on a vu pire. :3
N'hésite pas si tu as d'autres soucis !
Citer : Posté le 13/11/2017 07:22 | #
Ok la prochaine fois je donne plus de détails;
et tester avant de reponde, je commence tout juste à le faire alors ne t'inquiéte pas, désormais je ne ferais que ça
Merci
Ah oui et cool ton nouvel avatar
Ajouté le 13/11/2017 à 12:00 :
Question rapide et passagere,
est ce qu'il existe déjà un prog en ad-dins qui donne la valeur de la touche pressée sur ce site ?
-Planétarium 2
Citer : Posté le 13/11/2017 17:13 | #
Probablement pas ; il n'y a pas d'équivalent add-in des programmes Basic triviaux.
Tu peux toujours poster le tien... mais je ne le conseille pas particulièrement. Lire filebios.h en dira au moins autant et certainement plus. Si tu as un add-in qui regroupe plusieurs voire beaucoup d'outils de ce genre, ça peut en valoir le coup par contre.
Citer : Posté le 13/11/2017 17:26 | #
OK de toute façon c'était juste pour voir comment ce potenciel autre programme aurais été codé et ainsi optimiser le mien.
Et puis je ne vois pas tellement d'autres outils de ce genre (si tu as des idées parle-en moi ça pourrait m'interesser ok je n'essaye pas de te piquer tes idées bien sur )
Tu entends quoi par :
programmes Basic triviaux
?
-Planétarium 2
Citer : Posté le 13/11/2017 17:38 | #
Dans le jargon scientifique, « trivial » signifie évident, du genre tellement évident qu'on ne prend même pas la peine de le prouver ou le justifer. « 2-PARTITION est dans NP : trivial. »
Ici, je parle donc des programmes Basic disponibles sur le site (relativement nombreux) qui ne font qu'une toute petite tâche pour laquelle on peut écrire un programme en peu de temps. Certains le font vraiment de façon simpliste, d'autres poussent l'idée plus loin et proposent un code plus long et plus complexe, mais qui fait essentiellement la même chose.
Il y a peu d'add-ins dans ce genre. Tous les add-ins sont des programmes relativement complexes en comparaison avec ces petits programmes Basic.
Citer : Posté le 13/11/2017 17:48 | #
Ah, je vois
et au fait, mon prog est au point et je l'ai testé, dis moi, les valeurs des touches ne sont pas les mêmes en Basic Casio qu'en C ? Par exemple, en Basic Casio, la touche F1 est égale a 79, tandis qu'en C elle est égale a 30 009...
Et pour finir, si je veut utiliser un affichage print avec les couleurs inversées (commande "PrintRevC()") cela utilise donc les caractères en "gras" (si tu vois ce que je veut dire) je pense donc qu'il faut que j'agrandisse ma chaine de caractères, mais c'est la que la question me pose problème : combien de fois plu grande ?
-Planétarium 2