Domanda

Questo è in riferimento ad una soluzione pubblicati su: annodare una matrice di dimensione fissa senza definire la sua dimensione in C

Ecco il mio codice di esempio:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };

    for (char *it = foo[0]; it != NULL; it++) {
        printf ("str %s\n", it);
    }

    return 0;

}

Il tentativo di compilare questo dà:

gcc -o vararray vararray.c
vararray.c: In function ‘main’:
vararray.c:14: warning: initialization discards qualifiers from pointer target type
vararray.c:14: error: ‘for’ loop initial declaration used outside C99 mode
È stato utile?

Soluzione

Oltre l'inizializzazione nel ciclo for, si sta incrementando nel posto sbagliato. Penso che questo sia quello che vuoi dire (notare che io non sono esattamente un guru C):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };
    const char **it;
    for (it=foo; *it != NULL; it++) {
        printf ("str %s\n", *it);
    }

    return 0;

}

Altri suggerimenti

  1. Il ciclo it variabile è di tipo char*, i contenuti della matrice sono di tipo const char*. Se si cambia it di essere anche un const char* l'avviso dovrebbe andare via.

  2. Si dichiara it all'interno for, questo non è consentito in C prima di C99. Dichiarare it all'inizio del main() invece.
    In alternativa è possibile aggiungere o -std=c99 -std=gnu99 alle flag gcc per abilitare le caratteristiche del linguaggio C99.

Utilizzare l'opzione -std=c99 durante la compilazione il codice al fine di utilizzare le funzioni C99.

Cambia it di tipo const char* (per rimuovere le avvertenze)

Prima di C99, dichiarando che puntatore a carattere nel ciclo for non è standard.

Hai bisogno di due cose per avere questo compilare senza avvisi: dichiarare il const char* it iteratore, e lo fa, all'inizio della funzione e non nella dichiarazione ciclo

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