www.mikrocontroller.net

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


Autor: Hmm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am wenigsten Speicher und laufzeit vielleicht so:
int convert(char *s){
  int bin=0;
  while(*s){
    bin <<= 1;
    if((*s++-'0'))
      bin |= 1;

  }
  return bin;
}

int main(){
  int value;
  char test[] = "10101100";
  value = convert(test);
}
Natürlich ist hierbei auch alles was >1 ist eine "1".
ansonsten noch eine if-Abfrage mehr rein.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hmm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOL
10101100 ist auch 172 (0xAC). Wenn du dein "010" berechnen willst muss 
du natürlich test[] anpassen
int main(){
  int value;
  char test[] = "010";
  value = convert(test);
}

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hä? Ein String wird in '"' geschrieben und dort ist dann automatisch 
eine Nullterminierung drin.
char test[4] = {'0','1','0',0};
ist genau das gleiche wie
char test[] = "010";
ist genau das gleiche wie
  
char test[] = {'0','1','0',0};

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Orignal Post:

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

Die Vermutung liegt wirklich Nahe dass die NULL fehlt.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh stimmt, übersehen, sorry

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hmm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.