2010-06-14 33 views
1

J'ai de la difficulté à utiliser reinterpret_cast. Disons tout de suite que je ne suis pas marié ot reinterpret_cast. N'hésitez pas à suggérer des changements majeurs. Avant de vous montrer mon code, je vous dirai ce que j'essaie de faire. J'essaie d'obtenir un nom de fichier à partir d'un vecteur plein de données utilisées par un processeur MIPS que j'ai conçu. Fondamentalement, ce que je fais est de compiler un binaire d'un programme de test pour mon processeur, vider tous les hexs du binaire dans un vecteur dans mon programme C++, convertir tous ces hexs en entiers décimaux et les stocker dans un vecteur DataMemory qui est les données unité de mémoire pour mon processeur. J'ai aussi une mémoire d'instruction. Donc, lorsque mon processeur exécute une instruction SYSCALL telle que "Open File" mon émulateur de système d'exploitation C++ reçoit un pointeur au début du nom de fichier dans ma mémoire de données. Gardez donc à l'esprit que la mémoire de données est pleine d'ints, de chaînes, de globals, de locaux, de toutes sortes de choses. Quand on me dit où le nom de fichier commence, je fais ce qui suit:Convertir décimal en ASCII

Convertir tout l'élément entier décimal pointé en sa représentation de caractères ASCII, puis rechercher de gauche à droite pour voir si la chaîne se termine, si pas alors simplement charger chaque caractère consécutivement dans une chaîne "filename". Pour ce faire jusqu'à la fin de la chaîne en mémoire, puis stocker le nom de fichier dans une table. Ma difficulté est la génération de nom de fichier de ma mémoire.

Voici un exemple de ce que je suis en train de faire:

C++ Syntaxe (Toggle Texte brut)

1.Index Vector  NewVector ASCII filename 
    2.0  240faef0 128123792 'abc7' 'a' 
    3.0  240faef0 128123792 'abc7' 'ab' 
    4.0  240faef0 128123792 'abc7' 'abc' 
    5.0  240faef0 128123792 'abc7' 'abc7' 
    6.1  1234567a 243225  'k2s0' 'abc7k' 
    7.1  1234567a 243225  'k2s0' 'abc7k2' 
    8.1  1234567a 243225  'k2s0' 'abc7k2s' 
    9.   //EXIT LOOP// 
    10.1  1234567a 243225  'k2s0' 'abc7k2s' 

