Anfängerfehler



  • Scarabol schrieb:

    Im Moment funktioniert es, daher mal ne kleine Zwischenfrage:

    Ich habe eine Funktion connect aus der WinSock.h und eine Klasse network die selber eine Funktion connect hat aber gleichzeitig die Funktion connect der Winsock.h benutzt:

    bool connect()
    {
    connect(...); // hier soll der die connect aus der Winsock nehmen
    }
    

    Wie kann ich entscheiden welche Funktion der Compiler benutzt?
    Muss ich einen Namespace benutzen? Geht es auch ohne?

    MfG
    Scarabol

    Ich denke, mit ::connect() müsstest du die Funktion aus dem globalen Namespace, also in dem Fall aus winsock.h nutzen können.



  • Danke, funktioniert.

    MfG
    Scarabol



  • Falscher Alarm funktioniert leider doch nicht er bentutz trotzdem die Funktion der Klasse nur das jetzt keine Fehlermeldung mehr kommt...

    MfG
    Scarabol



  • char buffer[1024];
    
    sizeof(buffer); // liefert das gewünschte Ergebnis 1024
    
    funktion(char *buffer)
    {
    sizeof(buffer); // liefert das "richtige" Ergebnis von 4
    sizeof(*buffer); // liefert 1 - Woher???
    // Wie kann ich jetzt hier in der Funktion das gewünschte Ergebnis von oben erzielen, also 1024?
    }
    

    MfG
    Scarabol



  • Scarabol schrieb:

    char buffer[1024];
    
    sizeof(buffer); // liefert das gewünschte Ergebnis 1024
    
    funktion(char *buffer)
    {
    sizeof(buffer); // liefert das "richtige" Ergebnis von 4
    sizeof(*buffer); // liefert 1 - Woher???
    // Wie kann ich jetzt hier in der Funktion das gewünschte Ergebnis von oben erzielen, also 1024?
    }
    

    MfG
    Scarabol

    Die Größe kannst du so gar nicht herausfinden, da die Funktion ja lediglich einen Zeiger auf ein Array bekommt, kein Array. Du musst die Größe als weiteren Parameter der Funktion mitgeben. Das ist auch der übliche Weg.



  • ok, danke.

    MfG
    Scarabol



  • Hallo,

    ich hab nochmal ne Frage zu Headern (.h) und deren Code anhängseln (.cpp)

    Also ich hab einen Header math.h und eine Datei math.cpp beide sind mit dem Projekt verknüpft. math.h als Headerdatei und math.cpp als Quelldatei.
    1. Wozu bzw. wann muss ich die Dateien im Projektmappen Explorer verknüpfen? Ich füge die Header ja z.B. mit #include math.h bereits in den Quellcode ein???

    Das führt mich zu Frage 2:
    Wenn ich in math.cpp die Klasse aus sin.h benötige muss ich dann:
    math.h

    #include sin.h
    bla bla
    

    a)
    math.cpp

    #include math.h
    #include sin.h
    bla bla
    

    oder b)
    math.cpp

    #include sin.h
    #include math.h
    bla bla
    

    oder c)

    #include math.h // weil #include sin.h steht ja schon in math.h
    

    In der sin.h steht

    #ifndef inc_sin_h
    #define inc_sin_h
    bla bla
    #endif
    

    Das verhindert ja das die Klasse oder Function ect. in sin.h mehrmals definiert wird, aber muss man das grundsätzlich machen? Kann das zu Problemen führen?

    Währe toll wenn mir da einer weiterhelfen könnte, danke.

    MfG
    Scarabol



  • Um zu verhindern, dass du Header mehrmals inkludierst, kannst du folgende Präprozessorstruktur verwenden:

    // math.h
    
    #ifndef MATH_H
    #define MATH_H
    
    // Klassendefinition, etc. hier
    
    #endif
    

    Das wird quasi in jeder Headerdatei gemacht und ist sicher.

    EDIT: Hätte den Post wohl bis zu Ende lesen sollen. 🙂
    Mach das was du schon in sin.h gemacht hast einfach für jede Headerdatei.

    MfG,
    ScRaT



  • Scarabol schrieb:

    ich hab nochmal ne Frage zu Headern (.h) und deren Code anhängseln (.cpp)

    Da hättest du ruhig einen neuen Thread aufmachen können, aber na ja...

    Scarabol schrieb:

    1. Wozu bzw. wann muss ich die Dateien im Projektmappen Explorer verknüpfen? Ich füge die Header ja z.B. mit #include math.h bereits in den Quellcode ein???

    Stimmt, entscheidend ist das include-Statement. Header-Dateien werden nicht kompiliert, sondern Übersetzungseinheiten (.c, .cpp). Per include sorgst du dann dafür, dass der Inhalt eines Headers im Code eingefügt wird (es wird ganz einfach der ganze Text der Datei vor dem Übersetzen dorthin kopiert). Ein Eintrag im Projektmappenexplorer ist eigentlich unnötig, ist aber natürlich eine komfortable Möglichkeit, zum Projekt zugehörige Header-Dateien im Überblick zu behalten und sie schnell öffnen zu können (und daher sehr empfehlenswert).

    Scarabol schrieb:

    Das führt mich zu Frage 2:
    Wenn ich in math.cpp die Klasse aus sin.h benötige muss ich dann...

    Jede Variante wird wohl funktionieren, solange die Header mit include-guards abgesichert sind. Ich würde sogar Variante a oder b bevorzugen.

    Scarabol schrieb:

    Das verhindert ja das die Klasse oder Function ect. in sin.h mehrmals definiert wird, aber muss man das grundsätzlich machen? Kann das zu Problemen führen?

    Ganz im Gegenteil: wenn du die guards weglässt, kann das schnell zu Problemen führen.

    Btw, ist dir klar, dass es schon eine Datei math.h gibt? Einen eigenen Header des gleichen Namens zu erzeugen, ist gar keine gute Idee. Den solltest du umbenennen (myMath.h oder sowas).



  • Morgen,

    Btw, ist dir klar, dass es schon eine Datei math.h gibt? Einen eigenen Header des gleichen Namens zu erzeugen, ist gar keine gute Idee. Den solltest du umbenennen (myMath.h oder sowas).

    Vielen dank für den Hinweis ich muss euch leider sagen das meine Headerdateien nicht sin.h und math.h heißen aber sonst ist das so schwer zu erklären und keiner kann sich was vorstellen, also sorry 😉

    MfG
    Scarabol



  • Scarabol schrieb:

    Vielen dank für den Hinweis ich muss euch leider sagen das meine Headerdateien nicht sin.h und math.h heißen aber sonst ist das so schwer zu erklären und keiner kann sich was vorstellen, also sorry 😉

    Du unterschätzt die Inelligenz und Vorstellugnskraft der Leute hier im Forum 😉 Poste Code und Namen so wie sie bei dir stehen, am Besten per Copy&Paste, dann wirst du nur auf die wirklichen Tippfehler und Namensfehler hingewiesen, nicht auf die Fehler, die du beim Umbenennen gemacht hast. Das spart Zeit für alle.


Anmelden zum Antworten