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 : 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;
Mappage des données:

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));
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 : 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;
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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]