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:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Library Fehler
19.01.2021, 16:57
Beitrag #1
Library Fehler
Hallo,
ich versuche zum ersten Mal, eine Library zu erzeugen und laufe prompt auf einen Fehler:
prototype for 'int ledsteuerung::setBit(byte, byte*)' does not match any in class 'ledsteuerung'
Ich verstehe auch die Fehlermeldung nicht.

Hier mein Code zum testen:
Code:
// ----------------------------------------------------------------------------------
#include "ledsteuerung.h"

void setup() {
  byte x[32];                                                 // 256 bit-Einstellungen für LEDs
  for (byte i=0;i<32;i++){
    x[i] = 0;
  }
  Serial.begin(9600);
  Serial.println("start");

  ledsteuerung.setBit(10, x);
  ledsteuerung.setBit(11, x);
  ledsteuerung.setBit(12, x);
  for (byte i=0; i<20; i++) {
    Serial.print(ledsteuerung.readBit(i, x));
  }
  Serial.println();
  ledsteuerung.clearBit(11, x);
  for (byte i=0; i<20; i++) {
    Serial.print(ledsteuerung.readBit(i, x));
  }
  Serial.println();

}

void loop() {
  // put your main code here, to run repeatedly:

}

Hier die Header-Datei:
Code:
/*
  Dies ist eine Library .h
*/
#ifndef ledsteuerung_h
#define ledsteuerung_h

#include <Arduino.h>

class ledsteuerung {
  public:
    ledsteuerung();
    void setBit(byte nr, byte* feld);
    void clearBit(byte nr, byte* feld);
    byte readBit(byte nr, byte* feld);
    
  private:
};

#endif

Und hier schießlich die cpp-Datei:
Code:
/*
  Dies ist eine Library .cpp
*/
#include <Arduino.h>
#include "ledsteuerung.h"

//------------------------- Bit für "LED einschalten"  setzen -----------------------
ledsteuerung::setBit(byte nr, byte* feld) {
  byte feldIndex = 0;
  byte feldNr = nr;
  while(feldNr > 7) {                                       // 32 Bytes beinhalten 256 LED-Stati
    feldNr -= 8;                                            // herunterzählen, bis zwischen 0 und 7
    feldIndex++;                                            // Nummer des Bytes
  }
  bitSet(feld[feldIndex], feldNr);                          // hier wird das Bit feldNr im Byte feldIndex gesetzt
}

//------------------------- Bit für "LED ausschalten"  löschen ----------------------
ledsteuerung::clearBit(byte nr, byte* feld) {
  byte feldIndex = 0;
  byte feldNr = nr;
  while(feldNr > 7) {                                       // 32 Bytes beinhalten 256 LED-Stati
    feldNr -= 8;                                            // herunterzählen, bis zwischen 0 und 7
    feldIndex++;                                            // Nummer des Bytes
  }
  bitClear(feld[feldIndex], feldNr);                        // hier wird das Bit feldNr im Byte feldIndex gelöscht
}


//-------------------------------- Bit für LED nr lesen -----------------------------
ledsteuerung::readBit(byte nr, byte* feld) {
  byte feldIndex = 0;
  byte feldNr = nr;
  while(feldNr > 7) {                                       // 32 Bytes beinhalten 256 LED-Stati
    feldNr -= 8;                                            // herunterzählen, bis zwischen 0 und 7
    feldIndex++;                                            // Nummer des Bytes
  }
  return bitRead(feld[feldIndex], feldNr);                  // Bit feldNr im Byte feldIndex wird zurückgegeben
}

Was mache ich falsch?

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2021, 17:08 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2021 17:17 von MicroBahner.)
Beitrag #2
RE: Library Fehler
Zum einen fehlen in deiner .cpp Datei bei den Methodendefinitionen die Typen. ( void, byte ) wie in der Declaration im .h File.

Zum anderen sehe ich nicht, dass Du ein Klassenobjekt erzeugst bevor Du darauf zugreifst. Du must zuerst ein Objekt deiner Klasse erzeugen, bevor Du damit arbeiten kannst. Das geht nicht direkt mit dem Klassennamen.

