2009-09-09 10 views
1

Ok les gars, juste une question rapide nous espérons que quelqu'un peut trouver mon erreur rapidement, mais je ne peux pas le voir au momentC - Problèmes avec des pointeurs vers des pointeurs, peut ne pas sembler le voir

Voici mon struct:

typedef struct { 
    Car *buffer[CAR_PARK_SIZE];  
    char *arrival_time[CAR_PARK_SIZE]; 
    int keep_running;    
    int size;     
} CarPark; 

typedef struct { 
    Car *buffer[MAX_QUEUE_SIZE]; 
    char *arrival_time[MAX_QUEUE_SIZE]; 
    int keep_running; 
    int size; 
    int index; 
    } CarQueue; 

typedef struct { 
    char str[3]; 
    int id; 
} Car; 

Je vais essayer de parler ceci et nous espérons que j'ai fourni assez d'informations pour quelqu'un pour savoir où le problème réside peut-être, le problème est de faire avec le pointeur dans la mémoire tampon CarQueue, qui est censé être un tableau de pointeurs de voiture. Quand mon code s'exécute, il semble écrire le même pointeur que jamais dans le tampon CarQueue, voici le jeu par jeu.

_cq = CarQueue, _CP = CarPark

Ils sont tous deux GLOBALS

Mon thread appelle ces lignes pour générer une nouvelle structure de voiture. Cela devrait mettre le pointeur de la nouvelle structure de voiture dans le tampon CarQueue.

Le thread suivant tente d'extraire le pointeur de ce tableau et de le coller dans le sien, puis de le supprimer de l'ancien tableau. CarPark prend le pointeur de la voiture, le place dans sa matrice de stockage, puis le supprime de CarQueue (ou dans ce cas, augmente simplement l'index et le remplace plus tard). Je pense que le problème se situe autour de l'endroit où se trouve le commentaire dans le code, mais je ne suis pas certain. Finalement, si j'imprime le tableau dans CarPark, tous ses éléments semblent être exactement les mêmes. Est-ce que je passe un mauvais pointeur vers un pointeur quelque part accidentellement?

si je traverse à travers le réseau CarPark et l'imprimer comme suit

printf("| element %d is %s with pointer %d |\n", j, get_car_id(_cp.buffer[j]), _cp.buffer[j]); 

Ils semblent être exactement le même article, même nom et pointeur.

+0

Si vous allez utiliser ceci comme une file d'attente (ajouter et terminer, supprimer d'une fin) alors une liste liée serait une bonne structure de données. Pour un tableau, vous devez connaître la taille (ou utiliser une constante comme vous l'avez fait). Une liste chaînée est très facile à faire croître et à réduire, et vous ne serez pas limité pour toujours aux tableaux de taille MAX_QUEUE_SIZE et CAR_PARK_SIZE. – Shizzmo

Répondre

3
problème

est ici:

Car c; 
c = new_car(); 
get_car_id(&c); 

vous prenez le pointeur à l'objet sur la pile, il est donc supprimé/écrasé à chaque fois, de sorte que les pointeurs peuvent être identiques.

Car *c; 
c = new_car(); 

et new_car doit renvoyer le pointeur.

EDIT:

new_car devrait malloc() la nouvelle voiture, (et vous devez libérer() quelque part, par exemple lors du retrait de la file d'attente). Envisagez d'utiliser un réseau de voitures (pas un tableau de pointeurs sur les voitures) et de copier l'ensemble de l'élément.

+0

cela signifie-t-il que la méthode new_car() devrait l'immobiliser pour l'empêcher d'être dans sa pile? En outre, si le thread séparé tire les bonnes informations hors de la file d'attente avant de les mettre dans le parc (alors que de nouvelles voitures sont encore créées et ajoutées à la file d'attente dans le premier thread), des pointeurs séparés restent séparés. Même si l'un d'eux était nuké, ce serait une référence nulle, cela ne pointerait pas magiquement vers l'autre objet ... non? –

0

La voiture dans l'exemple est-elle allouée sur la pile?

Les objets partagés entre threads doivent être alloués sur le tas à l'aide de malloc.

Questions connexes