**Le SDK pour fx-9860/Graph85** Topic officiel
Posté le 18/07/2007 15:08
Vu la multitude de topics sur le SDK de la 85, j'ai décidé d'en faire un seul et unique, où l'on posera nos problèmes et explications sur ce même topic, et non pas sur 50, par souci de clareté et de facilité.
Des nouveautés ? Des problèmes ? Des idées ?
Exposez les ici !
Voici une liste de commandes commencées par Muelsaco. N'hésitez pas à rajouter vos commandes dans le topic je les rajouterai pour en faire profiter tout le monde. Merci.
// Locate X,Y,"Texte"
:arrow: locate(x,y); Print("Texte");
// Text X,Y,"Texte"
:arrow: PrintMini(x,y,"Texte",0);
// F-Line x1,y1,x2,y2
:arrow: Bdisp_DrawLineVRAM(x1,y1,x2,y2);
// Tracer une ligne blanche
:arrow: Bdisp_ClearLineVRAM(x1,y1,x2,y2);
// PxlOn x,y & PxlOff x,y
:arrow: Bdisp_SetPoint_VRAM(x,y,<couleur>)
<couleur> : 0 pour le blanc, 1 pour le noir
// Cls
:arrow: Bdisp_AllClr_DDVRAM();
// Actualiser l'écran
:arrow: Bdisp_PutDisp_DD();
Fonction très importante. Elle permet d'afficher une image tracée virtuellement dans la VRAM. Toute image doit d'abord être dessinée dans la VRAM puis affichée à l'écran. Vous ne verrez donc pas votre image s'afficher tant que vous n'aurez pas appelé Bdisp_PutDisp_DD(). À noter que les fonctions GetKey() et Print() l'appellent automatiquement.
While <exp1>
<code>
WhileEnd
:arrow:
while(<exp1>)
{
<code>
}
// StoPict x
:arrow: SaveDisp(x);
x variant de 1 à 3 uniquement.
// RclPict x
:arrow: RestoreDisp(x);
x variant de 1 à 3 uniquement.
// Ouvrir un popup (comme les erreurs syntaxe, etc)
:arrow: PopUpWin(<taille>);
<taille> : de 1 à 8.
Rappels sur les variables globales : Source
* Les variables globales sont à utiliser avec précaution, puisqu'elles créent des liens invisibles entre les fonctions. La modularité d'un programme peut en souffrir et le programmeur risque de perdre la vue d'ensemble.
* Il faut faire attention à ne pas cacher involontairement des variables globales par des variables locales du même nom.
* Le codex de la programmation défensive nous conseille d'écrire nos programmes aussi 'localement' que possible.
L'utilisation de variables globales est jusitifiée, si
* Plusieurs fonctions qui ne s'appellent pas ont besoin des mêmes variables, ou
* Plusieurs fonctions d'un programme ont besoin du même ensemble de variables. Ce serait alors trop encombrant de passer toutes les variables comme paramètres d'une fonction à l'autre.
Citer : Posté le 26/04/2014 21:50 | #
Ok, merci
Citer : Posté le 27/04/2014 10:46 | #
on peut passer le pointeur en argument:
int a;
test(&a);
free(a);
}
void test(int* a){
a=malloc(sizeof(int));
}
Citer : Posté le 27/04/2014 11:41 | #
Ben oui, mais là non. Parce que quand tu déclares une variable de type int, la calculatrice réserve un espcace mémoire pour, donc là tu n'as pas besoin d'allouer dyamiquement.
Tu risques de générer une System Error. Au mieux, la mémoire allouée pour a ne sera pas libérée puisque l'adresse aura changée, et comme tu as déclaré un int, la calculatrice va essyaer de libére cette mémoire, que tu aura déjà libéré avec ton free(), donc un arrêt de l'émulateur. Voilà ce qui est correct.
void f(int *);
int main()
{
int *a;
f(a);
free(a);
}
void f(int *ptr)
{
ptr = malloc(10*sizeof(int));
}
Citer : Posté le 27/04/2014 12:01 | # | Fichier joint
je ne comprends pas pourquoi le sdk me cherche un ssp.h ?
Je suis de l'autre coté de la manche maintenant. Yay.
Citer : Posté le 27/04/2014 12:16 | #
C'est un header inclus dans stdio.h qui manque.
Mais printf ? scanf ?
On est dans le SDK pour la calculatrice, plus dans Code::Blocks. Ces fonctions n'existent pas.
Citer : Posté le 27/04/2014 12:28 | #
mais si je rajoute les headers, je devrais récupérer les fonctions non ?
Je suis de l'autre coté de la manche maintenant. Yay.
Citer : Posté le 27/04/2014 12:30 | #
Ces fonctions n'existent pas.
Va voir du côté de libg85, je crois que Muelsaco nous avait fagoté un scanf.
À l'occasion, j'en ferai un aussi, complet et aussi puissant que le "?".
Citer : Posté le 27/04/2014 12:31 | #
oki
Je suis de l'autre coté de la manche maintenant. Yay.
Citer : Posté le 28/04/2014 14:37 | #
encore un problème, quand j'alloue un tableau avec ça,
int main()
{
int *a;
a[3]=1;
afficher(a[3]);
free(a);
}
void f(int *ptr)
{
ptr = malloc(10*sizeof(int));
}[/code]
et que je me sers du tableau (ligne en rouge) dans la fonction parent et principal, la calto me met une belle erreur système :huh:
Citer : Posté le 28/04/2014 14:42 | #
Forcément, tu n'as pas alloué de mémoire pour a !
Citer : Posté le 28/04/2014 14:44 | #
a, je l'alloue grâce à la deuxième fonction
Citer : Posté le 28/04/2014 14:45 | #
Et tu l'appelles où, cette superbe fonction ?
Citer : Posté le 28/04/2014 14:47 | #
:aie2: :aie2: :boulet:
j'ai fait un erreur
voici la bonne fonction
{
int *a;
f(a);
[red]a[3]=1;
afficher(a[3]);[/red]
free(a);
}
void f(int *ptr)
{
ptr = malloc(10*sizeof(int));
Citer : Posté le 28/04/2014 14:49 | #
Pour améliorer cette fonction, tu peux justement prendre un pointeur en void * et utiliser calloc() à partir d'un deuxième argument obtenu avec sizeof(), pour pouvoir allouer pour n'importe quel type.
Citer : Posté le 28/04/2014 14:54 | #
Ne faudrait t-il pas passer un pointeur sur ton pointeur à ta fonction qui alloue la mémoire ?
Citer : Posté le 28/04/2014 14:57 | #
Non.
Un pointeur est une adresse, on s'en fout qu'il copie l'adresse. Le tout c'est qu'elle arrive indentique à la fonction, et même si on copie le pointeur, la copie, qui contient la même adresse, pointe toujours sur la même zone mémoire.
Citer : Posté le 28/04/2014 15:03 | #
Oui, mais la valeur de a et donc la zone vers laquelle il pointe n'est pas modifiée étant donné que c'est une copie de a qui va changer de valeur pour prendre celle d'une adresse vers la zone allouée... Autant avec un free ça irait, mais là il me semble que il manque quelque chose...
Enfin je me trompe peut être, tu as peut être raison aussi ;).
Citer : Posté le 28/04/2014 15:10 | #
Oui, bien sûr !
Je me suis complètement trompé, je n'ai pas remarqué que la fonction ne renvoyait pas le pointeur alloué, ce qu'elle devrait faire. En fait, ceci est correct.
{
return malloc(10*sizeof(int));
}
void g(int **p)
{
*p = malloc(10*sizeof(int));
}
int main()
{
int *a;
a = f();
free(a);
g(&a);
free(a);
}
Merci de l'avoir signalé. ^^'
aliegeois Invité
Citer : Posté le 28/04/2014 19:17 | #
Bonjour,
Je débute avec le SDK et j'aurai une question : est-ce qu'il existe une fonction qui permet de quitter l'add-in, du genre quit(), ou est-ce qu'il faut juste retourner au menu principl et si oui, comment ?
Merci de vos réponses
Regardez mon lecteur de vidéo !
Citer : Posté le 28/04/2014 19:21 | #
Après vérification, la fonction exit() de stdlib n'existe pas sur la calculatrice.
Néanmoins, la plupart des add-ins, tels les applications par défaut, ne se terminent jamais, du moins pas tant que l'utilisateur ne revient au menu pour lancer autre chose.
Sinon, tu est obligé de remonter ta pile de fonctions et de faire un return dans le AddIn_Main.
aliegeois Invité
Citer : Posté le 28/04/2014 19:26 | #
D'accord, est-ce que c'est possible de faire un menu avec comme options : "Jouer, Options, Quitter" et lorsque l'on sélectionne quitter l'application retourne au menu ? Et qu'appelles-tu faire un return dans le main ? juste écrire "return 0;" ?
Regardez mon lecteur de vidéo !