Fehlersuche

Sorry, ich dachte in diesem Thread geht es immer noch um

error: expected primary-expression before '[' token

... den du wohl wegbekommen würdest, wenn du eine Variable

Pixel pixel[8][8];

oder meinetwegen evtl. sogar

pixel pixel[8][8]; // Klasse und Variable haben denselben Namen, damit es nicht so einfach ist

richtig definieren würdest. Solche grundlegenden Fragen kläre ich lieber in einem Minimal-Beispiel.

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?

Ja, neee. du irrst nicht und du irrst....

Die Variable ist nicht in dem Namensraum sichtbar, in dem sie verwendet werden soll. Dort wird nur der Type gesehen. Darum der Fehler.

Es gelten weder Java, noch Arduino Regeln. Sondern die C++ Spezifikation.

Und natürlich auch die "weichen" Regeln. Die StyleGuidelines

Entweder gewöhnst du dich daran, und betrachtest das als Feature, oder du verzweifelst und fluchst.

Suchs dir aus: Glück, oder Leid. Es ist deine Wahl!

Übrigens: Wenn du dich daran gehalten hättest, dann würde es DIESES Problem hier nicht geben. Zumindest eine andere Meldung.

Nachtrag: (weil der vorherige Beitrag evtl. nicht ausführlich genug war)

Dein Fehler in display.cpp: Du geschrieben

