mikrocontroller.net

Forum: Compiler & IDEs seltsames String-Verhalten. Warum?


Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt seit Tagen das Problem gesucht und soweit eingekreist,
dass ich nicht das ganze progamm posten muss, sondern nur die Teile die
sich nicht nachvollziehbar verhalten.

in einer kleinen Routine mache ich folgende Zuweisung:

if(Key != 0)
{
setbit(PORTC,PC4);
ir_string("abcdefGhijklmnopqrstuvwxyz");
Key = 0;
clearbit(PORTC,PC4);
}

Weil "G" ein Großbuchstabe ist mus vor dem G ein Shift-Zeichen
geschickt werden, anschließend wird ein kleines "g" gesendet.
Das geschieht hier

if(data[i1] >=0x41 && data[i1] <=0x5a)
  {
  data[i1] = data[i1] + 32;
  if(!checkbit(status,4))
    {
    shift();
    }
}
Status 4 merkt sich nur ob die Shift-Taste gedrückt ist, falls das
nächste Zeichen auch gross geschrieben werden muss.

Anschließend wird das Zeichen gesendet und alles klappt, wie es soll.

Beim nächsten Senden ist das "G" aber klein, obwohl die Zeichenkette
neu zeugewiesen wird, d.h. bei

ir_string("abcdefGhijklmnopqrstuvwxyz");

wird entweder ein kleines "g" an übergeben, oder die Zeile wird nicht
ausgeführt, die davor und danach aber schon.
Keine dieser Zeilen läuft in einer ISR oder wird von einer aufgerufen.
Es ist sicher das die if-Anweisung
if(data[i1] >=0x41 && data[i1] <=0x5a)
beim zweiten Durchlauf nicht mehr ausgeführt wird.
Woran liegt das und wie schalte ich das aus?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Beim nächsten Senden ist das "G" aber klein, obwohl die
Zeichenkette
neu zeugewiesen wird, d.h. bei

Probiere mal herauszufinden, was das Schlüsselwort const bei C
bedeutet.

Dann schreibe ir_string() so um, dass die Funktion zu diesem Prototyp
passt:

void ir_string(const char * string)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem teste bitte nicht auf absolute Zahlen sondern
if (... >= 'A' && ... <= 'Z') oder besser gleich
#include <ctypes.h> und isupper(), danach dann tolower()
benutzen, um einen Kleinbuchstaben draus zu machen.

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.