2017-10-02 2 views
-1

J'essaye d'utiliser un champ de bits pour stocker une série de compteurs qui sont utilisés pour faire des triangles pour les graphiques, puisque j'ai seulement besoin des valeurs 0,1,2 pour certains d'entre eux et ne veux pas gaspiller de mémoire. Ce que le code doit faire est de commencer à partir de bf.vertIndex = 0 et ensuite de faire une boucle jusqu'à ce que bf.vertindex = 6 où il s'arrêtera de fonctionner. Cependant le programme aboutit à une boucle infinie et quand je l'ai imprimer la valeur de bf.vertIndex comme int il est toujours = 1. Suis-je autorisé à utiliser des champs de bits avec ces opérandes? et suis-je capable d'ajouter un nombre entier, tel que 2, à la valeur d'un champ de bit donné?Peut-on comparer les bifields, en utilisant <,>, =?

float vertexData[12]; 
triInfo bf; 
count = 0; 
bf.trinum = 0; 
bf.addedx = 0;//tracks if the x cord needs to be offset = 1 or 0 
bf.addedy = 0;//same as for the x cord 
bf.vertIndex = 0; 
//this loop should make a triangle 
while (bf.vertIndex < 6){ 
    //sets cordinates for a vertex 
    vertexData[bf.vertIndex] = 500 + width*(bf.addedx); 
    vertexData[bf.vertIndex] = 500 + height*(bf.addedy); 
    //keeps track of the number of vertices created and checks where if an 
    bf.vertIndex += 2; 
    if (bf.vertIndex = 2 && bf.trinum == 0){ 
     bf.addedy = !bf.addedy; 
    } 
    if (bf.vertIndex = 4 && bf.trinum == 0){ 
     bf.addedx = !bf.addedx; 
    } 
    cout << ((int)bf.vertIndex); 

} 

c'est la façon dont le champ de bits j'est disposé

struct triInfo 
{ 
    unsigned char trinum:1, addedx :1,addedy:1, vertIndex:5; 

}; 

J'ai vu un tutoriel ici Youtube où le monsieur fait la vidéo a ajouté deux valeurs qui ont été stockées sous forme de caractères au point 10:15 dans la vidéo.

+2

'bf.vertIndex = 2' et' bf.vertIndex = 4' ne sont pas des comparaisons. Votre compilateur aurait dû vous prévenir à ce sujet. – user2357112

+0

Si ces compteurs sont utilisés uniquement pour * créer * des graphiques (comme ci-dessus le 'triInfo bf;' étant la variable locale unique, rejetée à la fin de la portée), vous économisez de la mémoire au mauvais endroit), en échange de mauvaises performances et d'un code plus important. Je me demande ce qui vous a fait penser que cela en vaut la peine. (Il serait beaucoup plus logique d'économiser de la mémoire sur les types de données, que vous gardez en main, et non pas en unités simples, mais en centaines/milliers/..., puis quelques octets de plus de code peuvent en valoir la peine. – Ped7g

+0

Vous indiquez les valeurs 0, 1, 2 - votre code pour 'addedx' et' addedy' semble n'utiliser que 0 ou 1. De toute évidence, 'vertIndex' utilise une plus grande plage. Si vous essayez de stocker '2' dans' bf.trinum', vous débordez le champ large de 1 bit. Votre code ne montre pas cela, donc il ne peut pas être un problème et la mention de 2 peut être un faux-fuyant. Mais soyez prudent. Vous auriez besoin d'au moins 2 bits pour gérer 0, 1, 2. –

Répondre

1

Vous pouvez comparer les champs de bits avec <, > et ==, comme tout autre entier. Mais = est une affectation, pas une comparaison, et vous écrasez par inadvertance la valeur que vous essayez de comparer. Si vous utilisez clang ou GCC, vous devriez avoir l'habitude de compiler avec -Wall pour activer les avertissements du compilateur, puis de lire attentivement les avertissements afin de pouvoir corriger la cause sous-jacente. (Les autres compilateurs ont des mécanismes similaires, consultez le manuel.)

+0

Oh, j'avais complètement oublié ces deux signes. changer ceux-ci a arrêté la boucle infinie. Im en utilisant le compilateur que Visual Studio utilise par défaut, donc je dois y regarder. je vous remercie pour la réponse rapide, avec quelques autres changements, il fonctionne maintenant comme prévu –