Problème Shared Memory et tableau 3D
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 :
Code:
1 2 3 4 5 6
| typedef struct{
double (*signalsToSend)[500][2]; // mon tableau 3D
double rpmValue;
double finalValue;
etc....
}StructData; |
Mappage des données:
Code:
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)); |
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.
Dans ma seconde application, je me connecte à cette même Shared Memory et j'y récupère les données.
Code:
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; |
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.
Si je fais
Code:
1 2
|
double a = data.signalsToSend[0][0][0]; |
J'ai une erreur lors de l'execution:
"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
Code:
1 2
|
double (*buffer)[500][2] = new double[10][500][2]; |
Je ne la comprend pas très bien.
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:
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] |