Ein Zeichen in einem String ersetzen

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 726
Registriert seit: Apr 2014
Bewertung: 5
#1
10.06.2014, 19:26

Hallo zusammen,

heute arbeite ich mal wieder am Programm für meine Gewächshausbewässerung. Aktuell scheitere ich jedoch an der einfachen Aufgabe, in einem String ein Zeichen zu ersetzen.

Mein Code:

 
// ===============================================
// Umwandlung der Zähler für Sekunden, Minuten und
// Stunden in einen String, der so angezeigt werden
// kann
// ===============================================
char *crtClkStr(int hh, int mm, int ss) {
char h[] = "00" ,m[] = "00" ,s[] = "00";
char time[] = "00:00:00\0";
 
itoa(hh,h,2); // Stunden
itoa(mm,m,2); // Minuten
itoa(ss,s,2); // Sekunden
 
 
if (hh<10) { time[1] = h[0]; } else { time[0] = h[0]; time[1] = h[1]; }
if (mm<10) { time[4] = m[0]; } else { time[3] = m[0]; time[4] = m[1]; }
if (ss<10) { time[8] = s[0]; } else { time[7] = h[0]; time[8] = s[1]; }

 
return time;
}
 

Erklärung:

Die Funktion wird mit den 3 Parametern Sekunden (ss), Minuten (mm) und Stunden (hh) aufgerufen.
Zunächst möchte ich die 3 Integerwerte in einen String umwandeln, was ich mit der Funktion itoa() erledige. Meine 3 Integerwerte stehen dann in den Zeichenketten h,m und s zur Verfügung.

Dachnach prüfe ich, ob meine ursprünglichen Integerwerte <60 bzw <24 sind. Je nach Ergebnis möchte ich im String time ein Zeichen an einer Position (z.B time[4]) mit einem Zeichen aus h,m oder s (z.B m[1]) ersetzen.

Also beispielhaft: time[4] = m[1].

Nach dem, was ich im Netz so gelesen habe, müsste das so gehen. Die Praxis sieht hier jedoch ganz anders aus: Nur Salat.

Mangels Möglichkeiten, das mal auf einem C-Compiler für Windows zu probieren, bitte ich Euch nun um Hilfe. Vielleicht habt Ihr ja einen Tipp für mich.

In Assembler würde ich das wohl tatsächlich schon hinbekommen... Aber es ist nunmal Arduino-C mit dem ich das Programm entwickele.

Grüsse, Uni

Ok... itoa(int, char, 2) ist schonmal falsch... Ich habe jetzt 2 durch 10 ersetzt.
Funktioniert aber trotzdem nicht....
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 10.06.2014, 19:48 von Unilein.)
Zitieren
wedelchen
Junior Member
**

Beiträge: 39
Registriert seit: Jun 2014
Bewertung: 0
#2
13.06.2014, 18:28

Hey,

leider kann ich dir nicht wie gewünscht helfen, dafür bin ich noch zu sehr Einsteiger.

Aber, falls es dir hilft, ich erstelle meinen Zeitstring auf diesem Weg.
Code:
void zeitstring() // String Zeit erstellen
{
  zeit1="";
  zeit2="";
  lcdstd="";
  lcdmin="";  
  if(RTC.hour <10)
  {
    zeit1="0";
    zeit2="0";
    lcdstd="0";
  }
  zeit1=zeit1+RTC.hour, DEC;
  zeit2=zeit2+RTC.hour, DEC;
  lcdstd=lcdstd+RTC.hour, DEC;
  zeit1=zeit1+":";
  zeit2=zeit2+":";
  if(RTC.minute <10)
  {
    zeit1=zeit1+"0";
    zeit2=zeit2+"0";
    lcdmin="0";
  }
  zeit1=zeit1+RTC.minute, DEC;
  zeit2=zeit2+RTC.minute, DEC;
  lcdmin=lcdmin+RTC.minute, DEC;
  zeit1=zeit1+":";
  if(RTC.second <10)
  {
    zeit1=zeit1+"0";
  }
  zeit1=zeit1+RTC.second;  
}

