ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino
Brauche Hilfe bei Arrays - Druckversion

+- ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino (https://www.arduinoforum.de)
+-- Forum: Arduino-Allgemein (/arduino-Forum-Arduino-Allgemein)
+--- Forum: Programmierung (/arduino-Forum-Programmierung)
+--- Thema: Brauche Hilfe bei Arrays (/arduino-Thread-Brauche-Hilfe-bei-Arrays)

Seiten: 1 2 3


Brauche Hilfe bei Arrays - mega-hz - 02.07.2019 15:23

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.


RE: Brauche Hilfe bei Arrays - Tommy56 - 02.07.2019 15:29

Der Arrayzugriff CH[zahl] verlangt als Index eine Zahl, keinen Pointer. ptr zeigt auf den Anfang des nächsten Wortes.

Gruß Tommy


RE: Brauche Hilfe bei Arrays - MartinZ - 02.07.2019 18:19

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


RE: Brauche Hilfe bei Arrays - Tommy56 - 02.07.2019 18:30

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


RE: Brauche Hilfe bei Arrays - mega-hz - 02.07.2019 19:36

(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 ?


RE: Brauche Hilfe bei Arrays - Tommy56 - 02.07.2019 19:42

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


RE: Brauche Hilfe bei Arrays - mega-hz - 02.07.2019 19:59

(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?


RE: Brauche Hilfe bei Arrays - Tommy56 - 02.07.2019 20:07

(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