INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Brauche Hilfe bei Arrays
02.07.2019, 15:23
Beitrag #1
Brauche Hilfe bei Arrays
Hallo,

ich habe eine Routine die Eingaben von der seriellen Schnittstelle auswertet bzw. filtert.
Gibt man z.B. ein "OPEN(@1,2,7,8) wird alles ausser 1 2 7 und 8 herausgefiltert.
Diese Zahlen sollen in die Array Variable CH[], da bekomme ich allerdings immer Fehler.

Hier ein Code-Ausschnitt:

Code:
int8_t CH[33] = {};
Code:
if (strncmp_P(serialBuffer, PSTR("OPEN(@"), 6) == 0)
  {

    char delimiter[] = ")@,;";
    char *ptr;

    // initialisieren und ersten Abschnitt erstellen
    ptr = strtok(serialBuffer, delimiter);

    while (ptr != NULL)
    {
      x++;

      if (x > 1)              // erste erkannte Zeichen ")@" ignorieren
      {
        Serial.print("CH:");
        Serial.println(ptr);
        CH[ptr] = 0;   <################# FEHLER
        set_outputs();
      }
      // naechsten Abschnitt erstellen
      ptr = strtok(NULL, delimiter);

    }
  }
  x = 0;


die Fehlermeldung lautet:

Code:
Arduino: 1.6.5 , Platine: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

invalid types 'int8_t [33] {aka signed char [33]}[char*]' for array subscript


Kann mir jemand dabei helfen?

Gruß,
Wolfram.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 15:29 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2019 15:29 von Tommy56.)
Beitrag #2
RE: Brauche Hilfe bei Arrays
Der Arrayzugriff CH[zahl] verlangt als Index eine Zahl, keinen Pointer. ptr zeigt auf den Anfang des nächsten Wortes.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 18:19
Beitrag #3
RE: Brauche Hilfe bei Arrays
(02.07.2019 15:29)Tommy56 schrieb:  Der Arrayzugriff CH[zahl] verlangt als Index eine Zahl, keinen Pointer. ptr zeigt auf den Anfang des nächsten Wortes.

Gruß Tommy

Richtig. Tommy56

Aber ich bin nicht ganz sicher, dass das dem Wolfram weiterhilft :-)


Also:

in der Variable "ptr" steht nach dem Aufruf von strtok eine Speicheradresse drin. Und zwar die Adresse, an der im Array erstmals das Begrenzungszeichen aufgetaucht ist.

Um an diese Stelle eine 0 zu schreiben müsstest du dann *ptr=0 schreiben.

Denn CH[ptr] = 0; würde von der Anfangsadresse des Arrays CH aus gerechnet um so viele Speicherstellen weitergehen, wie ptr angibt. Dazu müsste prt aber eine Variable für ganze Zahlen sein und keine Variable für Speicheradressen.
Auch dürften dann in ptr nur ein Wert zwischen 0 und 32 stehen, da es sonst nicht im Speicherbereich des Arrays läge.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 18:30 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2019 19:38 von Tommy56.)
Beitrag #4
RE: Brauche Hilfe bei Arrays
@MartinZ: Du liegst völlig falsch mit Deiner Erklärung.

Der Wert von ptr ist völlig unabhängig von der Größe des Zielarrays. Er bestimmt die Startposition des nächsten "Wortes" (weil das auch mehrere Zeichen sein können). Das abschließende '\0' für das aktuelle Wort setzt strtok selbst (es verändert die Quellzeichenkette!), so dass immer eine gültige Zeichenkette vorhanden ist (eine leere Zeichenkette ist gültig).

Der TO muss einen eigenen Index für die Position, an die er die Zahl (atoi) oder die Zeichenfolge (Länge bestimmen) schreiben will.

Leider hat das Codefragment zu wenig Informationen, um zu erkennen, was der TO wirklich erreichen will.

Gruß Tommy

Edit: Um die Einhaltung der Arraygrenzen muss sich der TO auch noch kümmern.
Edit2: Es kann auch eine ungünstige Formulierung von Dir gewesen sein.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 19:36 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2019 19:37 von mega-hz.)
Beitrag #5
RE: Brauche Hilfe bei Arrays
(02.07.2019 18:30)Tommy56 schrieb:  @MartinZ: Du liegst völlig falsch mit Deiner Erklärung.

Der Wert von ptr ist völlig unabhängig von der Größe des Zielarrays. Er bestimmt die Startposition des nächsten "Wortes" (weil das auch mehrere Zeichen sein können). Das abschließende '\0' für das aktuelle Wort setzt strtok selbst (es verändert die Quellzeichenkette!), so dass immer eine gültige Zeichenkette vorhanden ist (eine leere Zeichenkette ist gültig).

Der TO muss einen eigenen Index für die Position, an die er die Zahl (atoi) oder die Zeichenfolge (Länge bestimmen) schreiben will.

Leider hat das Codefragment zu wenig Informationen, um zu erkennen, was der TO wirklich erreichen will.

