Konvertieren einer size_t in eine ganze Zahl (c ++)

8

Ich habe versucht, eine for-Schleife zu erstellen, die basierend auf der Länge eines Netzwerkpakets iteriert. In der API existiert eine Variable (size_t) von event.packet- & gt; dataLength. Ich möchte iterieren von 0 bis event.packet- & gt; dataLength - 7 erhöhen i um 10 jedes Mal, wenn es iteriert, aber ich habe eine Welt der Schwierigkeiten.

Ich habe nach Lösungen gesucht, konnte aber nichts Nützliches finden. Ich habe versucht, die size_t zu einem unsigned int zu konvertieren und die Arithmetik damit auszuführen, aber leider hat es nicht funktioniert. Grundsätzlich will ich nur Folgendes:

%Vor%

Aber jedes Mal, wenn ich etwas mache oder versuche, meine Conversions zu machen, ist das i & lt; # Teil ist eine riesige Zahl. Sie gaben eine printf-Anweisung in einem Tutorial für die API, die "% u" verwendete, um die tatsächliche Zahl zu drucken, aber wenn ich es in einen unsigned Int umwandle, ist es immer noch falsch. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Jede Hilfe würde sehr geschätzt werden:)

    
JeanOTF 13.01.2011, 22:44
quelle

7 Antworten

4

Warum änderst du nicht den Typ von i ?

%Vor%

Versuchen Sie, die Typen aller verwendeten Variablen zusammen zu halten; Güsse sollten vermieden werden.

Es gibt keinen Formatbezeichner für size_t in C ++ 03, Sie müssen auf den größten unsignierten Integer-Typ umwandeln und diesen ausgeben. (Der Formatbezeichner für size_t in C ++ 0x ist %zu ). Sie sollten jedoch printf auf keinen Fall verwenden:

%Vor%

Während Streams möglicherweise etwas ausführlicher sind, sind sie typsicherer und erfordern nicht, dass Sie sich etwas einprägen.

Denken Sie daran, dass Ihre tatsächliche Schleifenlogik fehlerhaft ist. (Was passiert, wie genpfault, wenn dataLength - 7 negativ ist?)

    
GManNickG 13.01.2011, 22:49
quelle
2

Mach alles mit vorzeichenbehafteter Arithmetik. Probieren Sie:

%Vor%

Sobald Sie beginnen, vorzeichenlose Arithmetik mit Werten zu verwenden, die negativ sein können, und Vergleichsoperatoren wie < zu verwenden, sind Sie in Schwierigkeiten. Viel einfacher, die Dinge unterschreiben zu lassen.

    
David Thornley 13.01.2011 22:57
quelle
1

Ist dataLength & gt; = 7? Wenn das Ergebnis von dataLength-7 negativ ist, wenn Sie es als unsigned interpretieren, ist das Ergebnis eine sehr große Ganzzahl.

    
Michael Cornelius 13.01.2011 22:52
quelle
0

Verwenden Sie size_t für i.

Für printf, wenn Sie nicht C99 haben, nur C90, umwandeln zu unsigned long oder unsigned long long. Zum Beispiel:

%Vor%

Ansonsten benutzen Sie% zu

    
peenut 13.01.2011 22:53
quelle
0

Sie sollten zuerst überprüfen, ob event.packet->dataLength < 7 . Wenn es kleiner als 7 ist, erhalten Sie Werte kleiner als 0, die als vorzeichenlos verwendet werden: z. 0 = 0x00000000; -1 = 0 - 1 = 0xFFFFFFFF.

Noch einmal, der Scheck:

%Vor%     
ssmir 13.01.2011 22:55
quelle
0

"Jedes Mal, wenn ich so etwas mache oder versuche, meine Conversions durchzuführen, ist der i & lt; # -Teil eine riesige Zahl."

Das bedeutet, dass die ursprüngliche Paketlänge kleiner als 7 ist (Sie subtrahieren 7).

Eine Lösung besteht in der Verwendung eines Integer-Indextyps mit großem Vorzeichen, und die Standardbibliothek stellt zu diesem Zweck ptrdiff_t bereit. Wie,

%Vor%

Eine umständlichere Problemumgehung besteht darin, das Ganze in ein if einzubetten, das überprüft, ob die Größe mindestens 7 ist.

Prost & amp; hth.,

    
Cheers and hth. - Alf 13.01.2011 22:58
quelle
0

Da event.packet->dataLength einen vorzeichenlosen Typ size_t zurückgibt:

1) Verwenden Sie size_t als Indexvariablentyp.

2) Stellen Sie sicher, dass die Mathematik nicht unterläuft. @beldaz . Anstatt 7 von event.packet->dataLength zu subtrahieren, addiere 7 zu i .

%Vor%     
chux 29.06.2015 15:04
quelle

Tags und Links