[Warning] assignment discards qualifiers from pointer target type



  • int main() 
    { 
        char String[] = "Test"; 
        printf("%c = %p\n",String[2],&String[2]); 
        char *Pointer = memchr(String,String[2],3); // <- dicker Fehler
        printf("%c = %p\n",*Pointer,Pointer); 
        getchar(); 
    }
    

    In C werden die Variablen am Anfang deklariert, oder sind wir hier in C++??? 😃

    [edit] ich glaube das ist auch der einzigste Fehler!!! [/edit]

    mfg hohesC



  • hohesC schrieb:

    In C werden die Variablen am Anfang deklariert

    ich glaube mich zu erinnern, dass das seit C99 nicht mehr notwendig ist, sicher bin ich aber nicht, ich könnte schwören, dass der gcc früher deswegen gemeckert hatte, jetzt nicht mehr

    rex@supertux:~> cat a.c 
    #include <stdio.h>
    
    int main(void)
    {
            int x = 3;
            printf("Hallo\n");
            int v=8;
            printf("%d\n", v);
            return 0;
    }
    rex@supertux:~> gcc a.c -oa
    rex@supertux:~> gcc --version
    gcc (GCC) 3.3.5-20050130 (Gentoo Linux 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1)
    


  • \Eigene Dateien\foo\foo.c(11) : warning C4090: '=' : Unterschiedliche 'const'-Bezeichner
    \Eigene Dateien\foo\foo.c(22) : error C2143: Syntaxfehler : Fehlendes ';' vor 'type'
    \Eigene Dateien\foo\foo.c(23) : error C2065: 'Pointer' : nichtdeklarierter Bezeichner
    \Eigene Dateien\foo\foo.c(23) : error C2100: Zeigeroperation ungueltig
    Fehler beim Ausführen von cl.exe.
    

    [edit] stell ich das char *Poimter; an den anfang funktioniert es einwandfrei![/edit]



  • @supertux
    Danke und Du hast recht, hab mich wohl verguckt, werde die Funktion nach void verändern.

    @hohesC
    http://prof.hti.bfh.ch/fileadmin/home/osi1/Informatik_und_C_Skript_Release_2_1_IOE.pdf
    [C99] In C99 dürfen Variablen an beliebigen Stellen innerhalb eines Blockes definiert werden,
    dürfen aber erst nach ihrer Definition benutzt werden.



  • @supertux
    Wenn ich void* nehme meldet mir MinGW das es einen void Pointer nicht dereferenzieren kann. Was muss ich machen, wenn ich die Funktion mit const void *String programmieren möchte?

    Mit const char *String funktioniert es jetzt, dank dem (void*) Casten.



  • Habe jetzt hier gelesen, dass wenn ich an den Wert eines void-Pointers kommen will einen anderen Pointer brauche, mit welchem Typ wurde die originale Funktion denn geschrieben?



  • Weiß Niemand mit welchem Typ die Funktion original geschrieben wurde oder wie sie überhaupt geschrieben wurde?

    Überings steht die Funktion hier auf Seite 186 mit dem Typ const char*:
    http://www.c-plusplus.net/cms/modules.php?op=modload&name=Downloads&file=index&req=getit&lid=45



  • Gast2 schrieb:

    Weiß Niemand mit welchem Typ die Funktion original geschrieben wurde oder wie sie überhaupt geschrieben wurde?

    Überings steht die Funktion hier auf Seite 186 mit dem Typ const char*:

    char* und void* müssen die gleiche Repräsentation haben, also bietest Du nach außen void* an und arbeitest intern mit char*.



  • Okay, danke.


  • Mod

    Gast1 schrieb:

    #include <stdio.h>
    
    void *memchr(const char *String, int Character, int len)
    {
        void *Pointer = NULL;
        int i;
        for(i = 0;i < len;++i)
        {
            if(*(String+i) == Character)
            {
                Pointer = String+i; /* [Warning] assignment discards qualifiers from pointer target type */
                break;
            }
        }
        return Pointer;
    }
    
    int main()
    {
        char String[] = "Test";
        printf("%c = %p\n",String[2],&String[2]);
        char *Pointer = memchr(String,String[2],3);
        printf("%c = %p\n",*Pointer,Pointer);
        getchar();
    }
    

    Ich hab versucht die memchr Funktion zu programmieren, dies funktioniert auch gut, nur bekomme ich in der auskommentieren Zeile immer ein Warning, weiß allerdings nicht warum. Kann mir Jemand sagen, was ich an der Stelle nicht ganz richtig mache?
    Die Funktion funktioniert, soweit ich das sagen kann, normal und der Compiler ist MinGW.
    Danke

    'qualifier' meint const oder volatile. mit void* hat das nichts zu tun, in C kann man jeden pointer implizit zu und von void* casten. in der zuweisung geht aber die constness von *String verloren. man kann den void pointer ja (nach zusätzlichem casten) dazu verwenden, um *String zu verändern. das ganze wäre entweder zu heilen indem pointer und memchr(..) jeweils const void* sind oder man verzichtet auf die constness von *String.


Anmelden zum Antworten