**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 19/06/2014 18:55 | #
Je dois essayer ou c'est un constat ?
Citer : Posté le 19/06/2014 18:56 | #
Ni l'un ni l'autre, c'est une réalité.
Citer : Posté le 19/06/2014 19:02 | #
int main()
{
int tab[10][10];
fonction(tab);
}
void fonction(int **tab)
{
int x = tab[0][0];
}
Ce code ne fonctionne pas.
Ou alors, c'est que ce que j'ai dis sur la propension à générer des System ERROR est encore plus vrai.
Disons que ce style de codes ne fonctionne pas.
Et maintenant tu *vois* pourquoi je ne jure que par des tableaux 1D?
En fait, si je ne plante pas, c'est parce qu'un tableau 2d initialisé comme ça [][] n'est pas un tableau de pointeurs mais un seul bloc uni. C'est pas vraiment la même chose dans le sens où quand tu initialises dynamiquement un tableau 2d tab[a], le tab[a] est juste un pointeur vers des pointeurs, pas ici. J'ai un peu de mal à expliquer, je pense que leffe sera peut-être plus doué à expliquer mais c'est une erreur que j'ai eu très tôt dans mon parcours et Pierrot m'a fortement suggéré de switcher en 1D.
Par contre,
void fonction(int tab[][10]) devrait marcher si je ne m'abuse car le compilo sait comment traiter les tableaux de tableaux de 10.
Citer : Posté le 19/06/2014 19:10 | #
Là, ça devrait fonctionner en effet.
Explication un peu plus détaillée :
Un tableau 1D, c'est un pointeur (int *tab). Donc ce pointeur pointe sur le contenu du tableau.
Lorsqu'on déclare un tableau 2D, on a donc un pointeur au second niveau (int **tab), i.e. un pointeur sur... des pointeurs. En fait, un tableau 2D au sens propre du terme, c'est un tableau de pointeurs (ben oui, comme un tableau c'est un pointeur, un tableau de tableaux c'est un tableau de pointeurs).
Ainsi si on fait tab2d[1], on ne tombe par sur une valeur mais sur un pointeur. Ce pointeur, c'est celui qui représente le deuxième sous-tableau.
Sauf que lorsqu'on déclare un tableau 2D, ça ne se passe pas comme ça. Le compilateur alloue un bloc uni qui contient toutes les données. Si vous déclarez un tableau 2D de 3 par 4, vous aurez un bloc de 12 octets. Quant aux pointeurs sur lesquels on pensait tomber, ils n'existent même pas. Le seul qui existe, c'est le tableau 2D lui-même (int **tab).
Le compilateur lui, va donc traiter un tableau 2D "bloc" comme un tableau 1D, en utilisant le pointeur de second niveau comme un pointeur simple, d'où la source de l'erreur (en gros).
Ceci n'empêche, si dans un bloc vous déclarez un tableau 2D quelle qu'en soit la manière, vous devez utiliser deux paires de crochets à chaque fois. N'allez pas en utiliser une seule en disant "le compilo fait comme ça", ça ne fonctionner pas.
Citer : Posté le 20/06/2014 10:16 | #
Le problème c'est que je ne comprends pas vraiment comment faire des maps avec un tableau 1D.
Je pensais avoir compris comment les codeurs s'y prenait pour faire les maps, mais apparemment non :/
Pour moi, il faut toujours, en quelques sortes, une abscisse et une ordonné ...
Citer : Posté le 20/06/2014 10:21 | #
Prenons un tableau 2D. Plutôt que d'utiliser
0;1 1;1 2;1 3;1
0;2 1;2 2;2 3;2
Tu mets tout dans un tableau à une dimension :
que tu choisis de voir comme ceci :
04 05 06 07
08 09 10 11
auquel cas map[x][y] devient map[largeur*y+x], soit tu le vois comme cela :
01 05 09
02 06 10
03 07 11
auquel cas map[x][y] devient map[hauteur*x+y], c'est selon ton choix.
La seul différence, c'est la manière d'utiliser le tableau.
Citer : Posté le 20/06/2014 14:07 | #
Au fait, puisqu'on parle de ça, j'ai un petit accès de curiosité à satisfaire...
Comment faire pour créer des maps à cases hexagonales ?
Citer : Posté le 20/06/2014 14:09 | #
Tu les alignes. En gros, une ligne monte et descend successivement.
Citer : Posté le 20/06/2014 16:12 | #
Ou tu décales une ligne sur deux. T'as une bonne explication ici.
Citer : Posté le 22/06/2014 20:20 | #
Alors, j'ai un tableau de short à copié dans un autre tableau de short vide, comment je fait ?
c'est des tableau 2D comme
{10,5,15,5,15,10},
{29,35,35,41,41,47},
{6,0}};
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 22/06/2014 20:25 | #
for(i=0;i<3:i++) for(j=0;j<6;j++) PatternAff[i][j] = Pattern1[i][j];
Par contre ça ne remplira qu'un tiers du tableau.
Citer : Posté le 22/06/2014 20:27 | #
Donc en fait on peut pas faire
En gros on copie une à une les valeurs ça me va, merci Lephénixnoir
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 22/06/2014 20:43 | #
Non, car (sans rentrer dans les détails), si tu fais PatternAff=Pattern1, tu vas perdre la mémoire de PatternAff (fuite de mémoire donc), et les deux tableaux vont avoir le même contenu. Pas les même valeurs, le même contenu identique, exactement la même mémoire, comme s'ils se la partagaient. Donc si tu modifies une case d'un des tableaux, ils va aussi la modifier pour l'autre, donc on n'est plus dans le cas d'une copie.
Citer : Posté le 22/06/2014 21:07 | #
Oula d'accord, et comme j'avais un "const", ça buguait . Ok maintenant je le saurais
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 22/06/2014 21:14 | #
Il faut bien comprendre que le nom du tableau, PatternAff comme Pattern1, ce n'est pas les données. Pour la calculatrice, c'est comme une référence qui lui indique où sont stockées les données dans la mémoire. Donc si tu fais PatternAff=Pattern1, tu copies la référence, et du coup le contenu auquel on accède avec PatternAff est devenu le même que celui auquel on accède avec Pattern1.
Citer : Posté le 22/06/2014 21:52 | #
Bon ben c'est encore moi .
Je veux ça
Il y a -4 dans "PatternAff[2][1]",ça marchait pas donc j'ai tenté ça (au cas où)... Mais ça marche pas non plus .
if(XPatternA==108-Z)XPatternA=Z;
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 22/06/2014 21:56 | #
C'est correct. Ton tableau contient bien des int maintenant ?
Citer : Posté le 22/06/2014 21:57 | #
Ben non, c'est des short ... ça a l'air de buguer sur ça "XPatternA=PatternAff[2][1];"
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 22/06/2014 21:58 | #
Même des short, ça n'a aucune raison de ne pas fonctionner.
On peut avoir plus de code ?
Citer : Posté le 22/06/2014 22:00 | #
En fait je viens de modifier mais ça persiste, voila le bout de
PatternA=rand()%2;
switch(PatternA){
case 0 : for(i=0;i<3;i++)for(j=0;j<6;j++)PatternAff[i][j]=Pattern1[i][j];
break;
case 1 : for(i=0;i<3;i++)for(j=0;j<4;j++)PatternAff[i][j]=Pattern2[i][j];
break;
}
XPatternA=PatternAff[2][1];
}
if(PatternA<3){
for(Z=0;Z!=PatternAff[2][0];Z++)ML_bmp_or(Obstacles[Anim/8],PatternAff[0][Z]+XPatternA,PatternAff[1][Z],5,5); //Dessin de chaque obstacle du Pattern
XPatternA++;
if(XPatternA==108-PatternAff[2][1]){
PatternA=0;
}
}
Les tableaux sont des short et le reste des int.
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 22/06/2014 22:02 | #
Mais ce code, tu ne l'exécutes qu'une fois ? Parce que XPatternA==112, ça arrive pas souvent