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
Foi útil?

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

  1. Sua variável de loop it é do tipo char*, o conteúdo da matriz é do tipo const char*. Se você mudar it ser também um const char* O aviso deve ir embora.

  2. Você declara it Dentro da declaração for, isso não é permitido em C antes de C99. Declarar it no começo de main() 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top