Go Down

Topic: Integer Variable in Datentyp char umwandeln? (Read 1 time) previous topic - next topic

Tobias93

Hallo,

ich möchte gerne eine Variable vom Datentyp Integer in ein Array des Datentyps char umwandeln. Ich habe mich hierzu schon durch zahlreiche Foren gelesen, habe dort allerdings nichts richtig verstanden weil ich noch recht neu in der Materie bin.
Ich habe also eine Integer Variable:

Quote
int Zufallszahl = random(0,9999);


Diese Variable "Zufallszahl" wird einmalig in der Setup loop generiert. Nun möchte ich diese Variable in ein Array des Datentyps char umwandeln, damit ich in einem späteren Schritt einen Vergleich anstellen kann. Dann möchte ich nämlich ein anderes char Array mit der Zufallszahl vergleichen. Das ganze soll dann irgendwann so aussehen:

Quote

if (strcmp(CODE,Zufallszahl)== 0){                                     
        digitalWrite(LED,HIGH);
        delay(5000);
        digitalWrite(LED,LOW);
        delay(5000);


Ich habe allerdings überhaupt keine Ahnung wie diese Convertierung  laufen könnte, habe auch schon bereits mit dem "atoi" Befehl rumgebastelt, allerdings nichts brauchbares bekommen, daher wäre ich auch für Begründungen und Erklärungen dankbar.

Gruß,
Tobi
Nobody is perfect but - impossible is nothing

uwefed

Nicht die Syptome bekämpfen sondern den Grund Deines Problems.
Wieso generierst Du nicht 4 Zufallszahlen im range 48 bis 57 (ashii-Wert der Zahlen von 0 bis 9) und lädst damit dein Array?

Grüße Uwe

Tobias93

Hallo Uwe,

danke für die Rückmeldung. Ich habe mit dem Ansatz nun etwas rumgebastelt und bin an folgender Stelle:

das ist mein Probecode der 4 Zufällige Zahlen erzeugt und sie nacheinander in ein Array speichert. Wenn man sich den Vorgang im Serial Monitor anschaut bekommt man die 4 Zufallszahlen dargestellt aber nicht danach den gesammten Arrayinhalt. Ich bin in der Array Materie noch nicht tief drin habe aber eine Vermutung warum das nicht geht: Das Array was mir das Kennwort des Türschlosses speichert sieht wie folgt aus:

Quote
char TuerCode[5] = "9200";


Das Array was die Zufallszahlen aufnehmen soll, sieht so aus:

Quote
char Zufallszahl[5];


Jetzt fangen meine Gedankenprobleme an. Und zwar kann ich doch in einem Array[5] eine Zahl mit 6 Stellen speichern oder ? Warum muss mein Array was mein TuerCode speichert [5] haben? Es speichert doch nur eine Zahl zwischen 0000 und 9999 ? Denn die Zufallszahl ist ja auch nur vierstellig. Wenn ich aber das TuerCode Array auf zum Beispiel [4] oder kleiner setze bekomme ich eine Fehlermeldung das das Array zu klein für den Inhalt ist. Warum?? Ok egal ich habe also bei meinem TuerCode[5] Array wie unten im Sketch zu sehen ist den Arrayinhalt
  • und [1] mit nullen beschrieben, da ich ja nur eine vierstellige Zahl brauche. Das ganze funktioniert einfach nicht und ich finde nicht den richtigen Anhaltspunkt warum und wie ich / was ändern muss.

    Das hier ist der Code:

    Quote

    #include <SoftwareSerial.h>

    int eins = 0;
    int zwei = 0;
    int drei = 0;
    int vier = 0;

    char TuerCode[5];
    int durchlauf = 0;

    void setup(){
      Serial.begin(9600);
      //value = random(47,58);
    }

    void loop(){
     
      while(durchlauf == 0){
      TuerCode[0] = 0;
      TuerCode[1] = 0;
      // erste Zahl generieren und laden
      eins = random(0,9);
      Serial.print("Erste Zahl ist: ");
      Serial.println(eins);
      TuerCode[2] = eins;
      delay(1000);
      // zweite Zahl generieren und laden
      zwei = random(0,9);
      Serial.print("Zweite Zahl ist: ");
      Serial.println(zwei);
      TuerCode[3] = zwei;
      delay(1000);
      // dritte Zahl generieren und laden
      drei = random(0,9);
      Serial.print("Dritte Zahl ist: ");
      Serial.println(drei);
      TuerCode[4] = drei;
      delay(1000);
      // vierte Zahl generieren und laden
      vier = random(0,9);
      Serial.print("Vierte Zahl ist: ");
      Serial.println(vier);
      TuerCode[5] = vier;
      delay(1000);
     
      durchlauf = 1;
      }
     
      Serial.println("Der Zufallscode ist: ");
      Serial.println(Array);
    }


    Gruß,
    Tobi
Nobody is perfect but - impossible is nothing

michael_x

Es gibt nicht nur int  und char, sondern auch Texte, die aus mehr als einem Zeichen bestehen.

Eine Zahl zwischen 0 und 9999 kannst du in einem int abspeichern, für den Text "0000" brauchst du ein char TuerCode[5], wenn du sie mit print ausgeben willst. ( Damit print weiss, wie lang der Text ist, hat "1234" eine Endekennung ).

Code: [Select]
char TuerCode[5];  // definiert TuerCode[0] ... TuerCode[4]

int eins = random(0,9); // Eine Zahl, aber kein druckbares Zeichen
Serial.print(eins);         // print kann sowohl Zahlen, als auch Texte drucken, was aber ganz verschiedene Sachen sind.
TuerCode[1] = 0;          // das ist schon die EndeKennung 
TuerCode[2] = eins;      // das ist kein lesbares Zeichen 


Quote
Wieso generierst Du nicht 4 Zufallszahlen im range 48 bis 57 (ashii-Wert der Zahlen von 0 bis 9) und lädst damit dein Array?


Wenn du dem "Hokuspokus" nicht traust, solltest du aber doch einen Unterschied zwischen "0", '0' und 0 erkennen.

Code: [Select]
char TextMitEinerZiffer[2] = "0";  // ( Länge 2 wegen der EndeKennung )
char EineZiffer = '1';
byte EineZahl = 2;

EineZiffer = '0' + EineZahl; // andert '1'  in  '2'
TextMitEinerZiffer[0] = EineZiffer;  // liefert "2"

 

Uwe's 48 ist "zufällig" der Zahlenwert von '0'

uwefed

ups, hab ich da etwas zu kompliziert erklärt?  ;) ;) ;)
Grüße Uwe

