Fehler: function-definition not allowed before '{'



  • Hallo zusammen,

    ich versuche mich grade an winsock2 unter zunahme einer Anleitung hier im Forum.
    Wenn ich kompilieren möchte (CodeBlocks, GNU GCC Compiler), erhalte ich folgende Fehlermeldung :

    error: a function-definition is not allowed here before '{' token

    Es wird auf folgenden Codeabschnitt gezeigt:

    unsigned short my_htons(unsigned short h)
    {
    
       return (h>>8) | (h<<8);
    
    }
    

    Worin liegt der Fehler ?
    Falls ihr den gesammten Code braucht, sagt bescheid.

    Danke für eure Hilfe !
    Lg
    SalamiDealer



  • Der Code den du gezeigt hast ist in Ordnung. Da muss was an dem Code drumrum stinken.



  • int f(){
    
    unsigned short f(){
    }
    

    gleicher fehler. vielleicht hast du in der vorigen funktion die klammer am ende vergessen.



  • Ich hab mir den Code jetzt eine lange Zeit angeguckt, aber ich finde keinen Fehler. Vielleicht reicht meine Erfahrung da auch nicht aus.

    #include <iostream>
    #include <winsock2.h>
    using namespace std;
    
    int main(){
    
        WSADATA wsaData;
        WORD wVersionRequested = MAKEWORD(2,2);
    
        int result = WSAStartup(wVersionRequested, &wsaData);
    
        if(result != 0){
    
            cout << "Winsock 2 konnte nicht gestartet werden! Error #" << result << endl;
            return 1;
    
        }
    
        cout << "Winsock 2 gestartet" << endl;
    
        int stream = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    
        if (stream == -1){
    
                cout << "Fehler beim erstellen des Socket" << endl;
                return 1;
    
        }
        cout << "Socket erstellt" << endl;
    
        sockaddr_in service;
        service.sin_family = AF_INET;
        service.sin_port   = htons(80);
    
        [b]
        unsigned short my_htons(unsigned short h){
    
            return (h>>8) | (h<<8);
    
        }
        [/b]
    
        string ip;
        cout << "IP: " << endl;
        cin >> ip;
    
        service.sin_addr.s_addr = inet_addr(ip.c_str());
    
        int result2 = connect(stream, reinterpret_cast<sockaddr*>(&service), sizeof(service));
    
        if(result2 == -1){
    
            cout << "Konnte keine Verbindung herstellen" << endl;
            return 1;
    
        }
    
        closesocket(stream);
        cout << "Ende\n";
        return 0;
    }
    


  • definiere die htons vor der main und nicht in der main.



  • Vielleicht reicht meine Erfahrung da auch nicht aus

    japp - beschäftige dich mit grundlagen, bevor du mit winapi und socket-programmierung anfängst...

    bb



  • unskilled schrieb:

    Vielleicht reicht meine Erfahrung da auch nicht aus

    japp - beschäftige dich mit grundlagen, bevor du mit winapi und socket-programmierung anfängst...

    bb

    Da wird wohl was dran sein. Hab mich wohl zu früh in die komplexeren Sachen geworfen 😃

    volkard schrieb:

    definiere die htons vor der main und nicht in der main.

    Das würde ich aber, bevor ich sockets an den Nagel hänge, noch gerne besprochen haben. 😉

    Wie muss ich das jetzt genau machen ?

    So erhalte ich eine Fehlermeldung:

    unsigned short my_htons(unsigned short h);
    
    int main(){
    
        my_htons(h){
    
            return (h>>8) | (h<<8);
    
        }
    
    }
    

    So auch:

    unsigned short my_htons(unsigned short h);
    
    int main(){
    
        unsigned short my_htons(unsigned short h){
    
            return (h>>8) | (h<<8);
    
        }
    
    }
    

    Sowie in 2-3 anderen Kombinationen.



  • Du solltest auch nicht herumexperimentieren, sondern Theorie anschauen, das sind wirklich triviale Grundlagen. 😉

    Lokale Funktionsdefinitionen sind in C++ nicht erlaubt, der Block muss sich ausserhalb von anderen Funktionen befinden.



  • Wie wäre es mit:

    unsigned short my_htons(unsigned short h){
      return (h>>8) | (h<<8);
    }
    
    int main(){
    
    }
    

    ?

    -> Grundlagen lernen! Kauf ein Buch, oder schau dir wenigstens ein gutes Tutorial.



  • Alles klar funktioniert.
    Dankeschön euch allen 🙂

    drakon schrieb:

    -> Grundlagen lernen! Kauf ein Buch, oder schau dir wenigstens ein gutes Tutorial.

    Ich hab mir von einen Kollegen den DVD-Kurs "Video2Brain - Jetzt lerne ich C++" ausgeliehen.
    Die Grundlagen fand ich sehr gut erklärt, aber beim ersten mal durchsehen hab ich mir natürlich noch nicht alles verinnerlicht.



  • Ich kann mir kaum vorstellen, dass Video2Brain besser/effektiver sein sollte als nen Buch...


Anmelden zum Antworten