Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » lire un fichier binaire contenant une liste int8_t avec Bfile (gint)
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

lire un fichier binaire contenant une liste int8_t avec Bfile (gint)

Posté le 16/01/2021 09:57

bonjour, comme dit dans le titre, peu t'on lire un fichier binaire contenant une liste int8_t avec Bfile ?

coté pc j'utilise https://gist.github.com/stackprogramer/318dc02af7df83cfe1664596dcebd1ac
pour écrire dans un fichier mais c'est comment coté Bfile?


1, 2 Suivante
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 16/01/2021 10:07 | #


Yup, on peut, en utilisant BFile du coup. Tu alloues la liste (soit de taille connue à l'avance soit de la taille du fichier), tu la charges sur ton buffer avec BFile_Read(), et enjoy. Oublie pas de faire tout ça dans un gint_switch().
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 16/01/2021 10:08 | #


gint_switch()?
pensés suicidaires
   90%
Kbd2 Hors ligne Membre Points: 269 Défis: 0 Message

Citer : Posté le 16/01/2021 10:59 | #


It gives control back from gint to the OS, it's mainly used for file operations. Documentation on gint_switch can be found here (basically, pass it a pointer to a function that does the Bfile operation)
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 16/01/2021 11:03 | #


BFile ne peut être utilisé que dans l'OS, donc il faut sortir temporairement de gint.

#include <gint/gint.h>

int8_t ma_liste[10];

void fonction_a_executer_hors_de_gint(void) {
   /* Ton code BFile là */
   /* Charge les valeurs dans ma_liste */
}

/* Pour lancer la fonction, ne pas l'appeler directement */
fonction_a_executer_hors_de_gint(); // FAUX
/* À la place, utiliser gint_switch(): */
gint_switch(fonction_a_executer_hors_de_gint); // OK

Il y a un bon exemple dans gintctl. La fonction switch_dump() copie une partie de l'OS dans un fichier, et utilise donc BFile. Au lieu de l'appeler directement, on l'appelle avec gint_switch(). Les paramètres sont passés via une variable globale, l'appel complet est fait par la fonction do_dump().

Comme d'habitude, il y a une description et une documentation, et d'autres explications sur le forum ; bien sûr, tu ne peux pas tout trouver, mais là il est évident que tu n'as rien cherché, ce qui est perçu comme malpoli. Pour BFile il y a aussi des exemples sur le forum et dans les programmes, y compris dans des projets récents.

Prends le temps de lire De la bonne manière de poser les questions, en particulier la section Avant de demander qui contient une liste de choses que tu dois faire avant de poser tes questions. Ici :

• "Essayez... en cherchant sur le Web" → Il y a des topics qui en parlent sur Planète Casio : [1], [2] (de toi celui-là...)
• "Essayez... en lisant le manuel" → Tes questions n'expliquent pas si tu as lu les documentations de BFile et de gint_switch(), donc je vais devoir passer du temps à te les répéter pour t'obliger à exprimer ce qu'il te manque comme information
• "Essayez... par inspection et expérimentation" → On a déjà debuggé du BFile pour toi ensemble, tu dois au moins avoir un bout de code qui marche dans un coin. Mais tu sembles n'avoir rien testé, et même si tu as testé tu n'expliques pas ce que tu as fait donc on est obligés de partir de zéro
• "Si vous êtes programmeur, essayez... en lisant le code source" → Plusieurs projets récents font ça, Terrario a un fichier save.c, AST3 a un fichier save.c...

Pour te donner l'idée, quitte à ce que ça sonne méchant : si tu ne prends pas le temps de chercher, pourquoi prendrions-nous le temps de te répondre ?

Ma politique personnelle est de donner des réponses détaillées aux questions recherchées et des réponses bâclées aux questions bâclées.
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 16/01/2021 11:30 | #


moi j'ai fais
    const uint16_t *fileName = u"\\\\fls0\\level.bin";
    int data_file = BFile_Open(fileName, BFile_ReadOnly);
    int8_t level_map[MAP_LEN*6];

    BFile_Read(data_file, (void *)level_map, MAP_LEN*6, 0);

pensés suicidaires
   90%
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 16/01/2021 11:31 | #


C'est pas mal. Faut fermer le fichier à la fin.
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 16/01/2021 11:36 | #


je sais, c'est juste un bout de code
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/bfile.h>

#define TILEMAP_LEN 10
#define MAP_LEN 150

extern bopti_image_t img_tilemap;

void print_map(){

}

int main(void)
{
    const uint16_t *fileName = u"\\\\fls0\\level.bin";
    int data_file = BFile_Open(fileName, BFile_ReadOnly);
    int8_t level_map[MAP_LEN*6];

    BFile_Read(data_file, (void *)level_map, MAP_LEN*6, 0);

    dclear(C_WHITE);
    dtext(1, 1, C_BLACK, "Sample fxSDK add-in.");
    dupdate();

    getkey();
    BFile_Close(file);
    return 1;
}


Ajouté le 16/01/2021 à 11:38 :
ps: c'est aujourd’hui la 1k jam et on a toujours pas le theme
pensés suicidaires
   90%
Kikoodx Hors ligne Labélisateur Points: 2768 Défis: 11 Message

Citer : Posté le 16/01/2021 11:39 | #


C'est hors-sujet, mais le thème sera annoncé à 18 heures aujourd'hui
Time is running out
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 16/01/2021 11:51 | #


Tu peux fermer le fichier immédiatement après le BFile_Read. Ensuite faut mettre tout le BFile dans une sous-fonction, et là tu l'appelles avec gint_switch().
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 17/01/2021 12:39 | #


je teste le code mais j'ai un
invalid conversion from 'const char16_t*' to 'const uint16_t*'


pour la ligne
const uint16_t *fileName = u"\\\\fls0\\level.bin";


pourtant la dernière fous que j'ai utilisé ça marchait
pensés suicidaires
   90%
-florian66- Hors ligne Ancien rédacteur Points: 2370 Défis: 20 Message

Citer : Posté le 17/01/2021 13:06 | #


Mais comment tu veux stocker une chaîne de caractère avec des entiers ? C'est moche et ça prends bcp de place ! Met bien un unsigned char* pour des chaines et virer le 'u' avant la chaine
In Arch, I trust ! And you ?
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 17/01/2021 13:26 | #


oui mais regarde le prototype de la fonction que j'utilise
int BFile_Open(uint16_t const *file, enum BFile_OpenMode mode);


Ajouté le 17/01/2021 à 13:50 :
le pire c'est que terriaro et AST3 font comme moi et ça marche
pensés suicidaires
   90%
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 17/01/2021 14:10 | #


-florian66- a écrit :
Mais comment tu veux stocker une chaîne de caractère avec des entiers ? C'est moche et ça prends bcp de place ! Met bien un unsigned char* pour des chaines et virer le 'u' avant la chaine

Les caractères sont des entiers, char est un entier. Ne te pose pas de questions.

Je suis surpris que tu aies ce warning. Je regarderai, peut-être que je peux changer le paramètre des fonctions BFile_*() pour utiliser char16_t si c'est plus approprié. Je suppose que c'est un nouveau warning de la part du compilateur, si tu as une version plus récente que le reste des membres ça arrive de temps en temps.

En attendant, tu dois sans doute pouvoir caster explicitement :

const uint16_t *fileName = (void *)u"\\\\fls0\\level.bin";
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 17/01/2021 14:15 | #


en effet debian met toujours a jour gcc

et j'ai essayé (void *) mais ça ne marche pas

reste plus qu'a modifier le prototype
pensés suicidaires
   90%
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 17/01/2021 14:34 | #


Pedrobzh a écrit :
en effet debian met toujours a jour gcc

Tu utilises le GCC de ton OS (ie. gcc) ?
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 17/01/2021 14:37 | #


non j'utilise sh-elf-g++

Ajouté le 17/01/2021 à 14:43 :
mon message d'erreur:

:: Making into build-fx

sh-elf-g++ -c src/main.c -o build-fx/src/main.c.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Wno-missing-field-initializers -Os -D FX9860G -m3 -I include -MMD -MT build-fx/src/main.c.o -MF build-fx/src/main.c.d -MP
src/main.c:11:28: error: invalid conversion from 'void*' to 'const uint16_t*' {aka 'const short unsigned int*'} [-fpermissive]
   11 | const uint16_t *fileName = (void *)u"\\\\fls0\\level.bin";
      |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                            |
      |                            void*
make: *** [Makefile:121 : build-fx/src/main.c.o] Erreur 1

pensés suicidaires
   90%
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 17/01/2021 14:57 | #


Aaah tu compiles du C++, voilà pourquoi ! Il est beaucoup plus rigoureux sur les pointeurs de ce genre.

Je t'avoue que ça va être un peu chiant, donc autant le déclarer à l'ancienne :

const uint16_t filename[] = { '\\', '\\', 'f', 'l', 's', '0', '\\', 'l', 'e', 'v', 'e', 'l', '.', 'b', 'i', 'n', 0 };
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 17/01/2021 15:22 | #


ça marche (maintenant j'ai je contenu du fichier qui est buggé mais c'est autre chose (et je sais d'ou ça viens ) )

Ajouté le 17/01/2021 à 15:53 :
eeeeee le keydown() ne marche plus
if(keydown(KEY_LEFT)){x--;}
if(keydown(KEY_RIGHT)){x++;}
if(keydown(KEY_MENU)){break;}

pensés suicidaires
   90%
Lephenixnoir Hors ligne Administrateur Points: 21002 Défis: 143 Message

Citer : Posté le 17/01/2021 15:59 | #


Tu n'as pas clearevents() je suppose ?
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

Citer : Posté le 17/01/2021 16:01 | #


mais dans cette partie de code il y a un truc qui fais frezze le jeu

        dclear(C_WHITE); //marche

        map_print(); //marche
        dprint(1, 1, C_BLACK, "x: %d",x); //marche mais doute
        dupdate(); //met a jour l’écran mais doute
        if(keydown(KEY_LEFT)){x--;} //marche pas
        if(keydown(KEY_RIGHT)){x++;}//marche pas
        if(keydown(KEY_MENU)){break;}//marche pas


Ajouté le 17/01/2021 à 16:03 :
Lephenixnoir a écrit :
Tu n'as pas clearevents() je suppose ?
désolé j'ai pas vu le message

je ne sais pas ce que c'est clearevents() mais je suppose que c'est dclear()

Ajouté le 17/01/2021 à 16:09 :
ah, non
* clearevents() reads all pending events from the input queue.

pensés suicidaires
   90%
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 53 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