Looping uma matriz alocada estaticamente, fora do modo C99?
Pergunta
Isso se refere a uma solução publicada em: Looping uma matriz de tamanho fixo sem definir seu tamanho em C
Aqui está o meu código de amostra:
#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;
}
Tentando compilar isso 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
Solução
Além da inicialização no loop for, você está incrementando no lugar errado. Eu acho que é isso que você quer dizer (observe que não sou exatamente um 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;
}
Outras dicas
Sua variável de loop
it
é do tipochar*
, o conteúdo da matriz é do tipoconst char*
. Se você mudarit
ser também umconst char*
O aviso deve ir embora.Você declara
it
Dentro da declaração for, isso não é permitido em C antes de C99. Declararit
no começo demain()
em vez de.
Como alternativa, você pode adicionar-std=c99
ou-std=gnu99
para seus sinalizadores do GCC para ativar os recursos do idioma C99.
Usar -std=c99
opção ao compilar seu código para usar o C99
recursos.
Mudar it
para const char*
tipo (para remover os avisos)
Antes de C99, declarar esse ponteiro de personagem no loop for não-padrão.
Você precisa de duas coisas para ter essa compilação sem avisos: declare o iterador const char* it
, e faça -o no início da função e não na declaração de loop.