Gruß Tommy

Edit: Um die Einhaltung der Arraygrenzen muss sich der TO auch noch kümmern.

Also mit dem Serial.print(ptr) werden mir die entsprechenden Zahlen angezeigt,
nicht die Adresse auf die der Pointer zeigt.
Es können/werden nicht mehr als 32 eingegeben werden, also passt die Arraygröße von CH[] mit 33.
wandelt evt. der Befehl Serial.print() schon irgendwie die Ausgabe?

Ich gebe ein: OPEN(@1,2,7,8,11) und bekomme durch das Serial.print die Ausgabe
1
2
7
8
11

Diese sollen in CH[hier] übernommen werden um Kanäle 1,2,7,8,11 zu öffnen.
Mit Atoi ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 19:42 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2019 19:44 von Tommy56.)
Beitrag #6
RE: Brauche Hilfe bei Arrays
Wenn Du Serial.println(ptr); machst, gibst Du die (Teil-)Zeichenkette aus, auf die ptr zeigt.
Sind die Zahlen, die Du überträgst sicher zwischen -128 und 127?

Ja atoi, denn Du musst die Zeichenkette in eine Zahl umwandeln. Die 11, die Du siehst, besteht aus 3 Zeichen ('1','1','\0'). Nähere Infos hier.

Gruß Tommy

Edit: Wenn es Pins sein sollen, wäre der Typ uint8_t besser (u=unsigned) oder byte

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 19:59
Beitrag #7
RE: Brauche Hilfe bei Arrays
(02.07.2019 19:42)Tommy56 schrieb:  Wenn Du Serial.println(ptr); machst, gibst Du die (Teil-)Zeichenkette aus, auf die ptr zeigt.
Sind die Zahlen, die Du überträgst sicher zwischen -128 und 127?

Ja atoi, denn Du musst die Zeichenkette in eine Zahl umwandeln. Die 11, die Du siehst, besteht aus 3 Zeichen ('1','1','\0'). Nähere Infos hier.

Gruß Tommy

Edit: Wenn es Pins sein sollen, wäre der Typ uint8_t besser (u=unsigned) oder byte

nicht direkt Pins, in der set_output Routine wird dann quasi DigitalWrite(K1,CH[1],HIGH); geschaltet wobei K1 mit der echten Pinnummer definiert ist.

Und ja, die Zahlen liegen garantiert nur zwischen 1 und 32.

>>Die 11, die Du siehst, besteht aus 3 Zeichen ('1','1','\0')

d.h. eine 7 wäre auch eine 7+'\0' also 2 zeichen?
dann müssten die ergebnisse um eins gekürzt werden?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 20:07
Beitrag #8
RE: Brauche Hilfe bei Arrays
(02.07.2019 19:59)mega-hz schrieb:  d.h. eine 7 wäre auch eine 7+'\0' also 2 zeichen?
dann müssten die ergebnisse um eins gekürzt werden?
Du hast den Unterschied zwischen Zeichen, Zeichenketten und Zahlen nicht begriffen.

'7' ist das Zeichen 7, die Byterepräsentation ist 0x37
7 als Zahl ist als Byte 0x7

"11" als Zeichenkette ist als Byterepräsentation 0x31,0x31,0x0
11 als Zahl ist als Byte 0xB

Dir hilft kein Kürzen, Du musst Umwandeln und langsam mal die einfachsten Grundlagen lernen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  433Mhz RX + LED Matrix = Hilfe?! Till1 36 904 10.12.2019 13:42
Letzter Beitrag: Tommy56
  Anfänger braucht Hilfe Schrittmotorsteuerung für den Hund dg8ngj 4 506 25.08.2019 17:00
Letzter Beitrag: dg8ngj
  Hilfe für Kita-Projekt gesucht. cyberiss 8 1.156 06.08.2019 07:57
Letzter Beitrag: Der Hobbyelektroniker
  Hilfe benötigt bei der folgenden Aufgabe hanneswave 10 1.152 01.07.2019 18:08
Letzter Beitrag: Wochenendprogrammierer
  Oled 0.91 wechselnde Anzeige . Benötige hilfe MotD 6 1.153 24.03.2019 22:48
Letzter Beitrag: Bitklopfer
  Simon Says bzw. Senso - Spiel bitte Hilfe Riddle 3 935 15.03.2019 13:46
Letzter Beitrag: Tommy56
  Arbeiten mit Arrays Jan99 23 2.104 08.03.2019 10:10
Letzter Beitrag: MicroBahner
  Hilfe benötigt beim Verknüpfen von Klassen Batucada 7 1.050 02.03.2019 23:47
Letzter Beitrag: georg01
  Hilfe bei Formulierung der Frage Matt 3 1.034 23.02.2019 12:45
Letzter Beitrag: Tommy56
  Hilfe bei Fehlermeldung Badboy89 9 1.465 13.02.2019 15:23
Letzter Beitrag: Tommy56

Gehe zu:


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