Voici le code que j'ai écrit jusqu'à présent pour obtenir le nom de fichier (Je suis juste Appliqué à l'élément 1000 de mon vecteur DataMemory pour tester la fonctionnalité 1000 est arbitraire):.. C++ Syntaxe (Toggle texte brut)

1.int i = 0; 
    2.int step = 1000;//top->a0; 
    3.string filename; 
    4.char *temp = reinterpret_cast<char*>(DataMemory[1000]);//convert to char 
    5.cout << "a0:" << top->a0 << endl;//pointer supplied 
    6.cout << "Data:" << DataMemory[top->a0] << endl;//my vector at pointed to location 
    7.cout << "Data(1000):" << DataMemory[1000] << endl;//the element I'm testing 
    8.cout << "Characters:" << &temp << endl;//my temporary char array 
    9. 
    10.while(&temp[i]!=0) 
    11.{ 
    12.  filename+=temp[i];//add most recent non-terminated character to string 
    13.  i++; 
    14.  if(i==4)//when 4 characters have been added.. 
    15.  { 
    16.   i=0; 
    17.   step+=1;//restart loop at the next element in DataMemory 
    18.   temp = reinterpret_cast<char*>(DataMemory[step]); 
    19.  } 
    20. } 
    21. cout << "Filename:" << filename << endl; 

donc, la question est que quand je fais la conversion de mon élément décimal en un tableau char je suppose que 8 # hexs me donneront 4 caractères. Pourquoi n'est-ce pas ce cas? Voici ma sortie:

C++ Syntaxe (Toggle Texte brut)

1.a0:0 
    2.Data:0 
    3.Data(1000):4428576 
    4.Characters:0x7fff5fbff128 
    5.Segmentation fault 
+0

Ok, donc j'ai sortof ce compris sur . Je suis allé le long chemin et juste retourné à mon tableau hexadécimal, a pris chaque mot, le diviser en mots hexadécimaux 2bit et ensuite fait la conversion en ascii sur chaque segment de 2 bits puis j'ai ajouté le résultat à ma chaîne de nom de fichier, itérer jusqu'à ce que je reçoive un "0" et pause.Fonctionne bien mais d'une manière difficile à manier. ** conversion = hexCharValue (tempInstructionMemory [1000] [i * 2]) << (4 * 1); conversion + = hexCharValue (tempInstructionMemory [1000] [(i * 2) +1]) << (4 * 0); si (conversion == 0) casse; filename + = (char) de conversion; ** –

Répondre

0

Si vos chaînes sont nulles terminé, vous ne voulez pas faire

10. while(temp[i]!=0)

instad de

10. while(&temp[i]!=0)

Je ne suis pas certain de comprendre la structure de DataMemory ...

+0

Lorsque je supprime le & je reçois un segfault. Je ne suis pas un expert avec des pointeurs ou quoi que ce soit alors je suis sûr que je fais quelque chose de mal ici. Si je ne dereference temp ne vais-je pas vérifier l'emplacement de la matrice par opposition au contenu? –

+0

La structure DataMemory est un peu déroutante. Pensez simplement à tout ce qui, dans un programme, n'est pas une instruction, y compris une pile, un tas et des données statiques. J'ai pris ces sections d'un fichier binaire et les ai chargées dans mon vecteur DataMemory. Maintenant, mon processeur a accès à toutes les données statiques nécessaires et il a une place pour mettre des résultats. À l'état stable, j'ai juste un tas de constantes et de noms de fichiers et d'adresses dans mon vecteur de données pour être utilisé plus tard par le programme que je vais exécuter sur mon processeur. –

+0

Je pense que peut-être j'ai fait le problème semble plus grand que c'est. Voici ce que j'essaie de faire: HEX (41424344) = DEC (1094861636) = ASCII ('A', 'B', 'C', 'D') J'ai la partie HEX à DEC vers le bas bien, mais je ne peux pas tout à fait comprendre comment faire la deuxième partie. J'ai essayé d'utiliser reinterpret_cast avec beaucoup de problèmes. Des solutions simples à ce problème? –

0

Désolé, mais le code est en désordre. Si vous voulez imprimer des données brutes, vous devez réaliser que le zéro-char est en réalité zéro, ce qui est une valeur très courante dans les données brutes.

L'impression d'une chaîne brute se terminera donc très probablement prématurément, car un caractère nul sera trouvé.

Comme déjà mentionné, le test devrait probablement être while(temp[i] != 0) et non while(&temp[i] != 0) qui ne sera jamais faux parce que l'adresse d'un emplacement mémoire (en dehors du noyau) est! = 0.

+0

C'est parfaitement correct. Ce n'est pas vraiment ma spécialité donc toute aide est appréciée. Je vais suivre le conseil précédent pour changer mon test. En outre, il est supposé que MIPS ISA prendra soin de terminer la chaîne au bon endroit. Je suppose que la section principale sur laquelle je suis coincé convertit la valeur décimale contenue dans un seul élément en sa représentation ASCII et en l'insérant dans une sorte de tableau testable. Est-ce possible? –

+0

Les chaînes (chaînes C - char *) se terminent par le premier caractère nul. C'est la définition standard. Si vous avez un compilateur qui suit les standards C/C++, il interprètera les chaînes C de cette manière (en fait c'est le travail des compilateurs pour rendre toutes les plateformes identiques du point de vue du code). Eh bien, la représentation ASCII des données, ce n'est pas très clair. Si vous voulez faire un mappage ASCII pour les données imprimables, alors vous devez filtrer le non-imprimable - voir 'ctype.h' (en C) /' cctype' (en C++) –

+0

Je suis un peu confus par ce que vous signifie par "avec le premier nul-char". Dites que ma chaîne est "abcd" et dans mon vecteur, ne sera-t-elle pas représentée par 'a', 'b', 'c', 'd', '/ 0'? –

Questions connexes