Frage

Ich habe eine Funktion wie folgt definiert (in C):

gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar code)
{
    switch (code)
    {
        case 't':    /* Title */
            return &FileTag->title;
        case 'a':    /* Artist */
            return &FileTag->artist;
        case 'b':    /* Album */
            return &FileTag->album;
        case 'd':    /* Disc Number */
            return &FileTag->disc_number;
        case 'y':    /* Year */
            return &FileTag->year;
        case 'n':    /* Track */
            return &FileTag->track;
        case 'l':    /* Track Total */
            return &FileTag->track_total;
        case 'g':    /* Genre */
            return &FileTag->genre;
        case 'c':    /* Comment */
            return &FileTag->comment;
        case 'p':    /* Composer */
            return &FileTag->composer;
        case 'o':    /* Orig. Artist */
            return &FileTag->orig_artist;
        case 'r':    /* Copyright */
            return &FileTag->copyright;
        case 'u':    /* URL */
            return &FileTag->url;
        case 'e':    /* Encoded by */
            return &FileTag->encoded_by;
        case 'i':    /* Ignored */
            return NULL;
        default:
            Log_Print(LOG_ERROR,"Scanner: Invalid code '%%%c' found!",code);
            return NULL;
    }
}

Ich versuche, eine neue Bedingung für die Switch-Anweisung, wie

hinzufügen
case 'f':

In welcher wäre es das erste Zeichen & FileTag-> Künstler zurück.

Ich habe alle im Internet nach einer Lösung suchen abgekocht, sondern kommen mit leeren Händen. Wer irgendwelche Ideen?

Update: Wenn es hilft, ist diese Funktion ein Teil der Anwendung EasyTag. Von dem, was ich über den Code gesehen haben, ist dies, wo die neuen Dateinamen für die Dateisortierung-Funktion des easytag bestimmt wird. Ich versuche, eine neue Variable hinzuzufügen, damit die Anwendung sortieren Musik in Verzeichnisse wie folgt: <First letter of artist name>/<Artist>/<Album>/<Tracks>

Es gibt immer die Chance, dass ich an der falschen Funktion suchen kann, sondern die besten Wissen und Gewissen ich bin.

Ein weiteres Update: Ich habe diese Funktion funktioniert, wie ich wollte (Zeiger sind lustige kleine Dinge), aber es funktioniert nicht, wie unten erwähnt, tun, was ich erwartet hatte, es zu. Vielen Dank für all die Hilfe und Geduld!

War es hilfreich?

Lösung

Ich bin mir nicht ganz sicher, warum Ihr Code einen Zeiger auf einen Zeiger zurückgibt, aber das macht den gewünschten Betrieb etwas schwieriger. Da Sie die Adresse ein Zeiger, und nicht nur ein Zeiger selbst zurückkommen müssen, müssen Sie irgendwo, dass die neuen Zeiger zuweisen (und dann haben sie befreien?). Wenn Sie den Speicherverlust nicht kümmern können Sie das Problem ignorieren und nur einen Zeiger zuweisen und seine Adresse zurück. Alternativ können Sie ein neues Mitglied von File_Tag erstellen, die eine kurze Zeichenfolge enthält, die das erste Zeichen von artist enthält.

Die glib String-Funktionen werden hilfreich sein für diese, ein kurzer Blick durch die Liste zeigt g_strdup_printf() könnte nützlich sein:

gchar *first = g_strdup_printf("%c", FileTag->artist[0]);

Dann irgendwo zuteilen first zu speichern und geben die Adresse dafür.

Update: Mit http://codesearch.google.com Ich scheine zu haben, gefunden, wo diese Funktion Sie ändern wird verwendet , und es sieht aus wie der Rückgabewert wird verwendet, um Veränderung das Feld, das zurückgeführt wird.

    // Get the target entry for this code
    dest = Scan_Return_File_Tag_Field_From_Mask_Code(FileTag,mask_item->code);

    // We display the text affected to the code
    if ( dest && ( OVERWRITE_TAG_FIELD || *dest==NULL || strlen(*dest)==0 ) )
        ET_Set_Field_File_Tag_Item(dest,mask_item->string);

Ich bin mir nicht sicher, was genau Sie tun möchten, wenn Ihr Code eine neue Zeichenfolge zurück, die das erste Zeichen des Künstlernamen enthält. Der obige Code würde sich ändern, was Ihre neu zugewiesenen String auf , die keine Auswirkung auf den tatsächlichen Namen des Künstlers haben.

Andere Tipps

Wenn das Ziel ist es, einen Zeiger auf einen String zurückzugeben, die nur den ersten Buchstaben enthält und Sie kümmern sich nicht um Thread-Sicherheit, sollte die folgende Arbeit

static char buf[2];
static char *pbuf = buf;
...
case 'f':
    buf[0] = FileTag->artist[0];
    return &pbuf;

Ich finde es seltsam, aber, dass Sie einen Zeiger auf einen Zeiger auf eine „char“ sind Rückkehr eher, dass nur ein Zeiger auf einen „char“.

Sie das Internet nicht scheuern. Code it yourself. Fügen Sie diese:

        case 'f':    /* Artist */
            return &FileTag->artist;

Das ist unter der Annahme, &FileTag->artist ist vom Typ gchar **.

Wenn möglich, würde ich einfach die ganze Künstler-String und dann zugreifen einfach den ersten Buchstaben aus, wo immer Sie die Funktion aufrufen:

gchar **artist = Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, 'f')
printf("%c", *artist[0]);

Wenn das nicht möglich ist, könnten Sie neue Speicher für Ihren Charakter zuweisen, aber das ist eher schwierig, weil Sie einen Zeiger auf einen Zeiger zurückgeben möchten. Sie würden also auch für diesen Zeiger Speicher zuweisen müssen. vielleicht könnte man das ändern ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top