Edit: In deiner Klassendefinition fehlt auch noch der Konstruktor ( auch wenn er in deinem Fall leer ist, muss er da sein ).

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2021, 17:14 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2021 17:15 von Tommy56.)
Beitrag #3
RE: Library Fehler
(19.01.2021 16:57)Karl Stanger schrieb:  Was mache ich falsch?
Nicht direkt falsch, aber gewöhne Dir am Besten gleich von Anfang an die verbreitete Schreibweise an:

Klassennamen beginnen mit einem Großbuchstaben, Variablen, Funktionsnamen und Methodennamen mit einem Kleinbuchstaben.

Ein Tutorial zu den Grundlagen von C++ oder ein entsprechendes Buch würde Dir den Einstieg auch erleichtern.

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
19.01.2021, 18:23
Beitrag #4
RE: Library Fehler
Nachdem ich die angemerkten Fehler korrigiert hatte, erhielt ich immer noch eine Fehlermeldung:
request for member 'setBit' in 'steuerung', which is of non-class type 'Ledsteuerung()'
Ich habe dann noch weiter gesucht und gefunden, dass ich auf das "most vexing parse problem" hereingefallen bin:
Wenn ich eine Instanz einer Klasse mit einem leeren Konstruktor erzeuge, muss die Instanz auch wirklich leer sein:
Code:
Ledsteuerung steuerung();
ist falsch
Es muss
Code:
Ledsteuerung steuerung;
heißen
Hier nochmal der Code zum testen:
Code:
// ----------------------------------------------------------------------------------
#include "ledsteuerung.h"

Ledsteuerung steuerung;

void setup() {
  byte x[32];                                                 // 256 bit-Einstellungen für LEDs
  for (byte i=0;i<32;i++){
    x[i] = 0;
  }
  Serial.begin(9600);
  Serial.println("start");

  steuerung.setBit(10, x);
  steuerung.setBit(11, x);
  steuerung.setBit(12, x);
  for (byte i=0; i<20; i++) {
    Serial.print(steuerung.readBit(i, x));
  }
  Serial.println();
  steuerung.clearBit(11, x);
  for (byte i=0; i<20; i++) {
    Serial.print(steuerung.readBit(i, x));
  }
  Serial.println();

}

void loop() {
  // put your main code here, to run repeatedly:

}
Dann die Header-Datei:
Code:
/*
  Dies ist eine Library .h
*/
#ifndef Ledsteuerung_h
#define Ledsteuerung_h

#include <Arduino.h>

class Ledsteuerung {
  public:
    Ledsteuerung();
    void setBit(byte nr, byte* feld);
    void clearBit(byte nr, byte* feld);
    byte readBit(byte nr, byte* feld);
    
  private:
};

#endif
Und schließlich die cpp-Datei:
Code:
/*
  Dies ist eine Library .cpp
*/
#include <Arduino.h>
#include "Ledsteuerung.h"

//------------------------------------ Konstruktor ----------------------------------
Ledsteuerung::Ledsteuerung() {
// jetzt noch leer
};

//------------------------- Bit für "LED einschalten"  setzen -----------------------
void Ledsteuerung::setBit(byte nr, byte* feld) {
  byte feldIndex = 0;
  byte feldNr = nr;
  while(feldNr > 7) {                                       // 32 Bytes beinhalten 256 LED-Stati
    feldNr -= 8;                                            // herunterzählen, bis zwischen 0 und 7
    feldIndex++;                                            // Nummer des Bytes
  }
  bitSet(feld[feldIndex], feldNr);                          // hier wird das Bit feldNr im Byte feldIndex gesetzt
}

//------------------------- Bit für "LED ausschalten"  löschen ----------------------
void Ledsteuerung::clearBit(byte nr, byte* feld) {
  byte feldIndex = 0;
  byte feldNr = nr;
  while(feldNr > 7) {                                       // 32 Bytes beinhalten 256 LED-Stati
    feldNr -= 8;                                            // herunterzählen, bis zwischen 0 und 7
    feldIndex++;                                            // Nummer des Bytes
  }
  bitClear(feld[feldIndex], feldNr);                        // hier wird das Bit feldNr im Byte feldIndex gelöscht
}


