cougardarksoul
Messages postés2Date d'inscriptiondimanche 5 novembre 2000StatutMembreDernière intervention 7 janvier 2005
-
6 janv. 2005 à 14:40
cougardarksoul
Messages postés2Date d'inscriptiondimanche 5 novembre 2000StatutMembreDernière intervention 7 janvier 2005
-
7 janv. 2005 à 13:47
Bonjour à tous !
Voilà : je suis en projet d'info visual C++ Windows (nous utilisons .NET 2003), et je dois programmer un désassembleur de 8051. Pour ça, je dois gérer l'ouverture d'un fichier .hex, le lire et retourner les mnémoniques associés à chaque chaîne hexa que l'on peut trouver, et pour finir, enregistrer un fichier contenant le désassemblge.
J'ai déjà la partie d'ouverture du fichier .hex, et là je voudrais l'afficher. J'ai utilisé les flux, puis je me suis servi de la fonction OnOpenDocument (l'utilisateur charge le fichier avec la commande "fichier->ouvrir".
Mon problème se situe à l'affichage : j'essaie d'afficher de façon à ce que le programme revienne à la ligne à chaque fois qu'il trouve deux points ":" (qui indique le début de ma chaîne hexa).
Je voudrais donc ceci :
Mais je n'arrive pas à programmer la boucle dans le OnDraw de la vue, afin de faire ça correctement. J'utilise un TextOut, mais je ne parviens pas à incrémenter la position y avant chaque ":" rencontré.
Si quelqu'un a une idée, je l'en serai très reconnaissant
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 6 janv. 2005 à 23:27
Salut !
Si je comprends bien, le contenu de ton fichier .hex est sotcké dans
une chaîne de caractère (de toute façon, si ce n'est pas le cas, tu peux faire en sorte :)
Il suffit donc de jouer avec les pointeurs de chaînes : Je suppose que la chaîne sz_hex
est
définie et contient les données à afficher, et se termine par un
caractère null. Tu peux alors définir un autre pointeur, qui va
"avancer" le long de la chaîne et un entier qui contiendra la position
depuis les derniers deux points, et qui reviendra à 0 lorsqu'il
rencontrera à nouveau les deux points.
char* sz_points_pos = sz_hex;
int pos_cur = 0;
il suffit maintenant de faire une boucle while, jusqu'à la fin de la chaîne (caractère null)
while(sz_points_pos[pos_cur]!=NULL)
{
if(sz_points_pos[
pos_cur+1]==':' ||
sz_points_pos[
pos_cur+1]==NULL)
{ //':' suivants trouvés ou fin de chaîne
if(
pos_cur!= 0) //affichage de la chaîne si pas vide
//(hors deux points)
{
//ICI : définition du hdc si pas déjà fait,
//modification de pos_x et pos_y pour la nouvelle ligne
TextOut(hdc,
pos_x, pos_y,
sz_points_pos,
pos_cur+1
);
}
//déplace le pointeur à la position des deux points suivants
sz_points_pos = &sz_points_pos[
pos_cur+1];
pos_cur = 0; //nouvelle chaîne
} else {
//sinon, incrémente la longueur de la séquence
pos_cur++;
}
}
Cette boucle doit fonctionner, mais probablement peut-elle être optimisée
en utilisant les fonctions de manipulations de chaînes contenues dans
le header string.h (fonctions de recherche de caractère, etc.) : c'est
juste pour donner un points de départ fonctionnel (et puis j'ai la flemme de
regarder la doc - et je vais pas tout faire à ta place non plus :)
cougardarksoul
Messages postés2Date d'inscriptiondimanche 5 novembre 2000StatutMembreDernière intervention 7 janvier 2005 7 janv. 2005 à 13:47
C'est bon j'ai réussi. Merci pour ton aide vdust !
J'ai un autre problèeme maintenant :D
En fait, je dois faire une vérification du CRC pour chaque ligne d'hexa, afin de voir si le fichier n'est pas corrompu. Je cherche, d'une part, à lire les caractères à la suite d'un ":" sur une ligne, et d'autre part, à les convertir 2 par 2 en nombres hexadécimaux...
Et là je peine !!! J'implore votre aide à nouveau !!! ;)