Tobias93

danke euch beiden für die Infos, werde das gleich morgen ausprobieren und ein Statement geben :)


Bis dahin, Gruß
Tobi
Nobody is perfect but - impossible is nothing

Tobias93

hey,

also das mit der Endekennung habe ich jetzt denk ich mal verstanden. Aber so richtig schlau geworden bin ich immer noch nicht. Ich verstehe nicht wie man das TuerCode Array mit den Zufallszahlen beschreiben kann. Mein Ansatz ist der, aber der funktioniert nicht:

char TuerCode [5] = "9200"   //  das ist doch ein char array mit 5 "Plätzen" das bedeutet doch das wenn die //Zufallszahl 0 ist auch einzelne "Plätze" des Arrays mit 0 beschrieben werden müssen, wenn die gesamte Zufallszahl //zum Beispiel 15 beträgt. Dann müsste ins Array doch 00015 eingespeichert werden oder ? Ich versteh nicht wie das //gehen soll.

  char TuerCode[5] = "9200";  // Ausgangscode, die 5 ist die Endekennung und die "Plätze" 0 bis 4 müssen beschrieben werden
 
  // jetzt speichere ich die Zufallszahl in das Array ein, das funktioniert aber nicht
 
  char TuerCode[0] = random(0,10);  // generierte Zahl wäre zum Beispiel 1
  char TuerCode[1] = random(0,10);  // generierte Zahl wäre zum Beispiel 2
  char TuerCode[2] = random(0,10);  // generierte Zahl wäre zum Beispiel 3
  char TuerCode[3] = random(0,10);  // generierte Zahl wäre zum Beispiel 4
  char TuerCode[4] = random(0,10);  // generierte Zahl wäre zum Beispiel 5
 
  // Jetzt bin ich der Auffassung das der neu erzeuge TuerCode nichtmehr 9200 sondern 12345 beträgt, da ich aber einen
  // vierstelligen Code habe muss ich doch folgendes machen:
 
  char TuerCode[0] = 0
  char TuerCode[1] = random(0,10);  // generierte Zahl wäre zum Beispiel 1
  char TuerCode[2] = random(0,10);  // generierte Zahl wäre zum Beispiel 2
  char TuerCode[3] = random(0,10);  // generierte Zahl wäre zum Beispiel 3
  char TuerCode[4] = random(0,10);  // generierte Zahl wäre zum Beispiel 4
 
  // jetzt ist der TuerCode doch anstatt 12345 die Zahl 1234 was ein zulässiger vierstelliger Code
  // ist oder?


