ich verstehe nicht, warum sich bei (atof(cmdResponse+i)) das Komma so
komisch nach rechts verschiebt. Also bei i =1 bis 3 kommt 11001.000000
raus, aber bei i=4 oder 5 etwas anderes.
Ich habe dieses Konstrukt in einem Code gefunden, kann mir aber keinen
Anwendungsfall denken.
Auch diese atoi() Variante verstehe ich nicht:
char cCheckBuf[50];
unsigned int uiSTAB_Status = atoi(cCheckBuf + 5);
Kennt ihr einen Anwendungsfall hierfür, oder was hat sich der
Programmierer hierbei gedacht?
Daniel W. schrieb:> atof(cmdResponse+i)
Dir ist klar, dass das den Strings von cmdResponse ab der Stelle i
übergibt? Also mit jedem Schleifendurchlauf eine Ziffer weniger.
Ausgabe:
(atof(cmdResponse+0)) 5432.000000
(atoi(cmdResponse)+5) 5437.000000
dPsPress_1 != dPsPress_2
(atof(cmdResponse+1)) 432.000000
(atoi(cmdResponse)+5) 5437.000000
dPsPress_1 != dPsPress_2
(atof(cmdResponse+2)) 32.000000
(atoi(cmdResponse)+5) 5437.000000
dPsPress_1 != dPsPress_2
(atof(cmdResponse+3)) 2.000000
(atoi(cmdResponse)+5) 5437.000000
dPsPress_1 != dPsPress_2
(atof(cmdResponse+4)) 0.000000
(atoi(cmdResponse)+5) 5437.000000
dPsPress_1 != dPsPress_2
(atof(cmdResponse+5)) 0.000000
(atoi(cmdResponse)+5) 5437.000000
dPsPress_1 != dPsPress_2
Das Komma wandert um den Wert "i" nach links, aber die Absichet des
Programmiers erschließt sich mir trotzdem nicht ganz
@Dr_Sommer
der Schleifendurchlauf ist auf meinen Mist gewachsen, damit ich erkenne,
welche Auswirkungen die Variabele i hat. Im Ursprungscode ist keine
Schleife drin.
Sorry, die Frage was sich der Programmierer (in diesem Fall du) sich bei
dem Unsinn gedacht hat kannst nur du selber beantworten.
"char cmdResponse[20]= {'5','4','3','2'};"
Ist kein gültiger C-String, da fehlt die abschließende Null.
"cmdResponse+i"
"cmdResponse" ist am ende nur ein Pointer den du um "i" erhöhst und
verändert in keinster Weise den Speicher worauf diese Zeigt.
Das ganze hat aber rein garnichts mit atof oder atoi oder irgendwelchen
"zulässigen wertebereich der Datentypen".
Das sind grundlegendste Basics in C an denen es dir hier anscheinend
mangelt.
Irgendwer schrieb:> "char cmdResponse[20]= {'5','4','3','2'};"> Ist kein gültiger C-String, da fehlt die abschließende Null.
Auch die abschließende Null ändert an der Ausgabe nix. Das sollte nur
mal eine willkürliche Zahlenfolge sein, da ich nicht weiss was in einem
20 bzw 50 char-Array drinsteht.
Irgendwer schrieb:> "cmdResponse+i"> "cmdResponse" ist am ende nur ein Pointer den du um "i" erhöhst und> verändert in keinster Weise den Speicher worauf diese Zeigt.
ich dividiere doch cdmRespone durch 10^i. Kannst du das mit dem Pointer
näher spezifizieren? Gewöhnlich verwende ich Pointer mittels * oder
Elementzugriff ->
@Kaj
ja du hast recht. Das habe ich so nicht gleich erkannt.
Daniel W. schrieb:> Auch die abschließende Null ändert an der Ausgabe nix.
Die Null ist aber trotzdem nötig, denn sonst liest Dein atoi/atof
solange im Speicher weiter, bis es auf eine Null (nicht das Zeichen
'0'!) trifft.
> Kannst du das mit dem Pointer näher spezifizieren? Gewöhnlich verwende> ich Pointer mittels * oder Elementzugriff ->
Du hast jetzt den Pointer-/Array-Dualismus kennengelernt.
C kann Funktionen keine Arrays übergeben.
Wenn Du eine Funktion mit einem Array als Parameter aufrufst, wird der
Funktion ein Pointer auf das erste Arrayelement übergeben.
Das hat einerseits die Konsequenz, daß die Funktion nichts weiter über
das Array weiß (und damit sizeof nicht die Größe des Arrays bestimmen
kann), und andererseits, daß sich dieser Parameter eben /genauso wie ein
Pointer/ verhält.
Wenn Du zu einem char-Array (das Du übrigens auch gleich mit einem
String in "" statt einer Liste einzelner char-Konstanten in ''
initialisieren kannst) einen Wert addierst, erhältst Du als Resultat
einen Pointer, der auf das "erste + Wert" - Element des Arrays zeigt.
Beispiel:
@ Rufus, danke für die Erklärung.
Rufus Τ. F. schrieb:> einen Wert addierst, erhältst Du als Resultat> einen Pointer, der auf das "erste + Wert" - Element des Arrays zeigt.
hier mal ein Ausschnitt aus dem Ursprungscode:
PCM_Error(iDevID,__FILE__,__FUNCTION__,E_DEV_DRV_ERRMSG,EC_ERROR,"Fehler von TatsBUS_QueryDevice()");
13
}
14
else
15
{// response format: STAB<\09><dddddd>
16
// 01234 5
17
uiSTAB_Status=atoi(cCheckBuf+5);
18
// Device Table
19
SetPCMSendBufTxt(cCmdBuf);
20
SetPCMReadBufTxt(cCheckBuf);
21
}
dem Programmierer ging es also weniger darum eine Zeichenkette in ein
Integer bzw. Float zu convertieren, sondern mehr darum einen Pointer zu
erzeugen, der auf das "erste + Wert" - Element des Arrays zeigt?
wie darf ich das
// response format: STAB<\09><dddddd>
// 01234 5
verstehen?
Daniel W schrieb:> wie darf ich das // response format: STAB<\09><dddddd>> // 01234 5> verstehen?
Das interpretiere ich so, daß auf die vier Zeichen "STAB" ein Tab (9
oder auch '\t') und dann eine dezimale Zahl folgt.
Die dezimale Zahl fängt also im 6. Element des Zeichenarrays an.
Da das erste Element den Index 0 hat, muss man also 5 (statt 6)
addieren.
Hier mal ein Beispiel dafür :
@Rufus
vielen Dank. Ich habe auch gerade mit dem Programmierer gesprochen. Ihr
beide sein d'Acord.
Also mit einfachen Worten erklärt sollte erst ab dem 6. Element an auf
Integer bzw Float konvertiert werden.