Allocation dynamique

Bonjour, je suis toujours sur ma bibliothèque de réseaux de neurones sur ESP32.

Je cherche à faire de l’allocation dynamique de mémoire pour le jeu de données. Le jeu de données doit être un tableau de struct dont la taille est inconnue à la compilation. Elle peut être déclarée par l’utilisateur.

La struct a cette définition

typedef struct {		   /* The dataset           */
  float*    In;		       /* Array of input data   */
  float     Out;		   /* Output value          */
} DATA;

‘In’ est un vecteur dont la taille n’est pas connue à la compilation, mais qui est fournie lors de la déclaration du réseau, avant de déclarer le jeu de données.

L’utilisateur déclare d’abord le réseau et ses paramètres, parmi lesquels se trouve la taille du vecteur.

Ensuite, il déclare son jeu de données et alloue la mémoire. J’aimerais créer une méthode qui alloue la mémoire.

  DATA dataset[4];
  Net.createDataset (dataset, 4);

Ensuite, il restera à renseigner le dataset, par exemple comme ceci :

  dataset[0].In[0] = 1;
  dataset[0].In[1] = 1;
  dataset[0].Out = 1;
  dataset[1].In[0] = 1;
  dataset[1].In[1] = 0;
  dataset[1].Out = 1;
  dataset[2].In[0] = 0;
  dataset[2].In[1] = 1;
  dataset[2].Out = 1;
  dataset[3].In[0] = 0;
  dataset[3].In[1] = 0;
  dataset[3].Out = 0;

Pouvez-vous m’aider pour l’écriture de la méthode createDataset ?
J’essaye, mais ça ne marche pas :

void MLP::createDataset (DATA* dataset, int nData)
{
  dataset = (DATA*) calloc(nData, sizeof(DATA));
  for (int i = 0; i < nData; i++) {
    dataset[i]->In = (float*) calloc(_units[0], sizeof(float));
  }
}

_units[0] contient la taille du vecteur In.

Le compilateur me dit :

Arduino : 1.8.9 (Windows 10), Carte : “ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None”

sketch\MLP.cpp: In member function ‘void MLP::createDataset(DATA*, int)’:

MLP.cpp:189:15: error: base operand of ‘->’ has non-pointer type ‘DATA’

dataset->In = (float*) calloc(_units[0], sizeof(float));

  • ^*
    exit status 1
    base operand of ‘->’ has non-pointer type ‘DATA’[/quote]
    Comment faire ? Merci de votre aide

dataset représente l'adresse d'un tableau de structures, et non pas de pointeurs sur des structures.

Donc : dataset*.In = calloc()*

Et si tu passais au C++ ?

class Net;

class DATA {
public :
  DATA ( unsigned size );
 ~DATA ();
private:
  friend class Net;
  float*    In;       // Array of input data 
  float     Out;	 // Output value        
};
// ==========================
DATA::DATA ( unsigned size ) {
  Out = 0.f;
  In = new float [ size ];
}
// ==========================
DATA::~DATA () {
  delete[] In;
}
// ==========================


// ----------------------------------------------
cette fonction renvoie un tableau de DATAs, initialisées.
DATA* datase MLP::createDataset (  int nData )
{
  return new DATA [ nData ];
}
// ----------------------------------------------
// ne pas oublier à la fin :
delete[] dataset;

De plus, la création/destruction des objets DATA devrait se faire dans le constructeur (resp. destructeur) de la classe qui les utilise (MLP)

J'ai rien contre le C++, mais je ne comprends pas ton code.

L'argument nData du create est le nombre de data dans le dataset (disons 4). Chaque data contient un vecteur In de taille donnée constante (disons 2) plus une sortie Out.

Je ne vois pas où est passé ce '2' dans ton code.

Dans cet exemple, il me faudrait en final obtenir un dataset qui contient 4 fois 3 floats (2 In + 1 Out).
Dans ton code nData vaut 4 et size vaut 2, si je comprends bien. Ou alors tu pars (comme je l'ai dit au début) du fait que size est connu par ailleurs ?