Forum: Mikrocontroller und Digitale Elektronik string to int [8051]


von Hmm (Gast)


Lesenswert?

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!

von Helmut L. (helmi1)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

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.

von ARM-Fan (Gast)


Lesenswert?

>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.

von Hmm (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

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
}

von Helmut L. (helmi1)


Lesenswert?

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);
}

von Timmo H. (masterfx)


Lesenswert?

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};

von ARM-Fan (Gast)


Lesenswert?

Siehe Orignal Post:

>char array[3]; //in Array steht der Wert "010"

Die Vermutung liegt wirklich Nahe dass die NULL fehlt.

von Timmo H. (masterfx)


Lesenswert?

Ahh stimmt, übersehen, sorry

von Helmut L. (helmi1)


Lesenswert?

@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

von Hmm (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.