void show()
{
// .........

Du meinst aber:

void display::show()
{
// .........

michael_x: ... Solche grundlegenden Fragen kläre ich lieber in einem Minimal-Beispiel. ...

Da haben wir's wieder. Die Klasse Display in den Hauptsketch zu übernehmen, würde ihn länger machen. Vielleicht compiliert er dann aber.

Dann wird bemängelt, dass der Sketch lang und unübersichtlich ist.

Irgendwas ist doch immer :-)

Gruß

Gregor

Vielleicht compiliert er dann aber.

Oder stattdessen eine Klasse TestPixel, mit der du deinem Problem auf die Spur kommen kannst...

combie: Es gelten weder Java, noch Arduino Regeln. Sondern die C++ Spezifikation.

Ja, wobei das Arduino-C++ und ISO-C++ unterschiedliche Dinge sind. Ich bin halt eher ISO-C++ gewohnt. In ISO-C++ ist

pixel pixel[5];

kein Problem. Aber danke für den Hinweis auf display::show(). Es ist immer wieder interessant (oder nervig, je nachdem), wie das Hirn, das sich etwas ausgedacht hat, Fehler wegbügelt.

Gruß

Gregor

Ja, wobei das Arduino-C++ und ISO-C++ unterschiedliche Dinge sind.

Wieso das denn? Wer hat dir den Mist denn erzählt? Oder hast du dir das nur ausgedacht?

Der gcc ist ISO C++ plus ein paar Erweiterungen

pixel pixel[5];

kein Problem.

In der Arduino Welt auch nicht! (wenn man auf die korrekten Sichtbarkeiten/Gültigkeitsbereiche achtet)

Es ist nur eine schlampige Arbeit des Programmierers. Und diese Schlampigkeit verdeckt die richtige, die aussagekräftige, Meldung.

Das Ei mit den Sichtbarkeiten hast du dir selbst gelegt,

display::show(). Dazu noch die Schlampigkeit mit dem Klassenbezeichner, und die Meldung führt in die Irre. Und zu Fehlschlüssen in deinem Hirn.

Grundsätzlich: Wer die Style Guidelines missachtet, nagelt sich selber eine Frikadelle ans Knie. Es gibt ja Gründe für diese Guidelines, und einen davon hast du jetzt gefunden.

Also nochmal: (im klartext) Dein Programm, so wie du es gepostet hast, kompiliert perfekt, wenn man an der einen Stelle das display:: hinzufügt. Dass pixel pixel[5]; nicht funktioniert ist eine Falschaussage von dir.

Besser wäre natürlich wenn die Klasse nicht pixel, sondern Pixel heißt. Dann wäre die Meldung aussagekräftiger und du hättest den Fehler sicherlich selber gefunden.

combie: Wieso das denn? [Arduino-C++ != ISO-C++] Wer hat dir den Mist denn erzählt? Oder hast du dir das nur ausgedacht?

Der gcc ist ISO C++ plus ein paar Erweiterungen

Arduino-C++ ist kein ISO-C++ (schreibst Du ja selber, „...plus ein paar Erweiterungen“). In ISO-C++ wirst Du z. B. keinen Datentyp finden, der „byte“ heißt. Ich brauche niemanden, der mir das erzählt und ausgedacht habe ich mir das auch nicht.

Gruß

Gregor

In ISO-C++ wirst Du z. B. keinen Datentyp finden, der „byte" heißt.

Der Gcc kennt den Datentype byte auch nicht.
byte ist keine Spracherweiterung.

Er wird in Arduino.h definiert. Zeile 126

typedef uint8_t byte;

Dein Argument ist damit widerlegt.
Und es ist damit belegt, dass du dir das nur ausgedacht hast.

Aber ok, offensichtlich bist du schon etwas angepisst…
Also, wenn du dabei bleiben möchtest, werde ich dich ab jetzt mit deinen falschen Annahmen alleine lassen.

Grundsätzlich habe ich nichts dagegen, wenn du auf mich sauer bist.
Auch nicht, wenn du lieber im Irrtum verharren möchtest.

Aber wenn du hier im Forum den Mist dann ausbreitest, dann gibts Kontra.
Denn weiter verbreiten, wollen wir diese Irrtümer dann doch nicht, oder?

combie: byte ist keine Spracherweiterung.

Du willst Haare spalten. Darauf habe ich keinen Bock.

Gruß

Gregor

PS: In ISO-C++ gibt es new() und delete(). Wenn es die im Arduino-C++ gäbe, gäbe es auch die STL. Die gibt es aber nicht. Wieso denn bitte?!

Und du stellst Falschbehauptungen auf. Darauf habe ich keinen Bock.

Behalte sie für dich, dann ist gut, ansonsten Kontra.

combie: Und du stellst Falschbehauptungen auf.

Wo?

Gruß

Gregor

Wo?

hier z.B.

PS: In ISO-C++ gibt es new() und delete(). Wenn es die im Arduino-C++ gäbe....

Gegenbeweis:

void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");
  double* zeiger = new double(47.11);
  Serial.println(*zeiger);
  delete zeiger; 
  zeiger = nullptr;
}

void loop() 
{

}

Und:

Ja, wobei das Arduino-C++ und ISO-C++ unterschiedliche Dinge sind. Ich bin halt eher ISO-C++ gewohnt. In ISO-C++ ist

pixel pixel[5];

kein Problem.

Auch mit Arduino ist das kein Problem. Man muss nur sorgfältig arbeiten. Und das hast du nicht getan, darum die Meldung. Jeder andere C++ Kompiler würde dir das auch um die Ohren hauen.

Und:

Arduino-C++ ist kein ISO-C++

Falsch.

combie:
Gegenbeweis:

void setup() 

{
 Serial.begin(9600);
 Serial.println(“Start”);
 double* zeiger = new double(47.11);
 Serial.println(*zeiger);
 delete zeiger;
 zeiger = nullptr;
}

void loop()
{

}

Das compiliert ohne Fehlermeldung. Interessant. New() und delete() sind jedoch nicht in der Referenz erwähnt und ein #include und #include <vector.h> erzeugen Fehlermeldungen. Die STL gibt es demnach wohl nicht.

Gruß

Gregor

New() und delete() sind jedoch nicht in der Referenz erwähnt

In der Arduino Referenz sind nur ein paar Sprachmittel erwähnt.
Für den Rest wird man die ISO C++ Spezifikation zu Rate ziehen müssen.

