GCC: Argument entfernt Kennzeichner von Zeiger-Ziel-Typ



  • Hallo zusammen,
    Ich habe erst mit C/C++ angefangen und mir zu Übungs- und Verständiszwecken ein kleines Programm in Linux raus gesucht. Deshalb möchte ich gleich vorab eventuelle Newbie-Fragen entschuldigen, aber irgendwo muss man ja anfangen 🙄
    Nun zum eigentlichen Problem:
    Beim kompilieren mit gcc erhalte ich folgende Fehlermeldung:

    Warnung: Übergabe des Arguments 1 von »file_data_update_mime_type« entfernt Kennzeichner von Zeiger-Ziel-Typ
    

    innerhalb der Funktion:

    if (fdata->mime_type == 0)
    		file_data_update_mime_type ((FileData*) fdata);
    

    Die besagte Funktion selbst, sieht so aus:

    static void
    file_data_update_mime_type (FileData *fdata)
    {
    	const char *mime_type;
    
    	mime_type = get_file_mime_type (fdata->full_path, TRUE);
    
    	if (mime_type == NULL) {
    		fdata->mime_type = 0;
    		return;
    	}
    
    	fdata->mime_type = g_str_hash ((gconstpointer) mime_type);
    	if (g_hash_table_lookup (mime_type_hash, (gconstpointer) &fdata->mime_type) == NULL)
    		g_hash_table_insert (mime_type_hash, (gpointer) &fdata->mime_type, g_strdup (mime_type));
    }
    

    Nun fehlt es mir zugegebener Maßen etwas an Verständnis (vielleicht liegt das auch an der Übersetzung der Compiler-Meldung). Was genau will man mir hier sagen?
    Die Fehlermeldung zumindest ist weg, wenn ich die Adresse von "fdata" referenziere und das Ganze dann so aussieht:

    if (fdata->mime_type == 0)
    		file_data_update_mime_type ((FileData*) &fdata);
    

    Ist das überhaupt korrekt? Was ich in dieser Funktion auch nicht ganz verstehe ist warum "FileData" in extra Klammern steht. Ist dann der Zeiger überhaupt gültig?
    Ich hoffe, dass sich hier jemand findet, der mir meine Anfängerfragen beantworten mag.

    Gruß
    Thomas



  • wie wurde denn fdata deklariert?



  • Soweit ich es als Neuling erkennen kann, gar nicht. fdata bezieht sich auf Filedata und Filedata ist ein Template Konstrukt (glaube ich - bitte notfalls korrigieren). Das Konstrukt sieht folgender Maßen aus:

    typedef struct {
    	char       *original_path;    /* path read from command line. */
    	char       *full_path;        /* "/" + original_path. */
    	char       *link;
    	guint64     size;
    	time_t      modified;
    
    	char       *name;             /* The file name. */
    	char       *path;             /* The directory. */
    	gboolean    encrypted;        /* Whether the file is encrypted. */
    	gboolean    dir;              /* Whether this is a directory listed in the archive */
    	guint64     dir_size;
    
    	/* Additional data. */
    
    	gboolean    list_dir;         /* Whether this entry is used to show
    				       * a directory. */
    	char       *list_name;        /* The string visualized in the list
    				       * view. */
    
    	/* Private data */
    
    	guint       mime_type;
    	gboolean    free_original_path;
    } FileData;
    

    Edit: Eclipse findet im Übrigen auch keine Deklaration für fdata.



  • Ok, jetzt komme ich voran und weiß nun glaub auch, was camper meinte 🙄
    Nochmal als Zusammenfassung, es geht um folgende beiden Funktionen:

    static void
    file_data_update_mime_type (FileData *fdata)
    {
    	const char *mime_type;
    
    	mime_type = get_file_mime_type (fdata->full_path, TRUE);
    
    	if (mime_type == NULL) {
    		fdata->mime_type = 0;
    		return;
    	}
    
    	fdata->mime_type = g_str_hash ((gconstpointer) mime_type);
    	if (g_hash_table_lookup (mime_type_hash, (gconstpointer) &fdata->mime_type) == NULL)
    		g_hash_table_insert (mime_type_hash, (gpointer) &fdata->mime_type, g_strdup (mime_type));
    }
    
    const char *
    file_data_get_mime_type (const FileData *fdata)
    {
    	const char *mime_type;
    
    	if (fdata->mime_type == 0)
    		file_data_update_mime_type ((FileData*) fdata);
    	if (fdata->mime_type == 0)
    		return GNOME_VFS_MIME_TYPE_UNKNOWN;
    
    	mime_type = g_hash_table_lookup (mime_type_hash, (gconstpointer) &fdata->mime_type);
    	if (mime_type == NULL)
    		mime_type = GNOME_VFS_MIME_TYPE_UNKNOWN;
    
    	return mime_type;
    }
    

    Wie immer bitte unbedingt korrigieren, wenn ich hier etwas falsch verstehe:
    Also die Funktion file_data_get_mime_type erhält als Argument fdata und deklariert dieses als Konstante. Innerhalb dieser Funktion wird auf die Funktion file_data_update_mime_type zugegriffen und ihr wird die Konstante fdata übergeben. In der Funktion file_data_update_mime_type wird das übergebene Argument aber nicht als Konstante deklariert, weil Daten innerhalb der Funktion geändert werden und somit (denke ich) kommt die Fehlermeldung zu Stande.
    Sehe ich das soweit richtig? 😕
    Wenn dem so ist, wie kann ich das Ganze jetzt ausbessern?



  • Gut, ich habe jetzt zwei Möglichkeiten entdeckt:

    • Ich ignoriere die Meldung des Compilers, dass der Kennzeichner entfernt wird.(das Programm läuft ja trotzdem)
    • Oder ich ändere die Definition und lasse 2 Funktionen nicht als Konstanten erstellen.

    Nur eine Frage stellt sich mir da, die man sicher erst beantworten kann, wenn man dementsprechend Erfahrung hat: Was von beidem ist sinnvoller?



  • du hast einen bug im file-roller entdeckt. gratulation 🙂
    im cvs wurde das schon gefixt.



  • 😃 eigentlich wollte ich es nur mal zu Übungszwecken nehmen



  • gcc meldungen auf deutsch ? *grusel*



  • ja finde ich ehrlich gesagt auch ... erst recht wenn die so übersetzt sind ... sind aber leider mit dabei in den sprachpaketen



  • tohms schrieb:

    ja finde ich ehrlich gesagt auch ... erst recht wenn die so übersetzt sind ... sind aber leider mit dabei in den sprachpaketen

    Wenn es stört, kannst Du einfach die Umgebungsvariable LANG auf den Wert "C" stellen. Dann bekommst Du englische Meldungen.



  • stimmt, da habe ich gar nicht dran gedacht ... werde eclipse den wert mitgeben, so bleibt der rest auf deutsch


Anmelden zum Antworten