Kann mir hier bitte jemand die Augen öffnen ?
Gruß,
Tobi
Nobody is perfect but - impossible is nothing

Tobias93

Servus Jungs,

mein Lehrer hat mir das gerade mal erklärt. Das Geheimnis war das '/n' Zeichen . Mit dem Code geht es :-)
Danke für eure Hilfe.

Gruß,
Tobi

Quote

#include <SoftwareSerial.h>

int start = 0;
char Zufallszahl[5] = "0000";

void setup(){
  Serial.begin(9600);
  Serial.print("Der aktuelle Code ist: ");
  Serial.println(Zufallszahl);
}

void loop(){
 
  while(start == 0){
 
  Zufallszahl[0] = random(0,9)+48;
  Zufallszahl[1] = random(0,9)+48;
  Zufallszahl[2] = random(0,9)+48;
  Zufallszahl[3] = random(0,9)+48;
  Zufallszahl[4] = '\n';
 
  Serial.println("Der Zufallscode ist: ");
  Serial.println(Zufallszahl);
  delay(2000);
  }
}
Nobody is perfect but - impossible is nothing

michael_x

Schönen Gruß an deinen Lehrer,

manchmal muss man auch Glück haben.

Das Geheimnis des '\n' Zeichen ist, dass wenn schon keine EndeKennung da ist, eventueller Müll, der zufällig im Speicher hinter Zufallszahlstehen sollte, in die nächste Zeile geschrieben wird. Und da weniger stört.
'\n' ist das NewLine Zeichen ( dezimal 10 )

char Zufallszahl[5];   // 0 .. 4  sind 5 Elemente
Zufallszahl[4] = 0; // letztes definiertes Element erhält eine EndeKennung

alternativ:
Code: [Select]
char Zufallszahl[5] = "0000"; // dies erzeugt schon 4 * '0' in Zufallszahl[0] ... Zufallszahl[3]  sowie Endkennung 0 in Zufallszahl[4]

Wenn du in deinem Code die Zeile
  Zufallszahl[4] = '\n';
weglässt, funktioniert es immer noch,
weil die EndeKennung in Zufallszahl[4], die dort seit Anfang steht,  nicht überschrieben wird.

( Du bekommst nur eine Leerzeile weniger in der Ausgabe von Serial.println(Zufallszahl);  )

MaFu

Das war hoffentlich nicht Dein Informatik Lehrer (oder wie auch immer sich dieses Fach heutzutage in der Schule nennt)  :smiley-eek:
_______
Manfred

Tobias93

Hey michael,

danke für die Rückmeldung. Irgendwie scheint da aber immer noch ein
Fehler drin zu sein, weil das Ändern der jeweiligen Zahl im Webserver nachdem sie eingegeben wurde
funktioniert immer noch nicht. Das komische ist, wenn ich mir fie aktuelle Zufallszahl im Serial Monitor
anzeigen lasse ist dies eine andere wie die die ich im Webserver angezeigt bekomme obwohl
beide die gleiche Variable anzeigen sollen ???wtf????
Kannst du dir das erklären?

Gruß Tobi
Nobody is perfect but - impossible is nothing

michael_x

Wo ist ein Webserver ? wie gibt er an einen client eine Seite mit deiner Zufallszahl aus ? Was siehst du dann im Browser ?

Einen Text mit vier zufälligen Ziffern zu erzeugen (also irgendwas zwischen "0000" und "9999") scheint ja jetzt erledigt.
Mach doch eine Funktion draus, vergiss danach die Details und kümmer dich dann nur um dein anderes Problem.

char Zufallszahl[5] = "0000";   

void setNeueZahl(char *ziel) ; // setzt einen neuen Zufallszahlentext zwischen "0000" und "9999"   ( woanders implementiert )

void loop() {

   // Webserver liest Anforderung vom client und wertet Parameter aus...

   if (neueZahl) {
      setNeueZahl(Zufallszahl);
      Serial.print(Zufallszahl); Serial.println (" ist die neue Zufallszahl");
      // in die Webseiten-Antwort einbauen ...
   }

}


Tobias93

hey michael,
danke für die Rückmeldung. Mir ist heute leider das EthernetShield und der Arduino Mega kaputt gegangen (mechanischer Art) daher kann ich vorerst noch nichts neues sagen, ich bemühe mich aber schnell Ersatz zu finden.


Gruß,
Tobi
Nobody is perfect but - impossible is nothing

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview