'uses local type'



  • #include <iostream>
    #include <stdlib.h>
    #include <vector>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	cout << "Content-Type: text/html\r\n\r\n";
    
    	cout << "<html><head><title>hello</title></head><body><h1>Welcome</h1>" << endl;
    
    	struct get_params
    	{
    		char* name;
    		char* value;
    	};
    
    	vector<get_params> get_paramameters;
    
    	if (strcmp(getenv("REQUEST_METHOD"), "GET") == 0)
    	{
    		cout << "<p>" << getenv("QUERY_STRING") << "</p>" << endl;
    	}
    
    	cout << "</body></html>";
    
    	return 0;
    }
    

    ich versteh die fehlermeldungen nicht ganz

    C:\Programme\xampp\htdocs\sj2\forum.cpp In function `int main(int, char**)': 
    18 C:\Programme\xampp\htdocs\sj2\forum.cpp `main(int, char**)::get_params' uses local type `main(int, char**)::get_params' 
    18 C:\Programme\xampp\htdocs\sj2\forum.cpp   trying to instantiate `template<class _Alloc> class std::allocator' 
    18 C:\Programme\xampp\htdocs\sj2\forum.cpp template argument 2 is invalid 
    18 C:\Programme\xampp\htdocs\sj2\forum.cpp invalid type in declaration before ';' token
    

    Kann mir jemand erklären, was das bedeutet, pls?



  • Ändere den Strukturnamen um, z.B. in Get_Params.
    Und auch die Vektordeklaration vector<Get_Params> get_parameters;



  • Du mixt C und C++, kann man machen. Ist aber nicht sonderlich schön, ne.

    Wenn du strcmp benutzt, dann solltest du die Parameter vorher auf NULL prüfen:

    char* p = getenv("REQUEST_METHOD");
    
       if ( p )
       {
          puts ( "REQUEST_METHOD found." );
          if ( strcmp( p, "GET" ) == 0) 
          {
                // ...
          }
       }
       else
          puts ( "REQUEST_METHOD not found." );
    

    Weil dir strcmp sonst um die Ohren fliegt, wie du dich leicht überzeugen kannst wenn du

    strcmp ( NULL, NULL );
    

    ausführen lässt.

    Hilfreich für den Umgang mit Umgebungsvariabeln ist es den envp Parameter
    zu kennen. Mit dem kannst du die main-Parameterliste erweitern und dir die
    Umgebungsvariabeln anzeigen lassen:

    int main( int argc, char *argv[], char *envp[] ) 
    { 
       char** env = envp; // Startadresse von envp.
    
       puts( "Showing environment: " );
          while ( *env )
                puts ( *env++ );   
    
       getchar();
       return 0; 
    }
    

    Wie du siehst, brauchst du keinen vector zu bemühen. Die Strings stehen alle im Arbeitsspeicher, an deren Adressen du über envp kommst

    MfG,
    c.



  • r3d4 schrieb:

    Ändere den Strukturnamen um, z.B. in Get_Params.
    Und auch die Vektordeklaration vector<Get_Params> get_parameters;

    wieso denn das jetzt? ist get_params jetzt etwa ein reserviertes wort?

    @cgi
    das mit null ist mir schon klar. ich hab bei dem code nur alles rausgehauen, was weniger wesentlich ist, um das ganze auf den hauptnenner zu bringen. nur vor dem vector habe ich pause gemacht. da steckt nähmlich noch ein kleiner sinn dahinter, der wiederum doch sinnlos ist. mache es dann lieber mit einer structliste. mit arrays von c-string-paaren (parameter => wert) lasse ich es lieber. die ausgabe sollen auch nicht einfach die umgebungsvariablen sein, sondern der query string, zerlegt in parametername und wert. das mit dem dritten parameter von main ist mir neu. wusste ich noch gar nicht. danke.

    @r3d4
    Habe die Fehlermeldung hiermit immer noch

    #include <iostream>
    #include <stdlib.h>
    #include <vector>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        cout << "Content-Type: text/html\r\n\r\n";
    
        cout << "<html><head><title>hello</title></head><body><h1>Welcome</h1>" << endl;
    
        struct Get_Parameter
        {
            char* name;
            char* value;
        };
    
        vector<Get_Parameter> get_paramameters;
    
        if (getenv("REQUEST_METHOD") != NULL && strcmp(getenv("REQUEST_METHOD"), "GET") == 0)
        {
            cout << "<p>" << getenv("QUERY_STRING") << "</p>" << endl;
        }
    
        cout << "</body></html>";
    
        return 0;
    }
    

    Was zum Henker ist das für ein dampfender Haufen Schei*e?

    P.S.: Bitte jetzt keine Performancetipps bezüglich

    if (getenv("REQUEST_METHOD") != NULL && strcmp(getenv("REQUEST_METHOD"), "GET") == 0)
    

    als Antwort.

    😃



  • wieso versteckst du die struktur in main ? deklariermal oben drüber, dann läufts.



  • Ah. Das muss local type whl andeuten. Danke.


Anmelden zum Antworten