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