Fehlersuche

Hallo zusammen!

Ich schreibe gerade einen Sketch neu und habe eine Fehlermeldung bekommen, die ich nicht beseitigen kann. Wahrscheinlich bin ich immer noch ein Anfänger. Was soll's, meine Seiten im Netz sind scheinbar nützlich.

Die Fehlermeldung lautet

error: expected primary-expression before '[' token

Und der entsprechende Codeteil sieht so aus:

void show()
{
  for(byte i=0; i<=minBrightness; i++)
  {
    for(byte y=0; y<7; y++) // Achtung!
    {
      for(byte x=0; x<7; x++) // Achtung!
      {
        if ( pixel[x][y].getBrightness() > i) // <-------------------------------
        { digitalWrite(colPins[x], HIGH); }
        else
        { digitalWrite(colPins[x], LOW); }
      }
      digitalWrite(rowPins[y], HIGH);
      delayMicroseconds(800);
      digitalWrite(rowPins[y], LOW);
      for(byte x=0; x

Das ist eine Funktion, mit der ich eine 7x7-Matrix von LEDs ansteuere, um sie einmal blinken zu lassen. Da loop() ziemlich fix ist, genügt das zunächst. Die Zeile, die den Fehler erzeugt, ist gekennzeichnet.

Sorry, dass ich Euch mit dieser Fehlermeldung belästige. Ich sehe sie nun schon seit zwei Tagen und das nervt nicht wenig.

Gruß

Gregor

Bist du dir sicher das es nur in diesem Codeteil ist. Der Compiler ist nicht immer so "genau" mit seinen Angaben. Gruß DerDani

Man müßte auch wissen, wie pixel deklariert ist.

Gruß Tommy

Wahrscheinlich bin ich immer noch ein Anfänger.

Ja. :smiling_imp: Scheint mir auch so. :smiling_imp: Ein erfahrener Programmierer, wüsste, dass die Helfer testbaren Code sehen möchten. Beim reduzieren auf ein testbares Beispiel würde (einem erfahrenem Programmierer) der Fehler selber auffallen. ohne Gewähr

Man müßte auch wissen, wie pixel deklariert ist

Wieso "auch" ?

Das ist die einzige ( bzw. allererste ) Frage.

Beim reduzieren auf ein testbares Beispiel würde (einem erfahrenem Programmierer) der Fehler selber auffallen.

void test () {
    for(byte y=0; y<7; y++)  {
      for(byte x=0; x<7; x++)   {
          Serial.print(pixel[x][y].getBrightness());
      }
       Serial.println();
    }
}

Das wäre erstmal genug, und würde funktionieren, wenn pixel richtig definiert wäre.

Tommy56: Man müßte auch wissen, wie pixel deklariert ist.

// pixel.h

#ifndef PIXEL_H
#define PIXEL_H

#include 

class pixel
{
  private:
    byte brightness; // aktuelle Helligkeit
  public:
    pixel():brightness(0) {};
    bool setBrightness(byte);
    byte getBrightness();
};

#endif

// eof
// pixel.cpp

#include "pixel.h"

bool pixel::setBrightness(byte b_)
{
  if(b_ <= 16) // Achtung! Siehe Hauptsketch!
  { brightness=b_; return(true); }
  else
  { return(false); }
}

byte pixel::getBrightness()
{
  return(brightness);
}

// eof

Danke schonmal!

Gregor

michael_x: Wieso "auch" ?

Das auch bezog sich auf die Aussage vor meinem Posting. Mann, bist du derzeit mal wieder pingelig.

Gruß Tommy

@Gregor: Bei Dir wird pixel als Array angesprochen, in den Codebeispielen ist es eine Klasse und von Dir gibt es wieder nur Fragmente, keinen Link zur Lib, ... .

Gruß Tommy

Tommy56: ... wieder nur Fragmente, keinen Link zur Lib, ... .

Ein Link zu Arduino.h?!

Gruß

Gregor

Nö, ich vermutete, dass pixel.h größer ist.

Gruß Tommy

Tommy56:
Willst Du uns jetzt verarschen oder kannst Du Dein eigenes Geschreibsel nicht mehr lesen?

#include "pixel.h"

Nein, wenn ich hier jemanden verarschen möchte, dann nur Dich :slight_smile:

Ich teile den aktuellen Sketch in Tabs ein, in dem es .h und .cpp Tabs gibt. pixel.h steht wie pixel.cpp in #5

Gruß

Gregor

PS: Alle Dateien des Sketches im Anhang

_180708_wunderlampe_II_0_1.ino (891 Bytes)

display.cpp (1.3 KB)

display.h (868 Bytes)

pixel.cpp (246 Bytes)

pixel.h (252 Bytes)

class pixel

Das ist der Anfang des Problems: pixel ist eine Klasse, du verwendest es aber als Variable.

Üblicherweise bekommen Klassen einen Namen, der mit einem Großbuchstaben anfängt, und Variablennamen fangen mit einem Kleinbuchstaben an. Also

class Pixel {};

Pixel pixel[8][8]; //  pixel sind 64 Elemente der Klasse Pixel

Das mit der Groß/Kleinschreibung ist natürlich nur ein Vorschlag, aber den Unterschied zwischen Klasse und Variable musst du schon (irgendwie) machen

michael_x:
Das ist der Anfang des Problems: pixel ist eine Klasse, du verwendest es aber als Variable.

Üblicherweise bekommen Klassen einen Namen, der mit einem Großbuchstaben anfängt, und Variablennamen fangen mit einem Kleinbuchstaben an.

Seit wann kann ich eine Variable nicht benennen wie eine Klasse? Ist das eine der Spezialitäten von Arduino (Java?)? Der Compiler sollte doch merken, wann eine Variable und wann ein Typ gemeint ist, oder nicht?

Gruß

Gregor

Bezeichnungen müssen eindeutig sein, egal was sie bedeuten.

Gruß Tommy

Edit: Auch wenn das technisch evtl. gehen sollte, ist es nicht gut für die Übersicht.

Seit wann kann ich eine Variable nicht benennen wie eine Klasse?

Da hast du tatsächlich recht, auch wenn ich das für großen Mist halte.

Aber, hast du eine Variable so benannt wie deine Klasse?

combies Schelte steht noch !

michael_x:
Da hast du tatsächlich recht, auch wenn ich das für großen Mist halte.

Aber, hast du eine Variable so benannt wie deine Klasse?

Ja, dieser Fehler taucht vermutlich irgendwo weiter unten in der Liste auf. Ich arbeite Fehlermeldungen immer von oben ab.

michael_x:
combies Schelte steht noch !

Die mit dem testbaren Code? Ich habe alle Dateien des Sketches als PS an #10 angeklebt.

Gruß

Gregor

Die mit dem testbaren Code? Ich habe alle Dateien des Sketches als PS an #10 angeklebt.

habe eine Fehlermeldung bekommen, die ich nicht beseitigen kann

Dann schmeiss doch einfach mal drei Viertel des Sketches weg.

Wenn du z.B. display.h rausschmeisst und deinen Sketch entsprechend verkleinerst, und der Fehler sollte weg sein, hättest du viel gewonnen. Dann könntest du woanders suchen. Wenn der Fehler noch da ist, würde sich die Chance, dass jemand das Zeug anschaut, erhöhen.

combie: Beim reduzieren auf ein testbares Beispiel würde (einem erfahrenem Programmierer) der Fehler selber auffallen.

michael_x: Wenn du z.B. display.h rausschmeisst und deinen Sketch entsprechend verkleinerst, und der Fehler sollte weg sein, hättest du viel gewonnen. Dann könntest du woanders suchen. Wenn der Fehler noch da ist, würde sich die Chance, dass jemand das Zeug anschaut, erhöhen.

Ich weiß nicht, wie groß die Klasse display noch wird, ich schreibe gerade einen Sketch neu. Ich wollte es zunächst „einfach schön aufgeräumt“ haben. Auch deshalb alles in einzelnen Dateien.

Naja, und das mit dem Lesen ... ich drucke meine Sachen gerne mal aus und lese bei einer Zigarette auf dem Balkon. Da sind kurze Dateien manchmal handlicher. Geschmacksfrage.

Gruß

Gregor

Ich meinte nicht, dass du das komplette display.h statt in eine eigene Datei in die .ino packen sollst. Kleine Dateien sind besser, richtig.

Ich meinte ganz rausschmeissen. Alles weg bis auf die Zeile mit dem "unerklärlichen" Fehler, und nur das notwendigste drin, dass kein anderer Fehler auftritt.

Es geht ja nicht drum zu bewundern wie deine Matrix blinkt, solange der Code nicht mal compiliert.

michael_x: Es geht ja nicht drum zu bewundern wie deine Matrix blinkt, solange der Code nicht mal compiliert.

Wie gesagt, ich schreibe einen Sketch (der funktioniert) neu. Das Geblinke habe ich ständig vor Augen. Wobei Geblinke eh ein falscher Begriff ist, ich meine Bildwiederholrate. Der neue Code compiliert noch nicht, was halt gerade nervt. Wo hattest Du eigentlich einen Fehler gesehen? Ich weiß gar nicht mehr, welche Korrektur in meinem Code auf wessen Hilfe zurückgeht.

Gruß

Gregor