2014-09-12 4 views
0

Je suivais ce example, et mon programme ressemble à ceci:Comment déclarer une structure dans c?

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

struct Foo 
{ 
    int x; 
    int array[100]; 
}; 


struct Foo f; 
f.x = 54; 
f.array[3]=9; 

void print(void){ 

    printf("%u", f.x); 
} 

int main(){ 
    print(); 
} 

Cependant, je reçois des erreurs lors de la compilation en utilisant make example_1:

example_1.c:13:1: error: unknown type name 'f' 
f.x = 54; 
^ 
example_1.c:13:2: error: expected identifier or '(' 
f.x = 54; 
^ 
example_1.c:14:1: error: unknown type name 'f' 
f.array[3]=9; 
^ 
example_1.c:14:2: error: expected identifier or '(' 
f.array[3]=9; 
^ 
4 errors generated. 
make: *** [example_1] Error 1 

Quel est le problème avec cette déclaration de struct?

+6

Vous ne pouvez pas écrire de code exécutable en dehors d'une fonction. Mettez les 3 lignes 'struct Foo f; ... f.array [3] = 9' dans 'main()'. – clcto

Répondre

6
f.x = 54; 
f.array[3]=9; 

devrait être dans une fonction. Vous ne pouvez pas écrire le flux de programme en dehors de la fonction dans la portée globale sauf l'initialisation.

Pour initialiser le monde, utilisez

struct Foo f = {54, {0, 0, 0, 9}}; 

live code here

En C99, vous pouvez aussi écrire

struct Foo f = {.x=54, .array[3] = 9 }; 

live code here


L'exemple de lien que vous avez mentionné indique:

structure Foo f; // attribution automatique, tous les champs placés sur pile
f.x = 54;
f.array[3]=9;

utilisation de la pile de texte suggère qu'il est begin utilisé dans une fonction locale comme ci-dessous:

void bar() 
{ 
    struct Foo f; 
    f.x = 54; 
    f.array[3]=9; 
    do_something_with(f); 
} 

live example here

2

Vous pouvez uniquement initialiser une variable de structure au point de sa réception.

Vous pouvez l'initialiser comme ceci:

struct Foo f = {54, {0, 0, 0 9}}; 

ou en utilisant la fonction C99 designated initializers:

struct Foo f = {.x = 54, .array[3] = 9}; 

La deuxième façon de le faire est beaucoup plus claire mais malheureusement C99 est pas aussi largement disponible comme C89. Le compilateur GNU prend entièrement en charge C99. Le compilateur de Microsoft ne prend en charge aucun standard C au-dessus de C89. C++ n'a pas non plus cette fonctionnalité. Donc, si vous voulez compiler le code avec des compilateurs C++ ou un compilateur C de Microsoft, vous devez utiliser la première version. Si vous écrivez votre code uniquement pour gcc et que vous ne faites pas grand cas des outils de développement de Microsoft, vous pouvez utiliser la deuxième version.

Vous pouvez également attribuer à chaque membre individuellement dans une fonction:

void function(void) 
{ 
    f.x = 54; 
    f.array[3] = 9; 
} 

Mais vous ne pouvez pas le faire globably.

+0

Au moment où j'ai commencé à écrire ceci, l'autre réponse ne suggérait pas d '«initialiseurs désignés». Après avoir posté ceci j'ai remarqué que l'autre réponse a été éditée pour inclure cela. Cette réponse semble redondante maintenant. Je ne sais pas quoi faire. – wefwefa3

Questions connexes