string to int [8051]

Gast #1066230
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!
#1066236
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.
Gast #1066238
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.
Gast #1066254
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
Gast #1066261
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
#1066265
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);
}
#1066773
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
Gast #1067174
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren