web-dev-qa-db-fra.com

Comment rendre une structure externe et définir son typedef

J'essaie d'implémenter des algorithmes d'arbre en C. J'ai déclaré une structure externe dans un fichier d'en-tête qui est complètement indépendante (b_tree_ds.h). Maintenant, je prévois d'importer le fichier dans tous les fichiers source qui souhaitent utiliser cette structure. Je dois donc le déclarer en utilisant extern dans l'en-tête.

Maintenant, le problème est que je veux également définir son typedef. le compilateur donne une erreur de plusieurs classes de stockage. Comment dois-je faire ça.

typedef extern struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Le problème réel est le suivant, que je ne peux toujours pas résoudre ??? J'ai récemment appris comment utiliser plusieurs fichiers source avec des fichiers d'en-tête pour rendre le code portable et hiérarchique. Pour ce faire, je me suis fatigué de créer mon programme d'arborescence en utilisant ce principal. Voici mes fichiers

b_tree_ds.h - Cela contiendra une déclaration de la structure de données du nœud d'un arbre, qui peut être appelée à diverses fonctions implémentant différentes fonctionnalités de l'arbre (qui peuvent être dans différents fichiers source)

typedef struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Quand j'essaye d'ajouter un extern comme dans typedef extern struct node cela donne une erreur de classe de stockage multiple mais si je la manque, j'obtiens une erreur pour plusieurs définitions.

Voici mes autres fichiers sources

traverse.h - contient la déclaration de la fonction traverse

void traverse_print (NODE* p);

Ici aussi, je reçois une erreur pour l'identifiant inconnu NODE

traverse.c - contient la définition de cette fonction

#include <stdio.h>
#include "b_tree_ds.h"
#include "traverse.h"

void traverse_print(NODE* p)
{
    if(p->left != NULL)
    {
        traverse_print(p->left);
    }

    if (p->right != NULL)
    {
        traverse_print(p->right);
    }

    printf ("\n%d",p->key);
}

Enfin main.c

#include <stdio.h>
#include "traverse.h"

void main()
{
    // input
    NODE p;

    printf("\nInput the tree");
    input_tree (&p);

    printf("\n\nThe tree is traversing ...\n")
    traverse_print(&p);
}

void input_tree (NODE *p)
{
    int in;
    int c;
    NODE *temp;

    printf("\n Enter the key value for p: ");
    scanf("%d", &in);
    p->key  =in;
    printf ("\n\nIn relation to node with value %d",in);
    printf ("Does it have left child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
    printf ("\n\nIn relation to node with value %d",p->key);

    printf ("\nDoes it have right child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
}

Ceci est ma première tentative pour une telle pratique, veuillez suggérer que la structure de mon programme est bonne ou devrais-je essayer autre chose.

17
simar

Vous ne pouvez pas créer une structure extern. Il vous suffit de le définir dans un en-tête protégé contre les inclusions et de l'inclure partout où vous en avez besoin.

MODIFIER pour SquareRootOfTwentyThree

J'utilise ces therms dans de la manière suivante :

Une définition de type de structure décrit les membres qui font partie de la structure. Il contient le mot-clé struct suivi d'un identifiant facultatif (la balise de structure) et une liste de membres entre accolades.

Une déclaration de structure a la même forme qu'une définition de structure, sauf que la déclaration n'a pas de liste de membres entre accolades.

Donc, la "définition" est exactement ce que je voulais dire.

25
cnicutar

En C, les structures n'ont pas de lien, seuls les objets et les fonctions en ont. Vous pouvez donc écrire ceci:

// header file 'node.h'

typedef struct node_
{
    /* ... */
} node;

extern node root_node;

Fournissez ensuite une implémentation quelque part:

// source file

#include <node.h>

node root_node;
27
Kerrek SB

Dans votre fichier d'en-tête, déclarez node.h comme ceci

#ifndef NODE_H
#define NODE_H

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct node {
        struct node* left;
        struct node* right;
        int key;    // contains value
    }NODE;


#ifdef  __cplusplus
}
#endif

#endif  /* NODE_H */  

vous pouvez inclure ce fichier d'en-tête dans n'importe quel programme c et l'utiliser comme

NODE* newNode = NULL;
1
Anantha Krishnan