c++ memberfunktion verwenden

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von meckes, 13. Mai 2008 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 13. Mai 2008
    Hi zusammen

    ich steh grad irgendwie ein bisschen aufm Schlauch. Ich hab mir vorgenommen so n kleines Projekt in C++ zu machen. Und jetzt häng ich an nem Problem fest und ich check grad net wieso die Sache nicht läuft.

    Meine IDE ist Code::Blocks unter Debian

    Hier erstmal mein Code, ich hab den mal soweit auskommentiert, dass nur noch der eine wesentliche fehler, der mir Probleme macht auftaucht.

    main.cpp
    Code:
    #include "arguments.h"
    #include "fileFunctions.h"
    #include "device.h"
    
    
    #include <iostream>
    //#include <cstdlib>
    //#include <stdio.h>
    
    using namespace std;
    
    int main(int arg, char *args[]){
     // bool lightOn;
     // int lightShouldOn;
    
     arguments myArgs;
     deviceControll myDevice;
     // fileFunctions myFile;
    
     // später mal zur fehlerausgabe ...
     switch (myArgs.deepArgCheck(args, arg)){
     case 0:
     // Alles OK
     break;
     case 1:
    
     break;
     }
    
    
     // Try to get handle of the Device
     bool tmp;
     tmp = myDevice.OpenDevice(myArgs._prefs.device);
     if (!tmp){
     std::cout << "unable to open device: " << args[1] << std::endl;
     return 2;
     }
    }
    device.h
    Code:
    #ifndef _DEVICE_H_
    #define _DEVICE_H_
    
    #include <sys/ioctl.h>
    #include <fcntl.h>
    #include <unistd.h>
    //#include <string>
    
    
    class deviceControll{
     public:
     bool OpenDevice(std::string);
     void setLightStatus(int);
     bool readLightState();
     int GetDeviceState();
     int InitDevice();
     private:
     int myDeviceHandle;
     bool lightOn;
    };
    
    
    #endif
    device.cpp
    Code:
    #include "device.h"
    
    
    
    bool deviceControll::OpenDevice(std::string myDevice){
     int tmp;
    
     tmp = open(myDevice, O_RDWR);
    
     if(tmp < 0){
     return false;
     }
    
     myDeviceHandle = tmp;
     return true;
    }
    
    
    bool deviceControll::readLightState(){
     bool changed;
     int myState=0;
    
     // Status abfragen
     ioctl(myDevHandle, TIOCMGET, &myState);
    
     // die bits von den beiden ausgängen abschneiden
     myState &= ~(TIOCM_DTR | TIOCM_RTS);
    
     // vergleichen
     if (myState == TIOCM_CAR){
     lightOn = true;
     }
     else{
     lightOn = false;
     }
    
    
     return lightOn;
    }
    
    void deviceControll::setLightStatus(int should){
    
     if ((should != lightOn) && (should != -1)) {
     int myState;
    
     // Herausfinden ob Relais geschaltet ist oder nicht
     ioctl(myDevHandle, TIOCMGET,&myState);
    
     myState &= ~(TIOCM_DTR | TIOCM_RTS);
    
     if (myState == TIOCM_DSR){
     Ausgabe("Relais ausschalten\n");
    
    
     } else {
     Ausgabe("Relais anschalten\n");
    
    
     }
     }
    }
    
    int deviceControll::InitDevice(){
    // noch nix
    }

    Folgender Fehler erscheint beim Versuch zu Compilieren!
    Code:
    obj/Debug/main.o||In function `main':|
    /home/cabbi/Develop/VerySimpleLightSwitch/main.cpp|33|undefined reference to `deviceControll::OpenDevice(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
    ||=== Build finished: 1 errors, 0 warnings ===|
    
    Ich raff nicht wieso des net geht! Diese 3 Argumente die in dem Fehler genannt werden hab ich doch garnie definiert?! xD

    Kann mir einer sagen woran es hängt?

    Danke!
     
  2. 13. Mai 2008
    AW: c++ memberfunktion verwenden

    Hey!

    Die Datei 'device.cpp' zum Projekt (bzw. Linken 'device.o') hinzufuegen.
    Definieren bedeutet nur der anderen Datei die Funktion 'bekannt' machen. Der Entry dafuer muss aber beim Linken zu finden sein (d.h. du brauchst die andere Datei).

    Mfg,

    Kolazomai
     
  3. 13. Mai 2008
    AW: c++ memberfunktion verwenden

    Erstmal Danke für deine Antwort.
    Aber ich versteh nicht ganz wie du meinst. Die .cpp und die .h datei gehören schon zum Projekt, und ne .o Datei hab ich nicht davon. Wenn ich das File einzeln compilieren will, sagt er mir nur "Nothing to be done"

    Aber ich habe auch z.B. bei der arguments.h und arguments.cpp nix extra dazulinken müssen oder ähnliches, und die funktioniert?! (das ist das File indem die Funktion deepArgCheck drin is)

    Gruß
    meckes
     
  4. 13. Mai 2008
    AW: c++ memberfunktion verwenden

    Code:
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >
    Das is ganz einfach zu erklären..

    std::string is einfach nur n typedef auf den Typ von oben.. D.h. wenn du std::string verwendest, nimmst du den typ von da oben.. (sind natürlich templates, der erwartet als parameter den Grundtyp, wo der die Zeichen speichert [z.B. char oder wchar_t], dann ne char_traits-Klasse [regelt z.B. die das endl-Zeichen aussieht] und ne Allokatoren-Klasse [regelt, wie der speicher geregelt wird])
     
  5. 14. Mai 2008
    AW: c++ memberfunktion verwenden

    Okay, was heißt das jetzt im Klartext für mich?

    Von euch hat nicht zufällig jemand Code::Blocks und kann mir zeigen wie man das mit dem miteinbinden der Dateien richtig macht?
    Bzw. wie der aufruf von g++ über die Console aussehen muss. Dann würd ichs mal so Probieren.


    Edit:
    Ich hab mal alles was ich vorhin auskommentiert hab wieder dazugefügt. Und den ganzen Workspace neu gebuildet. Jetzt ist der Fehler an dieser Stelle weg. Jetzt ist er dafür bei einer anderen Stelle xD d.h. an einer Anderen funktion, die in einer anderen Datei ist ... nämlich arguments.cpp

    Hier die Stelle ander er jetzt hängt
    Code:
    int main(int arg, char *args[]){
     bool lightOn;
     int lightShouldOn;
    
     arguments myArgs;
     deviceControll myDevice;
     fileFunctions myFile;
    
     switch (myArgs.deepArgCheck(args, arg)){
     case 0:
     // Alles OK
     break;
     case 1:
    
     break;
     }
    
     // Try to get handle of the Device
     bool tmp;
     tmp = myDevice.OpenDevice(myArgs._prefs.device);
     if (!tmp){
     std::cout << "unable to open device: " << args[1] << std::endl;
     return 2;
     }
    
     // Dateipfade überprüfen wenn webtransfer aktiv
     if (myArgs._prefs.WebTransfer){
     [COLOR=RED] int myTmp = myArgs.exists(myArgs._prefs.myPathForRead);[/COLOR]
    
     if (myTmp != 0){
    
     if(myArgs._prefs.createIfNotExist){
     // Create File
     }
     else {
     std::cout << "Bad Transfer Read-File\n";
     return myTmp;
     }
    
     }
    
     myTmp = myArgs.exists(myArgs._prefs.myPathForWrite.c_str());
     if (myTmp != 0){
     if(myArgs._prefs.createIfNotExist){
     // Create File
     }
     else {
     std::cout << "Bad Transfer Write-File\n";
     return myTmp;
     }
     }
     }
    
     cout << "running ...\n";
    
     // DTR setzen
     myDevice.InitDevice();
    
     // Do des zeugs
     int zaehler=0;
     std::string ausg;
    
     while (true){
    
     // Daten Lesen
     lightOn = myDevice.readLightState();
     lightShouldOn = myFile.getLightShould(myArgs._prefs.myPathForRead);
    
     // Frequenz
     usleep( myArgs._prefs.frequency );
    
     if (!myArgs._prefs.runAsDaemon){
    
     // bildschirm leeren
     system("clear");
    
     // Tatsächlicher Lichtstatus
     cout << "Ist\t" << lightOn;
    
     // Sollstatus
     cout << "Soll\t" << lightShouldOn;
    
     for (int x = 0; x <=zaehler; x++){
     cout << ".";
     }
    
     cout << "\n";
     zaehler++;
    
     if (zaehler > 5){
     zaehler = 0;
     }
     }
    
     myDevice.setLightStatus(lightShouldOn);
     }
    }

    mit dem Fehler:
    Code:
    obj/Debug/main.o||In function `main':|
    /home/cabbi/Develop/VerySimpleLightSwitch/main.cpp|39|undefined reference to `arguments::exists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
    /home/cabbi/Develop/VerySimpleLightSwitch/main.cpp|53|undefined reference to `arguments::exists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
    ||=== Build finished: 2 errors, 0 warnings ===|
    

    Edit2:
    Bei dem Fehler am Anfang weiß ich nicht woran es lag. Aber beim 2. kann ich nur sagen: ICH DEPP ich hatte vergessen den Klassennamen und :: vor die Funktion zu schreiben xD. Dann kann er s ja nicht finden!

    Naja in dem Fall hat sichs erledigt.

    ~Klaused~


    Gruß
    meckes
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.