Pages: [1]   Go Down
Author Topic: Integer Variable in Datentyp char umwandeln?  (Read 1261 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Nobody is perfect but - impossible is nothing

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21875
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Nobody is perfect but - impossible is nothing

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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'
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21875
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ups, hab ich da etwas zu kompliziert erklärt?  smiley-wink smiley-wink smiley-wink
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Bis dahin, Gruß
Tobi
Logged

Nobody is perfect but - impossible is nothing

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Nobody is perfect but - impossible is nothing

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Nobody is perfect but - impossible is nothing

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);  )
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

_______
Manfred

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Nobody is perfect but - impossible is nothing

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

}

Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Nobody is perfect but - impossible is nothing

Pages: [1]   Go Up
Jump to: