Looping un tableau statique alloué, en dehors du mode de C99?
Question
Ceci est en référence à une solution affichée sur: bouclage une matrice de taille fixe sans définir sa taille en C
Voici mon exemple de code:
#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;
}
Essayer de compiler ce qui donne:
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
La solution
En plus de l'initialisation dans la boucle, vous êtes incrémenter au mauvais endroit. Je pense que c'est ce que vous entendez (notez que je ne suis pas exactement un gourou 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;
}
Autres conseils
-
Votre boucle
it
variable est de typechar*
, le contenu du tableau sont de typeconst char*
. Si vous changezit
être aussi unconst char*
l'avertissement devrait disparaître. -
Vous déclarez
it
dans la déclaration pour, ce n'est pas autorisé en C avant C99. Déclarerit
au début demain()
à la place.
Vous pouvez aussi ajouter-std=c99
ou-std=gnu99
à vos drapeaux gcc pour activer les fonctions linguistiques C99.
Utilisez l'option -std=c99
lors de la compilation de votre code afin d'utiliser les fonctions de C99
.
Modifier it
type de const char*
(pour supprimer les avertissements)
Avant C99, déclarant que le pointeur de caractère dans la boucle est non standard.
Vous avez besoin de deux choses pour que cette compilation sans avertissement: déclarer la const char* it
iterator, et de le faire au début de la fonction et non pas dans l'instruction de boucle