Bonjour à tous,
Je suis confronté à un problème lié à l'utilisation d'un tableau 3D dans une shared memory. Je vous explique:
J'ai une première application qui se charge de créer ma Shared Memory. La création se passe parfaitement bien tout est opérationnel.
Dans cette Shared Memory, je map des données que j'ai organisée sous la forme d'une structure :
Mappage des données:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef struct{ double (*signalsToSend)[500][2]; // mon tableau 3D double rpmValue; double finalValue; etc.... }StructData;
Bien entendu le *shmPtr est initialisé à la création de la shared memory (est n'est donc pas null). Je vérifie avec un affichage dans un fichier et mon tableau (buffer) contient les bonnes valeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 StructData data; StructData *shmPtr; double (*buffer)[500][2] = new double[10][500][2]; // traitement du tableau buffer pour le remplir (non détaillé ici) // tableau de ma structure = mon tableau data.signalsToSend = buffer; //Mise en mémoire CopyMemory((PVOID)shmPtr, &data, sizeof(data));
Dans ma seconde application, je me connecte à cette même Shared Memory et j'y récupère les données.
Là aussi *shmPtr a été initialisé en me 'connectant' à la shared memory (et n'est pas null). J'arrive à récuperer les diverses données de ma structure (rpmValue, finalValue, etc... qui ont les bonnes valeurs) mais pour le tableau, ca se complique.Je n'arrive pas à y acceder comme un tableau 3D.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 StructData *shmPtr; StructData data; connectionSharedMemory(); // methode qui me connecte à la SharedMemory data.signalsToSend = shmPtr->signalsToSend; data.rpmValue = shmPtr->rpmValue; data.finalValue = shmPtr->finalValue;
Si je fais
J'ai une erreur lors de l'execution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double a = data.signalsToSend[0][0][0];
"L'instruction à "0x0040e601" emploie l'adresse mémoire "0x05c43920". La mémoire ne peut pas être "read"."
Est-ce que quelqu'un pourrait m'expliquer ce qui ne veut pas?
Et est-ce que quelqu'un pourrait m'expliquer la déclaration
Je ne la comprend pas très bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double (*buffer)[500][2] = new double[10][500][2];
Merci d'avance pour votre aide
---------------------
EDIT:
En fait ce dont j'aurais besoin pour régler mon problème, c'est de passer de mon tableau (*buffer)[500][2] à un tableau de la forme tableau[10][500][2]
mais je ne sais pas comment faire. J'ai éssayé plusieurs choses:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 double table[10][500][2]; for (int i=0; i<10; i++){ for (int j=0; j<500; j++){ (for (int k=0; k<2; k++){ table[i][j][k] = data.signalsToSend[i][j][k]; } } } // ne marche pas car je ne peux pas acceder à data.signalsToSend[i][j][k] (problème décrit au dessus) //J'ai essayé un cast double table[10][500][2]; table = (double[10][500][2])data.signalsToSend; // Mais ca ne compile pas //ISO C++ forbids casting to an array type 'double [10][500][2]' //incompatible types in assignment of 'double (*)[500][2]' to 'double [10][500][2]
Partager