**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 20/03/2014 13:37 | #
Merci pour vos réponses. et les astuces.
J'aurais aimé avoir un tout petit bout de code où on tape 2 nombres décimaux après une invite sur l'écran de la graph et qui affiche la somme.
style:
a?
12.7
b?
5
la somme est 17.7
Mon problème c'est que je ne connais pas encore la philosophie du C et je ne sais pas si il faut utiliser sscanf qui n'est pas évident à comprendre par rapport à scanf ; ou si je devrais passer par un GET et utiliser les commandes stro... ?
Citer : Posté le 22/03/2014 14:34 | #
La doc officielle du SDK (second fichier ici) contient une liste des fonctions standards non supportées. scanf en fait partie (ainsi que toutes les fonctions relatives aux flux d'entrée-sortie).
On est donc obligé d'écrire soi-même une fonction d'input, mais c'est pas bien compliqué, en voici un exemple utilisable tel quel : http://pastebin.com/MCrSEzJ8
(il faudra la modifier si tu veux pouvoir entrer des caractères spéciaux comme '+' ou '-')
Ensuite, il ne te reste plus qu'à analyser la chaîne de caractères entrée pour y lire ton nombre. Tu peux utiliser sscanf (qui elle est implémentée dans le SDK), mais c'est pas non plus compliqué d'écrire sa propre fonction pour ça, et ce sera beaucoup plus léger.
Citer : Posté le 22/03/2014 14:37 | #
[hs] Tu pense pouvoir adapter ton Gravity duck en SH4 [\hs]
il n'y a pas juste une fonction d'input genre ? en Basic ?
Je suis de l'autre coté de la manche maintenant. Yay.
Citer : Posté le 22/03/2014 14:40 | #
On est donc obligé d'écrire soi-même une fonction d'input
C'est relativement explicite gollum non ?
Citer : Posté le 22/03/2014 14:42 | #
dsl, je lis un peu en diagonale.
Je suis de l'autre coté de la manche maintenant. Yay.
Citer : Posté le 22/03/2014 14:48 | #
@gollum il existe déjà un Gravity Duck SH4.
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 22/03/2014 17:17 | #
J'ai un problème:
J'utilise un tableau 2D en variable locale, je veux le réutiliser dans une autre fonction, pour cela j'utilise les pointeurs mais j'ai un "System error" chaque fois que je veux accéder à une case:
unsigned int plate[4][4]={{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}} ; //mon tableau 2D
int dep[4]={0,0,0,0}; //un autre tableau
getDep(&plate, &dep);
}
int getDep(unsigned int* pplate[4][4], int* possDep[4]){ //fonction qui utilise plate et dep
PrintV(1,1,* pplate[3][3],1); //là j'ai un System error
}
Citer : Posté le 22/03/2014 17:19 | #
Si tu veux passer le tableau de deux dimensions, tu peux faire
mais je crains que tu aies, là aussi, une System Error.
Par contre, tu devrais essayer
parce que sinon, tu passes des tableaux de pointeurs.
Citer : Posté le 22/03/2014 17:22 | #
essaie avec ça
unsigned int plate[4][4]={0} ; //mon tableau 2D
int dep[4]={0}; //un autre tableau
getDep(plate, dep);
return;
}
int getDep(unsigned int* pplate, int* possDep){ //fonction qui utilise plate et dep
PrintV(1,1, pplate[3+3*4],1); //là j'ai un System error
return;
}
Citer : Posté le 22/03/2014 17:22 | #
Effectivement, la deuxième solution de Lephenix marche, merci
unsigned int plate[4][4]={0} ; //mon tableau 2D
int dep[4]={0}; //un autre tableau
getDep(&plate, &dep);
}
int getDep(unsigned int pplate[4][4], int possDep[4]){ //fonction qui utilise plate et dep
PrintV(1,1, pplate[3][3],1);
}
Citer : Posté le 22/03/2014 17:24 | #
Intelligide, justement je pense que ça ne marche pas
C'est pour ça qu'en général, je préfère privilégier les tableaux à une dimension.
Citer : Posté le 23/03/2014 00:21 | #
Au pire, vous pouvez toujours utiliser l'astuce du
int tableau[12] = {0};
tableau[i + j*nbColonnes] = 1;
Après, je sais plus si c'est j*nbColonnes ou i*nbLignes
Citer : Posté le 23/03/2014 00:42 | #
Je pense que ça marcherait aussi en allouant dynamiquement le tableau (avec un malloc() )
Coïncidence ? Je ne pense pas.
Citer : Posté le 23/03/2014 01:34 | #
Je vous conseille d'allouer dynamiquement vos tableaux à deux dimensions, un tableau à deux dimensions est un tableau de pointeur :
int** tab = (int**) malloc ( sizeof (int*) * hauteur);
for ( int i=0; i <hauteur ; i++)
tab [i] = (int*) malloc (sizeof (int) * largeur);
(j'ai fait ça de tête, il y a peut être des erreurs)
et pour libérer un tableau à deux dimensions :
free (tab [i] );
free (tab);
maintenant pour envoyer un tableau à deux dimensions à une fonction :
int main (int argc, char** argv){
...
fonction (tab);
...
}
void fonction ( int** tab ) {
...
}
Voilà, normalement il n'y aurait plus de problème avec ça.
Citer : Posté le 23/03/2014 07:33 | #
@Dark Storm
Ça n'a pas d'importance. À partir du moment où tu considère que ton tableau de x*y contient les lignes unes à unes, alors tu mettras x + y*largeur, mais tu peux aussi faire l'inverse, tant que tu gardes tout le temps la même notation.
@Smashmaster
C'est pas souvent qu'on voit un malloc casté en **
C'est vrai que là du coup, c'est alloué totalement dynamiquement.
Par contre, je crois que le même problème à l'exécution se pose. Pour ma part, je ne passe jamais de pointeur **, car je me souviens avoir eu des problèmes de lecture (System Errors...).
Citer : Posté le 23/03/2014 12:38 | #
@Lephenixnoir : Perso je caste toujours mes mallocs, car la fonction malloc() retourne un (void*), ça permet d'éviter des "warning" voir même des erreurs de compilations avec certains compilateurs.
Citer : Posté le 23/03/2014 12:46 | #
Oui, mais souvent on caste un malloc en (type *) puisque l'on alloue un tableau
Ce que je voulais dire, c'est que je ne vois jamais de cast en (type **), c.a.d d'allocation dynamique de tableau de pointeurs.
Citer : Posté le 23/03/2014 16:18 | #
Je ne posait une question : lorsqu'on lit un fichier, est ce que son contenu est copié dans la RAM ?
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 23/03/2014 16:22 | #
Je ne pense pas, d'autant plus que Bfile_OpenFile ne renvoie qu'un entier.
De toute manière, je ne pense pas que le système puisse se permettre de dupliquer des gros fichiers comme ça.
Citer : Posté le 06/04/2014 16:43 | #
Je sais pas si quelqu'un pourra me répondre ici (le niveau commence à être élevé ), mais bon, autant essayer :
J'ai une fonction basique qui permet de modifier un point 3D :
{
point->x = x;
point->y = y;
point->z = z;
point->color = color;
}
J'en ai une autre qui place les points d'un cube :
{
// sommets
FF_place_point_3D(points[0], 15, 15, 20, ML_BLACK);
FF_place_point_3D(points[1], 15, -15, 20, ML_BLACK);
FF_place_point_3D(points[2], -15, 15, 20, ML_BLACK);
FF_place_point_3D(points[3], -15, -15, 20, ML_BLACK);
FF_place_point_3D(points[4], 15, 15, 50, ML_BLACK);
FF_place_point_3D(points[5], 15, -15, 50, ML_BLACK);
FF_place_point_3D(points[6], -15, 15, 50, ML_BLACK);
FF_place_point_3D(points[7], -15, -15, 50, ML_BLACK);
...
}
Et qui s'utilise comme ceci :
Face_3D faces_cube[12];
Line_3D arretes_cube[18];
Point_3D sommets_cube[8];
initCube(&cube, faces_cube, arretes_cube, sommets_cube);
Or, bien que ça compile, j'ai un syster dès l'instruction point->x = x;
Comment passer en paramètre, pour pouvoir y accéder, un tableau de pointeurs de structures ?
Citer : Posté le 06/04/2014 17:18 | #
Tu veux passer un pointeur, soit un tableau de pointeurs sur des structures ?
Ce sera un paramètre de type Structure **, et pour l'envoyer, tu peux mettre
fonction(tab);
Ajouté le 06/04/2014 à 17:20 :
Ton erreur est que tu envoies face_cube, qui est de type Face_3D *, et tu le reçois en Face_3D *[] = Face_3D **.