Domanda

Ho una funzione definita come la seguente (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;
    }
}

Sto cercando di aggiungere una nuova condizione all'istruzione switch, come

case 'f':

In cui restituire il primo carattere di & amp; FileTag - > artista.

Ho cercato su Internet tutto alla ricerca di una soluzione, ma sono uscito a mani vuote. Qualcuno ha qualche idea?

Aggiornamento: Se aiuta, questa funzione fa parte dell'applicazione EasyTag. Da quello che ho visto guardando attraverso il codice, è qui che viene determinato il nuovo nome file per la funzione di ordinamento dei file di easytag. Sto cercando di aggiungere una nuova variabile per consentire all'applicazione di ordinare la musica in directory in questo modo: <First letter of artist name>/<Artist>/<Album>/<Tracks>

C'è sempre la possibilità che io stia guardando la funzione sbagliata, ma per quanto ne so io sono.

Un altro aggiornamento: Ho fatto funzionare questa funzione come volevo (i puntatori sono piccole cose divertenti), ma, come indicato di seguito, non fa quello che mi aspettavo. Grazie per tutto l'aiuto e la pazienza!

È stato utile?

Soluzione

Non sono del tutto sicuro del motivo per cui il codice restituisce un puntatore a un puntatore, ma ciò rende l'operazione desiderata leggermente più difficile. Poiché è necessario restituire indirizzo di un puntatore e non solo un puntatore stesso, è necessario allocare quel nuovo puntatore da qualche parte (e quindi chi lo libererà?). Se non ti dispiace la perdita di memoria, puoi ignorare il problema e allocare un puntatore e restituire il suo indirizzo. In alternativa, puoi creare un nuovo membro di File_Tag che contiene una stringa breve che contiene il primo carattere di artist.

Le funzioni stringa glib sii utile per questo, una rapida occhiata alla lista mostra g_strdup_printf() potrebbe essere utile:

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

Quindi alloca da qualche parte per memorizzare first e restituire l'indirizzo.

Aggiornamento: utilizzando http://codesearch.google.com Mi sembra avere trovato dove viene utilizzata questa funzione che stai cambiando e sembra che il valore restituito sia usato per < em> cambia il campo che viene restituito.

    // 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);

Non sono sicuro di cosa esattamente vuoi fare se il tuo codice restituisce una nuova stringa che contiene il primo carattere del nome dell'artista. Il codice sopra cambierebbe ciò a cui punta la tua stringa , il che non avrebbe alcun effetto sul nome dell'artista attuale.

Altri suggerimenti

Se l'obiettivo è restituire un puntatore a una stringa che comprende solo la prima lettera e non ti interessa la sicurezza del thread, allora dovrebbe funzionare quanto segue

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

Trovo strano, tuttavia, che tu stia restituendo un puntatore a un puntatore a un " char " piuttosto che semplicemente un puntatore a un " char " ;.

Non perlustrare Internet. Codifica tu stesso. Aggiungi questo:

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

Supponendo che &FileTag->artist sia di tipo gchar **.

Se possibile, otterrei solo l'intera stringa dell'artista e quindi accederei semplicemente alla prima lettera da qualsiasi posizione tu chiami la funzione:

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

Se questa non è un'opzione, puoi allocare nuova memoria per il tuo personaggio, ma è piuttosto complicato perché vuoi restituire un puntatore a un puntatore. Quindi dovresti allocare anche memoria per quel puntatore. forse potresti cambiarlo ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top