Hi Leute, ich hab hier ein Problem, an dem ich mir schon lange Zeit die Zähne ausbeiße. Und zwar hab ich einen String(der außschließlich aus Binärwerten besteht - falls das relevant sein sollte). Den Inhalt des Strings möchte ich in ein Integer wandeln. Wichtig wäre es mir, dass die Funktion möglichst wenig Speicher braucht. Im Internet hab ich folgenden Ansatz gefunden, der aber bei mir nicht funktionierte: void convert() { char array[3]; //in Array steht der Wert "010" int n; n = *(int *)array; } Ich bin für jeden Tipp dankbar!
Versuch das hier int Val; Val = 0; while(*array) { Val = Val * 2 +(int)(*array - '0'); array++; } Bedingung der String in array ist mit 0 abgeschlossen. Gruss Helmi
Am wenigsten Speicher und laufzeit vielleicht so:
1 | int convert(char *s){ |
2 | int bin=0; |
3 | while(*s){ |
4 | bin <<= 1; |
5 | if((*s++-'0')) |
6 | bin |= 1; |
7 | |
8 | }
|
9 | return bin; |
10 | }
|
11 | |
12 | int main(){ |
13 | int value; |
14 | char test[] = "10101100"; |
15 | value = convert(test); |
16 | }
|
Natürlich ist hierbei auch alles was >1 ist eine "1". ansonsten noch eine if-Abfrage mehr rein.
>ich hab hier ein Problem, an dem ich mir schon lange Zeit >die Zähne ausbeiße. länger als eine halbe Stunde? Kannst du Binärzahlen im Kopf oder auf Papier in Dezimalzahlen umwandeln? Ja? Genauso mußt du es auch programmieren.
Hi Helmut & Timmo, danke für eure Codeauszüge, leider funktionieren jedoch beide nicht auf meinem Mikrocontroller. Wenn ich zum Beispiel den Code von Timmo ausführe, dann steht in der Variable "value" der Wert 172. Wenn ich den Codeschnipsel von Helmut ausführe, dann steht in der Variable Val der Wert 298. @ARM-Fan: Länger als eine halbe Stunde. Ich hatte ja auch schon eine Lösung, die aber zu speicherlastig war. Grüße Hmm
Hi Hmm, > Wenn ich zum Beispiel den Code von Timmo ausführe, dann steht in der > Variable "value" der Wert 172. > Wenn ich den Codeschnipsel von Helmut ausführe, dann steht in der > Variable Val der Wert 298. Sag mal, hast du dir denn die beiden Codeschnipsel von Helmut und Timmo nur kopiert und ausprobiert, oder hast du dich auch dran gemacht, sie zu verstehen und zu "debuggen"? Dein Posting liest sich so, als ob du es nur probiert hast, ob's geht, sorry, falls ich es falsch interpretiere. Schreib doch einfach mal, welchen String du reingibst, und was du konkret rausbekommst. Hast du eigentlich die Möglichkeit, zu simulieren oder direkt mit einem Debug-Interface auf den Controller zu gehen? Ralf
LOL 10101100 ist auch 172 (0xAC). Wenn du dein "010" berechnen willst muss du natürlich test[] anpassen
1 | int main(){ |
2 | int value; |
3 | char test[] = "010"; |
4 | value = convert(test); |
5 | }
|
Wenn dein Array 3 Bytes lang ist und dort "010" drinsteht dann ist dein String nicht mit einer binaeren Null abgeschlossen. Also mach dein String mal um 1 Byte laenger und schliess den mit einer 0 ab. Also void main() { char array[4]; int v; array[0] = '0'; array[1] = '1'; array[2] = '0'; array[3] = 0; v = convert(array); } und dann int convert (char *array) { int Val; Val = 0; while(*array) { Val = Val * 2 +(int)(*array - '0'); array++; } return(Val); }
Hä? Ein String wird in '"' geschrieben und dort ist dann automatisch eine Nullterminierung drin.
1 | char test[4] = {'0','1','0',0}; |
ist genau das gleiche wie
1 | char test[] = "010"; |
ist genau das gleiche wie
1 | |
2 | char test[] = {'0','1','0',0}; |
Siehe Orignal Post:
>char array[3]; //in Array steht der Wert "010"
Die Vermutung liegt wirklich Nahe dass die NULL fehlt.
@Timmo H. Ich weiss schon das so an den String eine NULL angehaengt wird weiss aber nicht ob der Threadopener das weiss. Deshalb habe ich es so ausfuehrlich hingeschrieben damit er sieht das da eine Ende Null am String sein muss. Und bei einem Array[3] = "010" werde ich da schon mal stuzig ob da wirklich noch eine 0 am Ende ist. Nur so ist zu erklaeren das bei meinem Programmstueck ein falscher Wert rauskommt. Da wird der Prozessor wohl so lange weiter gescannt haben bis er auf eine 0 im Speicher gestossen ist. Gruss Helmi
Hi Leute, den String hatte ich mit \0 geschlossen, nur hab ich einen extrem dummen Fehler gemacht. Hab nochmals beide Vorschläge ausprobiert und beide funktionieren einwandfrei. Danke für die Hilfe!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.