Die Arduino Referenz ist kein C++ lern Tutorial.

und ein #include und #include <vector.h> erzeugen Fehlermeldungen. Die STL gibt es demnach wohl nicht.

Gibt es nicht.
Sie ist aber auch nicht Bestandteil der C++ Spezifikation an sich.

Aus anderen Quellen, kann man sich die STL auch auf den Arduino pumpen. Suche bei Github.
Dann tuts auch dein vector

Die Gründe, welche gegen die STL auf AVR sprechen sind vielfältig.
Aber, dass der AVR-GCC nicht standardkonform wäre, das gehört nicht dazu.

Der ESP, hat die STL dabei…

combie: Die Arduino Referenz ist kein C++ lern Tutorial.

Das habe ich ja auch nicht behauptet. Eine Referenz ist IMO grundsätzlich etwas Anderes als ein Tutorial.

combie: Der ESP, hat die STL dabei....

Der benutzt vermutlich auch nicht die avr-libc.

Gruß

Gregor

New() und delete() sind jedoch nicht in der Referenz erwähnt

Ja, und das ist gut so.

Erstmal ist new ein Operator. Eine Funktion new() gibt es in C++ und deren üblichen Runtime Libraries nicht.

Zweitens ist vieles in der Referenz der "Arduino-Sprache" :) nicht erwähnt, was der avr-gcc Compiler kann und was in den verwendeten Libraries definier tist, intern durchaus verwendet wird, und jedem zur Verfügung steht. (Nicht nur combies Lieblingsspielzeug yield() )

Schon wer sich generell für Zeiger und Referenzen interessiert (nicht nur im Zusammenhang mit new), muss weiter lesen, da gibt es absichtlich fast nichts in der Arduino Referenz.

Immerhin ist alles bei Arduino Open Source, da ist eine Referenz der reinste Luxus.


Zwar ist die "Reference" kein Tutorial, aber eine echte Referenz ist es auch nicht. Dafür ist zuviel "Grundsätzliches C++ für Arduino-Künstler" als vereinfachtes Lehrmaterial drin, und absichtlich zu wenig "Komplett-Referenz".

michael_x: Ja, und das ist gut so. [dass new() und delete() nicht in der Referenz erwähnt sind]

Das kann man unterschiedlich sehen. Ich finde, dass in einer Referenz alles erwähnt sein sollte, was in einer Sprache möglich ist.

michael_x: Immerhin ist alles bei Arduino Open Source, da ist eine Referenz der reinste Luxus.

Nach dem Motto „einem geschenkten Gaul guckt man nicht ins Maul“?

Gruß

Gregor

Das kann man unterschiedlich sehen. Ich finde, dass in einer Referenz alles erwähnt sein sollte, was in einer Sprache möglich ist.

Es sollten alle Funktionen und anderes Zeugs, was in dem Arduino Framework definiert wird Erwähnung finden. Und das wird auch gemacht! (nur yield(), da hat sich noch keiner drum gekümmert)

Die Arduino Referenz, ist also eher als Frameworkreferenz zu verstehen und keine C++ Sprachreferenz. OK, kannst du anders sehen, ist aber neben der Realität, und hilft dir auch nicht aufs Pferd.

Ein vollständiges Abdrucken der C++ Sprachreferenz ist unsinnig. 1. Sie müsste aktuell gehalten werden (wir hatten gerade eben den Hüpfer auf C++11) 2. Findet man das in jedem (guten) C++ Buch. 3. Redundante Information neigt dazu widersprüchlich zu werden. Und dann geht das Geschrei wieder los.

Nebenbei: Die Referenz kann auch von dir geändert werden. Also lass dich nicht aufhalten. Erweitere sie. Nicht schimpfen, sondern tu was.

combie: Nicht schimpfen, sondern tu was.

Wo bitte schimpfe ich?! Ich äußere eine Meinung. Das ist ein Unterschied.

Gruß

Gregor