Posté le 09/12/2013 13:45
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 239 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 13/03/2014 22:13 | #
Oups, mea culpa
Citer : Posté le 16/03/2014 10:26 | #
Oui, c'est des opérations bit a bit. C'est tres utile pour l'optimisation, mais il faut savoir s'en servir.
Dans le meme style, il y a | & ^ , qui permettent de comparer deux nombres bit a bit.
011001 | 101101 = 111101
011001 & 101101 = 001001
011001 ^ 101101 = 110100
En fait
011001 & 101101 = 001001 // le & sert si 2 bits sont égaux, il renvoit 0 ou 1(selon la valeur des bits) et 0 si les bits sont différents
011001 ^ 101101 = 110100 // le ^ sert si 2 poids sont égaux, il renvoit 0 et 1 si les poids sont différents
Citer : Posté le 16/03/2014 10:35 | #
Exact
1 1 0
0 0 0
| 1 0
1 1 1
0 1 0
^ 1 0
1 0 1
0 1 0
Citer : Posté le 19/03/2014 19:30 | #
Pour charger le fichier monstre.csv, je me sert de cette fonction
char *buffer = NULL;
char buffer2[40]={0};
int type = 0;
int curseur = 0;
int curseur2 = 0;
int tailleFichier;
int monstre = 0;
int mode=0;
FONTCHARACTER PathName[]={'\\','\\','f','l','s','0','\\','M','O','N','S','T','R','E','S','.','c','s','v',0};
recuphandle = Bfile_OpenFile(PathName,_OPENMODE_READ);
ML_clear_vram();
PopUpWin(5);
ML_rectangle(11,20,115,30,1,ML_BLACK,ML_TRANSPARENT);
ML_display_vram();
tailleFichier = Bfile_GetFileSize(recuphandle); // on récupère la taille du fichier
buffer = (void*)malloc(tailleFichier); // on copie le fichier dans le buffer
Bfile_ReadFile(recuphandle, buffer, tailleFichier, 0);
Bfile_CloseFile(recuphandle);
while(curseur < tailleFichier)
{
curseur++;
if(buffer[curseur] == ';'||buffer[curseur]=='\n') // si on tombe sur un ; ou un retour à la ligne
{
memset(buffer2, 0, 40 * sizeof(char)); // on réinitialise le buffer2
memcpy(buffer2, &buffer[curseur2], (curseur - curseur2) * sizeof(char)); // on copie ce qu'il y a entre deux points virgules
switch(mode)
{
case 0 : // si on est sur l'ID
stockage[0+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
case 1 : // si on est sur le nom
memcpy(&(stockage[1+monstre*15]), buffer2, 40 * sizeof(char)); // on copie le nom dans le tableau
break;
case 2 : // si on est sur l'attaque
stockage[12+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
case 3 : // si on est sur la défense
stockage[13+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
case 4 : // si on est sur le niveau
stockage[14+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
}
memset(buffer2, 0, 40 * sizeof(char)); // on réinitialise le buffer2
curseur2 = curseur + 1; // et la position du dernier curseur
mode++;
if(mode > 5) mode = 0; // on change le type de donnée
}
if(buffer[curseur] == '\n') monstre++; // on change de monstre
ML_rectangle(12, 20, monstre + 11, 30, 1, ML_BLACK, ML_BLACK); // pour la barre de progression
ML_display_vram();
}
free(buffer); // on libère la mémoire
locate(1,1);
Print((char*)"succes");
ML_display_vram();
Mais ça met 5sec à charger pour 105 monstre. est ce qu'il existe une fonction qui cherche un caractère dans une chaine et renvoie sa position???
Citer : Posté le 19/03/2014 19:37 | #
Le plus simple, c'est d'avoir une taille fixe pour chaque monstre : tu dis que chaque monstre dispose de 10 caracteres pour le nom, 30 pour la description, 2 pour l'attaque, etc., et comme ca, pour avoir l'emplacement d'un monstre, tu n'as qu'as faire tableau[ID*TailleMonstre], plutot que de faire une recherche
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 19/03/2014 19:41 | #
non, mon problème c'est de charger les monstres du fichier vers le tableau. la fonction va bien mais elle est lente.
En fait, je charge le fichier dans un tableau que je trie pour mettre les infos dans un tableau ordonnée. mais quand je cherche dans le tableau où est chargé le fichier je cherche ";" caractère par caractère. Donc je cherche une fonction qui me dira où est ";" en m'inidquant sa position
Citer : Posté le 19/03/2014 19:49 | #
Justement, c'est pour éviter de devoir rechercher, tu saura directement ou se trouve tel ou tel monstre, sans recherche.
Si c'est pour charger un fichier que tu as des problèmes, il ne faut surtout pas mettre le chargement de fichier dans une boucle, mais avoir un tableau qui retiendra le fichier, car les fonction B_file sont très lentes.
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 19/03/2014 19:56 | #
mais avoir un tableau qui retiendra le fichier,
Ben ,c'est sa que fait ma fonction, mais c'est quand je cherche dans ce tableau que c'est lent, car je recherche caractère par caractère.
quand je tombe sur ";", je copie (avec memcpy) dans le tableau (où le fichier a été copié) ce qu'il y a entre les deux ";" et je le mets dans le grand tableau qui a les données des monstres et dont je vais me servir
Citer : Posté le 19/03/2014 20:55 | #
Il faut que tes données aies des tailles définies.
Par exemple, l'attaque est écrite sur 2 octets (jusqu'à 65536, ça devrait suffire ).
Donc, quand tu veux lire l'attaque, tu as:
Bfile_ReadFile(handle,(void *)(&attaque),2,-1);
Et ce pour toutes les valeurs.
Ainsi, la fonction est beaucoup accélérée.
Citer : Posté le 20/03/2014 19:41 | #
en fait, je ne cherche pas directement dans le fichier. Je fais comme dodormeur a dit. dans mon fichier yugioh.csv, chaque valeur est séparé par des ";"
Ex:
1;Abysse Etincelante;1600;1880;4;
2;Agrippe Forme;1200;1700;5;
3;Aitsu;100;100;5;
etc...
je copie l'intégralité du fichier dans un tableau en char puis je cherche ,caractère par caractère, le caractère ";" pour copier ce qu'il y a entre 2 ";" avec strcpy. je le passe de char* en int(pas le nom bien sur). puis je mets l'info dans un autre tableau bien structuré
|1|Abysse etincelante|1600|1880|4|
|2|Agrippe Forme |1200|1700|4|
|3|Aitsu |100 |100 |5|
c'est cette fonction qui s'occupe du travail
char *buffer = NULL;
char buffer2[40]={0};
int type = 0;
int curseur = 0;
int curseur2 = 0;
int tailleFichier;
int monstre = 0;
int mode=0;
FONTCHARACTER PathName[]={'\\','\\','f','l','s','0','\\','M','O','N','S','T','R','E','S','.','c','s','v',0};
recuphandle = Bfile_OpenFile(PathName,_OPENMODE_READ);
ML_clear_vram();
PopUpWin(5);
ML_rectangle(11,20,115,30,1,ML_BLACK,ML_TRANSPARENT);
ML_display_vram();
tailleFichier = Bfile_GetFileSize(recuphandle); // on récupère la taille du fichier
buffer = (void*)malloc(tailleFichier); // on copie le fichier dans le buffer
Bfile_ReadFile(recuphandle, buffer, tailleFichier, 0);
Bfile_CloseFile(recuphandle);
while(curseur < tailleFichier)
{
curseur++;
if(buffer[curseur] == ';'||buffer[curseur]=='\n') // si on tombe sur un ; ou un retour à la ligne
{
memset(buffer2, 0, 40 * sizeof(char)); // on réinitialise le buffer2
memcpy(buffer2, &buffer[curseur2], (curseur - curseur2) * sizeof(char)); // on copie ce qu'il y a entre deux points virgules
switch(mode)
{
case 0 : // si on est sur l'ID
stockage[0+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
case 1 : // si on est sur le nom
memcpy(&(stockage[1+monstre*15]), buffer2, 40 * sizeof(char)); // on copie le nom dans le tableau
break;
case 2 : // si on est sur l'attaque
stockage[12+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
case 3 : // si on est sur la défense
stockage[13+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
case 4 : // si on est sur le niveau
stockage[14+monstre*15] = char2int(buffer2); // on copie la valeur au bon endroit
break;
}
memset(buffer2, 0, 40 * sizeof(char)); // on réinitialise le buffer2
curseur2 = curseur + 1; // et la position du dernier curseur
mode++;
if(mode > 5) mode = 0; // on change le type de donnée
}
if(buffer[curseur] == '\n') monstre++; // on change de monstre
ML_rectangle(12, 20, monstre + 11, 30, 1, ML_BLACK, ML_BLACK); // pour la barre de progression
ML_display_vram();
}
free(buffer); // on libère la mémoire
locate(1,1);
Print((char*)"succes");
ML_display_vram();
Mais elle met quand même 5sec à charger 105monstres dans le tableau. Donc je me demande si il existe une fonction qui recherche 1 caractère particulier et qui renvoie sa position dans le tableau.
PS il y a char* strchr(const char* chaine, int caractereARechercher); mais elle ne recherche que le 1ère caractère alors que moi je cherche une fonction qui cherche le caractère à partir d'un point précis(exemple je veux qu'elle cherche à partir de tableau[10], ce qu'il y a avant de m'intéresse pas)
Citer : Posté le 20/03/2014 19:49 | #
Mis a part chercher caractère par caractère (ce que tu fais), il n'y a pas moyen.
Je t'ai vraiment dis de faire un système comme cela? Ça me semble un peu bizarre, vu que c'est une fonction assez lourde... omg
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 20/03/2014 20:02 | #
Mais va-t-on réussir à t'expliquer ?
La méthode la plus rapide est de coder, non pas sur les caractères, mais sur les octets.
Par exemple, le niveau d'un monstre sera codé sur 1 octet, mais ce ne sera pas un caractère imprimable.
Par exemple, l'octet contiendra 00000110, soit 6. Le caractère ASCII dont le code est 6 n'est pas imprimable, mais ce n'est pas notre problème.
Lorsque tu vas lire
Tu vas lire un octet et le mettre à l'adresse de la varaible niveau. Ainsi cette dernière contiendra ta valeur.
De cette manière, une caractéristique est toujours stockée sur le même nombre d'octets. Par exemple, l'attaque et la défense sur deux octets, l'ID de la carte sur 1 seul (s'il y a moins de 256 cartes), le niveau sur 1 octet, etc... et le nom sur 20 octets, par exemple.
Du coup il te suffit de lire le nombre d'octets correpondant à ta donnée sans avoir besoin de chercher des séparateurs.
Citer : Posté le 20/03/2014 20:17 | #
@lephenixnoir j'ai un peu compris mais
Si il y a plus de 256 monstres, je coderais sur 2 octet mais est ce que ça changera quelque chose sur les monstres dont l'ID sera inférieur à 256?
et
Bfile_ReadFile(handle,(void *)(&niveau),1,-1);
ça risque pas de prendre les séparateur avec ?
Citer : Posté le 20/03/2014 20:22 | #
Il n'y aura plus de séparateurs ! C'est ça l'intérêt !
Il ne sert à rien de mettre des séparateurs si les données ont des tailles constantes.
Bfile_ReadFile(handle,(void *)(&attaque),2,-1);
Bfile_ReadFile(handle,(void *)name,20,-1);
S'il y a plus de 256 monstres, ceux dont l'ID sera inférieur auront un octet vide.
Au passage, "30000", ça prend 5 octets à écrire, mais la valeur en elle-même tient sur deux octets, donc ne t'inquiète pas sur la taille ; au contraire, tu en économiseras (puisque les séparateurs auront sauté).
Citer : Posté le 21/03/2014 13:23 | #
donc je peux faire
int buffer[105][15]={0};
FONTCHARACTER PathName[]={'\\','\\','f','l','s','0','\\','M','O','N','S','T','R','E','S','.','c','s','v',0};
handle = Bfile_OpenFile(PathName,_OPENMODE_READ);
Bfile_ReadFile(handle,(void *)&buffer[monstre][0],1,-1);//on stocke l'ID
Bfile_ReadFile(handle,(void *)&buffer[monstre][1],20,-1);//on stocke le nom
Bfile_ReadFile(handle,(void *)&buffer[monstre][12],2,-1);//on stocke l'ATK
Bfile_ReadFile(handle,(void *)&buffer[monstre][13],2,-1);//on stocke la DEF
Bfile_ReadFile(handle,(void *)&buffer[monstre][14],1,-1);//on stocke le niveau
avec dans le fichier yugioh.csv
2Agrippe Forme120017005
3Aitsu1001005
etc...
Citer : Posté le 21/03/2014 14:33 | #
Sauf que les valeurs ne sont pas écrites en texte mais dans les octets
Citer : Posté le 21/03/2014 17:29 | #
Et pour lire, je fais comment après?
Printv (10, 10,buffer[monstre][0]);
Citer : Posté le 21/03/2014 19:51 | #
Ben, la lecture se fait, dans le fichier, par la commande
Ensuite pour l'afficher (je zappe ta commande printv car je ne sais pas comment elle fonctionne)
PrintXY(1,1,(const unsigned char *)ch,0);
La modification se fait comme d'habitude.
Seulement puisque tes données sont écrites dans le octets, il est hors de question d'éditer ton fichier avec un bête éditeur de texte, il faut soit les coder avec un programme (opération inverse de la lecture, il s'agit de la meilleure solution 8) ), soit avec un éditeur hexadécimal.
Parce que du coup la valeur 65 ne s'écrit plus "65" mais "A". Il s'agit du caractère correspondant dans la table ASCII.
Dans ton exemple, chaque donnée doit avoir une taille bien définie, donc ce serait plutôt:
.Agrippe Forme ..... // no.2
.Aitsu ..... // no.3
// etc
ADragon Blanc ..... // no.65
Les "." représentant des octets non imprimables ou indéterminés (je n'ai pas fait le calcul de séparation des attaque et défense).
Citer : Posté le 21/03/2014 20:15 | #
okay, mais comme j'utilise excel pour taper les monstres dans un .csv, comment le transformer en hexadecimal
Au fait, comment on met à 0 une case d'un tableau de structure
struct Card
{
int type;
int id;
int tinvoc;
int attack;
int switchstate;
int effect;
Phase timeffect;
};
fonction{
Card tableau[5][4]={0};
tableau[2][2].id=24;
tableau.id=??? //ici je ne sait pas mettre la case à 0(càd que toutes les variables dans la case sont égales à 0)
}
Citer : Posté le 21/03/2014 20:20 | #
Si j'ai bien compris, tu veux mettre à 0 un élément de chaque structure de ton tableau de structures ?
Il n'y a guère qu'une boucle pour faire ça.
Au passage, tu peux m'expliquer pourquoi tu as un tableau à deux dimensions ?
Citer : Posté le 21/03/2014 20:26 | #
en fait je voudrais mettre tout les éléments de la structure à 0
en gros
tableau[2][2].id=0;
tableau[2][2].tinvoc=0;
tableau[2][2].attack=0;
...
mais tableau[2][2]={0}; ne marche pas et je voudrais une solution pas trop longue