2017-09-27 5 views
0

(Question de devoirs) Je suis en train d'apprendre C, et je fais un programme qui lit les données d'un fichier, crée des routeurs de ces données, et met des pointeurs aux routeurs dans un tableau de taille 255, mais je continue à obtenir l'erreur de titre sur la ligne où je suis en train de les ajouter au tableauValeur indicée n'est ni tableau ni pointeur ni vecteur à l'index de tableau

#define ARRAY_SIZE 255 
struct router routers[ARRAY_SIZE] = {0}; 

int main(int argc, char *argv[]){ 
    unsigned char id; 
    char name[32]; 
    struct router *new_router; 

    if(argc == 2){ 
    //reads file with fread 
    //setting id and name which prints out as expected 

    new_router = make_router(id, name); //initialising method that returns a router pointer 
    routers[new_router->id] = new_router; 
    //error occurs here, at [new_router->id]. Have also tried just using id 
    } 
} 

J'ai cherché beaucoup de discussions avec la même erreur message, mais ils sont tous soit quelqu'un qui n'a pas déclaré un tableau, ou ont été suggérés pour l'essayer avec char non signé comme numéro d'index, qui est ce que j'utilise déjà. J'adorerais avoir un aperçu de cela.

struct router{ 
    unsigned char id; 
    char name[32]; 
} 

struct router* make_router(unsigned char id, char* name){ 
    struct router *r = malloc(sizeof(struct router)); 

    r->id = id; 
    r->name = name; 

    return r; 
} 
+0

Où est la définition de «routeur»? –

+0

routeur est une structure très basique avec un caractère non signé pour id, et un char * nom – Telanore

+0

Si c'est si basique, vous pouvez mettre dans la question pour éviter les commentaires comme le mien. La définition de 'make_router' est également nécessaire. –

Répondre

1

En supposant make_router alloue dynamiquement une structure, puis

routers[new_router->id] = *new_router; // note * 

résout l'erreur du compilateur. Toutefois, vous ne pouvez pas copier des structures de ce type si elles ont des membres de pointeur.

Vous dites que "Router est juste une structure de base avec un char non signé pour id, et un char * pour le nom" donc c'est le cas. Mais avec une mission comme celle-ci, vous n'obtiendrez pas de copie papier des données pointées.

Les pointeurs ne sont pas des données. Ils ne contiennent pas de données. Ils pointent sur les données allouées ailleurs.

Alors, probablement, ce que vous recherchez est un tableau de pointeurs, comme suggéré dans une autre réponse. Si c'est le cas, vous devez réécrire ce programme.

0

Ce:

struct router routers[ARRAY_SIZE] = {0}; 

signifie routers est un tableau de structures ARRAY_SIZE. Pas de pointeurs vers des structures, ce qui est ceci:

routers[new_router->id] = new_router; 

tente d'affecter dans l'un des éléments.

Si make_router() alloue dynamiquement la mémoire, le correctif est probablement changer la déclaration de tableau dans un tableau de pointeurs:

struct router * routers[ARRAY_SIZE]; 
      ^
       | 
      way 
      important 

EDIT: Bien sûr, je suppose qu'il y avait une véritable déclaration de struct router quelque part que vous venez d'omettre. Ce serait peut-être une bonne idée de l'inclure, juste pour l'exhaustivité.

+0

Cela devrait produire une erreur différente. Je pense .. –

+0

produit toujours exactement la même erreur – Telanore