//-------------------------------- Bit für LED nr lesen -----------------------------
byte Ledsteuerung::readBit(byte nr, byte* feld) {
  byte feldIndex = 0;
  byte feldNr = nr;
  while(feldNr > 7) {                                       // 32 Bytes beinhalten 256 LED-Stati
    feldNr -= 8;                                            // herunterzählen, bis zwischen 0 und 7
    feldIndex++;                                            // Nummer des Bytes
  }
  return bitRead(feld[feldIndex], feldNr);                  // Bit feldNr im Byte feldIndex wird zurückgegeben
}

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2021, 19:32
Beitrag #5
RE: Library Fehler
Du verstößt in Deiner Lib so ziemlich gegen alle Grundregeln der objektorientierten Programmierung. Besonders gegen die Kapselung, d.h die Variablen sollten in der Klasse gehalten werden und nur über Methoden der Klasse geändert werden können. Schau Dir mal das Tutorial "Von delay() bis zur Methode" von Rentner aus dem Nachbarforum an und evtl. eine Umsetzung von mir, um Leds in unabhängigen Folgen blinken zu lassen.

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
19.01.2021, 20:28
Beitrag #6
RE: Library Fehler
Das mache ich gerne! Ich will das ja irgendwann einmal können.
Jetzt bin ich zuerst einmal froh, dass überhaupt etwas läuft. Die Kapselung ist dann der nächste Schritt. Meine Lernerfolge stelle ich dann gerne hier vor, um herauszufinden, was noch suboptimal ist.
LG Karl

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2021, 20:57
Beitrag #7
RE: Library Fehler
Schau auch mal auf das verlinkte Buch. Mit 12,99€ wirklich ein Schnäppchen. Ich habe es damals für 40€ gekauft und keinen davon bereut. Es hat mir beim Einstig in C++ unheimlich geholfen.

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
19.01.2021, 21:10
Beitrag #8
RE: Library Fehler
Ich hatte das auch erstmal als 'Syntax-Übung' gesehen. Sinn macht die Klasse - so wie sie jetzt ist - natürlich nicht. Da hätten es 3 einfache Funktionen genauso getan.

In einer Klasse stehen die Methoden normalerweise 'in Verbindung', d.h. sie greifen auf einen gemeinsamen Datenpool zurück, der aber von außen nicht zugreifbar ist. Das ist dann die 'Kapselung'. So kann man sicher sein, dass diese internen Daten nur entprechende der Regeln der Methoden verändert werden.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Library von GitHub ? Steinspiel 17 218 Heute 07:15
Letzter Beitrag: amithlon
  PCM Sound Library für RC PKW RC_Trucker_WN 4 240 22.03.2021 21:22
Letzter Beitrag: RC_Trucker_WN
  Fehler durch zwei I2C Busse ? sgol 32 1.683 28.02.2021 18:11
Letzter Beitrag: Tommy56
  Library Ethernet: Nicht zu compilieren GuaAck 5 426 22.02.2021 17:31
Letzter Beitrag: Tommy56
  MAX 30105 Fehler Ansis2021 0 263 20.02.2021 03:26
Letzter Beitrag: Ansis2021
  Fehler lcd does not name a type Yannic.t 3 413 22.12.2020 14:36
Letzter Beitrag: Tommy56
  OneButton Library > erkennen, dass keine Taste gedrückt ist Foto-Ralf 9 875 05.12.2020 17:07
Letzter Beitrag: RolandF
  Mouse.h library Leonardo Schrittmotor 10 962 26.10.2020 21:35
Letzter Beitrag: Chopp
  Nextion Fehler king_MJ 3 1.107 27.06.2020 17:36
Letzter Beitrag: Tommy56
  Eigene Library erstellen Groomit 7 1.188 23.05.2020 22:03
Letzter Beitrag: MicroBahner

Gehe zu:


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