Vous n'êtes pas identifié.
Pages: 1
Resalut a tous
Je me suis attaqué aux routines de 2072 pour gérer les fichiers basic, et apres avoir traduit le readme ( ca serait qd meme mieux en francais mais bon :? ), j'ai pu compiler des progs convenablement, donc tous les fichiers sont bien présents dans ce qui va suivre.
Pour etre sur d'avoir un algo correct, j'ai repris l'exemple de 2072:
#include <dos.h> #include "basic-u.h" unsigned int segm_video; int main (void) { struct BASICfile bf; char text[16]; segm_video=peek(0x4E,0); if (create_mem_zone(1,"TEST", 230, RESIZE_ZONE) != -2) { if (search_basic_file("TEST", &bf) != -1) printf("TEST found ! The size is %un", bf.b_size); else printf("TEST not found !n");//this line is useless since it cannot happen !?! write_toBfile(&bf, "Hello world !", 0, 13); read_toBfile(&bf, text, 0, 13); printf("%s", text); } else printf("Not enough memory !"n); exit(0); }
Je compile ca sans probleme, et puis quand j'exécute, ma calto m'affiche "TEST not found"... Cherchez l'erreur!
Pourtant quand je vais voir dans les fichiers basic, TEST a bien été créé, et avec la bonne taille en plus, seulement impossible de le repérer avec la fonction search_basic_file() !!
Si par contre je cherche un fichier que j'ai créé moi-meme ou bien un fichier venant d'un jeu (comme PLATDATA par exemple), alors la calto me trouve effectivement le fichier.
Donc créer un fichier ca marche, chercher un fichier ca marche, mais chercher un fichier que j'ai créé ca marche pas!! 8O
J'ai essayé tout ce que je pouvais, mais rien a faire... :cry:
Z'auriez pas une ptite idée pour moi?
Hors ligne
Ahhh merci ! Ça m'apprendra à ne pas tester mes exemples !
#include <dos.h> #include <conio.h> #include <bios.h> #include <stdlib.h> #include <stdio.h> #include "basic-u.h" unsigned int segm_video; int main (void) { struct BASICfile bf; char text[16]; segm_video=peek(0x4E,0); if (create_mem_zone(1,"TEST ", 230, RESIZE_ZONE) != -2) { if (search_basic_file((unsigned char *)"TEST", &bf) != -1) { printf("TEST found ! The size is %un", bf.b_size); write_toBfile(&bf, "Hello world !", 0, 14); read_toBfile(&bf, text, 0, 14); printf("%s", text); } else printf("TEST not found !n");//this line is useless since it cannot happen !?! } else printf("Not enough memory !n"); bioskey(0); return 0; }
Bon voilà le bug c'est que ma fonction create_mem_zone écris le nom de la zone (en l'ocurrence le nom du fichier basic) sauf que j'ai fait une erreur: elle copie toujours 8 charactère quelque soit la longueur du nom donc forcément comme TEST fait 4 charactères elle copie ce qu'il y a après dans la mémoire et du coup le nom du fichier basic dans la mémoire n'était pas "TEST" mais "TEST 00TES" et comme ma fonction search... cherchait "TEST 00 00 00 00" elle ne risquait pas de le trouver....
Utilise le code au-dessus cela marchera beaucoup mieux !
@+
PS les autre vérifier vos progs
sinon dans le fichier BASICf-u.c , à la ligne 184, remplacez
//if not existing: write the zone name if (!found) for (b=0; b<8;b++) write_from_here[3+b]=zonename[b];
par
//if not existing: write the zone name if (!found) for (b=0; b<8;b++) { write_from_here[3+b]=zonename[b]; if (!zonename[b]) break; }
Hors ligne
Merci d'avoir répondu aussi vite!
c'est marrant en plus j'avais pensé a un probleme dans les noms, parce que j'arrivais a créer plusieurs fichiers avec un meme nom...
Bon j'ai plus qu'a me mettre au boulot!
Hors ligne
euh...
tu te trompe 2072 !
moi je met po des /0 apres des noms !
moi je crois que l' erreur vient de la :
if (create_mem_zone(1,"TEST ", 230, RESIZE_ZONE) != -2)
c po plutot CREATE_ZONE a la place de RESIZE_ZONE ???
ou alors g rien capté a tes routines et ca marche kan meme ...
Hors ligne
bah ecoute je teste ce qu'a fait julien.... et 2072 a entierement raison !!!
que ce soit create ou pas, le code de julien buggue alors qu'avec 2072 ca marche impect !!!
merci 2072 parceque j'avais exactement le mem prob que julien et maintenant tout est clean.
au fait je tenais a te féliciter parceque tes routines sont remarquables !
Hors ligne
moi je fais ca :
je recherche;
c po bon, je creer;
la taille est po bonne, je resize;
je recherche;
j' initialise le basicfile ;
Et ca marche impec !
Hors ligne
ouias c ma méthode aussi ds un prog dont je tairai le nom
et un truc aussi que j'aurais aimé ds les libs de 2072, c ke les nombres retournés soient en définition ac des noms, car -2 ou -1 on comprend pas tjrs...
Hors ligne
C'est aussi ma méthode dans Snake II !!!
Hors ligne
bon, ms c bizzare que search_basic_file retourne -1, ce code, c pour les erreur, non?
moi, la taille, je la trouve direct, car c ce que ca retourne ...
Hors ligne
ben vi....
Et si ya erreur ca retourne -1...
Mais si c bon ca retourne la taille du fichier...
Par contre je savais pô que que RESIZE_ZONE créait aussi le fichier basic!
En tous cas c un truc a savoir, si le nom du fichier basic fait pô 8 charactères, faut rajoutter des charactère ( c pour ca que ca marchait nickel dans Snake II -->fichier basic = SNK.CFG avec un espace devant donc un nom a huit charactere)
Hors ligne
8O
TCX.MOD
TCX.ICO
TCX.INI
8O
en +, g fait un test, g creer un file appelé 'ARF' (quelle nom originale !!!) et ca a marchait pr la recherche ...
Hors ligne
je sais que je ne me trompe pas, il ya un bug lorsque ma fonction écris le nom de la zone dans la mémoire... le nom sera celui que t'aura demandé mais après le carcatère nul il risque d'y avoir autre chose, suivant ce qu'il y a dans la mémoire...
applique la corrction que j'ai mis dans mon post plu haut et ça marchera sans rajouter les caractère nulls.
Et la meilleur façon de créer un fichier basic est de faire comme dans l'exemple corrigé que j'ai donné plus haut.
la fonction create_zone renvoie une valeur < 0 en cas d'erreur (-2 c'est qund y'a plus assez de mémoire disponible pour créer le fihier basic ou pour la fonction elle-même).
Hors ligne
Pages: 1