Gruß...
Zitieren
wedelchen
Junior Member
**

Beiträge: 39
Registriert seit: Jun 2014
Bewertung: 0
#3
14.06.2014, 17:11

So, hat mir doch keine Ruhe gelassen, wieder was gelernt.

Punkt 1:

http://www.mikrocontroller.net/articles/....28.29_.29

itoa( i, Buffer, 10 ); - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.


Bei dir erfolgt demnach die Umwandlung auf Basis 2, also binär.

Code:
itoa(hh,h,2);  // Stunden
itoa(mm,m,2);  // Minuten
itoa(ss,s,2);  // Sekunden

Bei den Abfragen weiter unten hat sich dann noch ein kleiner Fehler eingeschlichen.

Hier mal mein Testsketch:

Code:
byte hh=7;
byte mm=9;
byte ss=1;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
   char h[] = "00" ,m[] = "00" ,s[] = "00";
   char time[] = "00:00:00\0";

   itoa(hh,h,10);  // Stunden
   itoa(mm,m,10);  // Minuten
   itoa(ss,s,10);  // Sekunden

   Serial.print("hh: ");
   Serial.println(hh);
   Serial.print("h: ");
   Serial.println(h);

   Serial.print("mm: ");
   Serial.println(mm);
   Serial.print("m: ");
   Serial.println(m);

   Serial.print("ss: ");
   Serial.println(ss);
   Serial.print("s: ");
   Serial.println(s);

   if (hh<10) { time[1] = h[0]; } else { time[0] = h[0]; time[1] = h[1]; }
   if (mm<10) { time[4] = m[0]; } else { time[3] = m[0]; time[4] = m[1]; }
   if (ss<10) { time[7] = s[0]; } else { time[6] = s[0]; time[7] = s[1]; }

   Serial.print("time: ");
   Serial.println(time);

delay(5000);
}

Ausgabe auf dem seriellen Monitor:


hh: 7
h: 7
mm: 9
m: 9
ss: 1
s: 1
time: 07:09:01


Ausgabe bei...

Code:
byte hh=19;
byte mm=59;
byte ss=41;


hh: 19
h: 19
mm: 59
m: 59
ss: 41
s: 41
time: 19:59:41


Gruß...
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 726
Registriert seit: Apr 2014
Bewertung: 5
#4
15.06.2014, 17:16

@wedelchen: vielen Dank für Deinen Ansatz und Deine Bereitschaft, das Thema mal zu durchdenken.

Das Thema mit itoa(int, char, 10) hatte ich ja bereits selbst bemerkt, das Ergebnis war jedoch gleich.

Heute habe ich mal Deine Routinen gegen meine geprüft und ein paar Deiner Anpassungen übernommen. Zusätzlich habe ich die Flüchtigkeitsfehler bei der Addressierung der Zeichen im String abgestellt. Auch hier war Dein Sketch hilfreich.

Leider habe ich danach immer noch keine Anzeige der Zeit hinbekommen. Der Grund dafür war der Befehl strcpy(ziel, quelle). Mit dem Befehl hatte ich das Ergebnis meiner Funktion crtClkStr in einen String kopiert, den ich letztendlich auf dem Display darstellen wollte. Und genau DAS hat nicht funktioniert. Nachdem ich den Inhalt meiner Routine crtClkStr einfach mal mit in meiner Interruptroutine gepackt hatte und dann den String Time direkt zur Anzeige gebracht habe, hat es endlich funktioniert.

Was lerne ich daraus? Ganz einfach: Ich hab das mit der Adressierung und den Zeigern auf Zeichenketten noch nicht drauf. Da werde ich wohl noch ein wenig üben müssen. Wink

Gruss...
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
wedelchen
Junior Member
**

Beiträge: 39
Registriert seit: Jun 2014
Bewertung: 0
#5
15.06.2014, 20:26

Gerne doch Wink

Zitat:Befehl strcpy(ziel, quelle).

Hmm, wieder was neues. Das schau ich mir mal genauer an.

Gruß...
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste