La conversion d'un size_t en un entier (c++)
J'ai essayé de faire une boucle for qui va se répéter basé sur la longueur d'un paquet de réseau. Dans l'API, il existe une variable (size_t) par événement.paquet->dataLength. Je veux que l'itération de 0 à l'événement.paquet->dataLength - 7 augmentation de je par 10 à chaque fois qu'il effectue une itération, mais je vais avoir un monde de mal.
J'ai cherché des solutions, mais ont été incapables de trouver quelque chose d'utile. J'ai essayé de convertir le size_t un unsigned int et faire de l'arithmétique avec cela, mais malheureusement il ne fonctionne pas. Fondamentalement, tout ce que je veux est: est-ce
for (int i = 0; i < event.packet->dataLength - 7; i+=10) { }
Si à chaque fois que je fais quelque chose comme ceci ou de tentative de ma conversions les i < # est un chiffre énorme. Ils ont donné une instruction printf dans un tutoriel pour l'API, ce qui utilisés "%u" pour imprimer le nombre réel cependant, quand je le convertir en un unsigned int, il est toujours incorrecte. Je ne sais pas où aller à partir d'ici. Toute aide serait grandement appréciée 🙂
static_cast<unsigned int>(-1)
? Ce qui se passe quand event.packet->dataLength
est à moins de 7?Pourquoi ne peut -
i
être un size_t
trop? Aussi, à moins que la longueur est toujours égale à 7 mod 10, c'est une très particulière de boucle d'essayer.Avez-vous essayé de casting
event.packet->dataLength
à un int
?Alors que nous pouvons fixer le type d'incohérences, mais nous ne pouvons pas fixer votre logique jusqu'à ce que vous parlez-nous de l'objectif et de votre code.
Wow, je ne pense pas que, grâce à, actuellement, il n'est pas un travail, mais plus probablement parce qu'il EST inférieur à 7. Je déteste quand je fais des trucs stupides.
OriginalL'auteur JeanOTF | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas changer le type de
i
?Essayer de garder les types de toutes les variables utilisées ensemble du même type; jette devrait être évitée.
Il n'y a pas de spécificateur de format pour
size_t
en C++03, vous devez lancer le plus grand entier non signé de type que vous pouvez et de les imprimer. (Le spécificateur de format poursize_t
dans C++0x est%zu
). Cependant, vous ne devriez pas être à l'aide deprintf
de toute façon:Tandis que les cours d'eau peuvent être plus prolixe, ils sont plus de type de sécurité et n'exige pas de vous de mémoriser quoi que ce soit.
Garder à l'esprit votre boucle logique peut être imparfaite. (Ce qui se passe, comme genpfault notes, quand
dataLength - 7
est négatif?)dataLength - 7
est négatif, et je ne pense pas que cela va faire du bien.Non, il ne le sera pas, c'est pourquoi j'ai mentionné. Difficile de dire ce que le correctif est sans connaître les intentions.
J'ai essayé de faire je size_t déjà n'a pas fonctionné.
Que diriez -
while (i + 7 < event.packet->dataLength)
?-1 @Gman: votre solution ne fonctionne pas. L'OP a déclaré que la soustraction "chaque fois que" les résultats dans un "grand nombre". Moyens typiques de la taille des paquets est inférieur à 7, et comme vous le notez à la fin, c'est ungood.
OriginalL'auteur GManNickG
Tout faire avec arithmétique signée. Essayez:
Une fois que vous commencez à utiliser unsigned de l'arithmétique avec des valeurs qui peuvent être négatifs, et en utilisant des opérateurs de comparaison comme
<
, vous êtes en difficulté. Beaucoup plus facile de garder les choses signé.int
est formellement UB. Donc, la meilleure correction de la parenthèse. Cheers,P. Steinbach: Grâce - même après votre commentaire, il m'a fallu un moment pour comprendre ce que vous vouliez dire, si ce n'était pas juste une faute de frappe.
OriginalL'auteur David Thornley
Est dataLength >= 7? Si le résultat de dataLength-7 est négatif, si vous l'interpréter comme non signé, le résultat est d'un très grand nombre entier.
OriginalL'auteur Michael Cornelius
Utilisation size_t pour je.
Pour printf, si vous n'avez pas C99, seulement C90, fonte de type unsigned long, ou unsigned long long. E. g.:
Sinon utiliser %zu
OriginalL'auteur peenut
Vous devriez d'abord vérifier si
event.packet->dataLength < 7
. Maintenant, si c'est moins de 7 vous obtenez les valeurs inférieures à 0 utilisé comme non signé: par exemple 0 = 0 x 00000000; -1 = 0 - 1 = 0xFFFFFFFF.Encore une fois, la case:
OriginalL'auteur ssmir
"chaque fois que je fais quelque chose comme ceci ou de tentative de ma conversions les i < # est un chiffre énorme."
Qui indique que l'origine de la longueur du paquet est de moins de 7 (vous êtes en soustrayant 7).
Une des solutions consiste à utiliser un en-pratique-grand-assez signée de type entier, et la bibliothèque standard fournit
ptrdiff_t
à cette fin. Comme,Un plus lourd solution de contournement consiste à incorporer le tout dans un
if
qui vérifie que la taille est d'au moins 7.Cheers & hth.,
OriginalL'auteur Cheers and hth. - Alf
Depuis
event.packet->dataLength
retourne un type non signésize_t
:1) Utilisation
size_t
comme l'indice de la variable type.2) s'Assurer de maths n'a pas de dépassement de capacité. @beldaz. Plutôt que de soustraire 7 de
event.packet->dataLength
, ajouter 7 ài
.OriginalL'auteur chux