Skip to main content
Added a working version of the code and rephrased my question
Source Link
Device#include "LedDevice.h"

LedDevice device;

void setup() {
  device = LedDevice(10, 10, 10);
}

void loop() {
  Serial.println(F("Ticking"));
  device.Tick();
 = Devicedelay(500);
}

Device HeaderLedDevice

Preset*#if Presets[];

Device Source

Device::Device!defined(_LEDDEVICE_H)
#define _LEDDEVICE_H

#include "Preset.h"
#include<Arduino.h>

class LedDevice {
public:
  Preset* Presets[];

 NumPresets LedDevice(numPresets),{}
  LedDevice(int numPixels, NumPatterns(int numPresets, int numPatterns)
  {
    *Presets = (Preset*)malloc(sizeof(Preset) * NumPresetsnumPresets);
  
    for (int p = 0; p < NumPresets;numPresets; p++)
    {
        Presets[p] = new Preset("test", NumPixelsnumPixels, NumPatternsnumPatterns);
    }
  }

  void Tick()
  {
    Serial.print(F("Preset ")); Serial.println(Presets[0]->Name);
    Presets[0]->Tick();
  }

Preset Header

Pattern*};

#endif Patterns[]; //_LEDDEVICE_H

Preset Source

#if !defined(_PRESET_H)
#define _PRESET_H

#include "Pattern.h"

class Preset: {
public:
  char *Name;
  int NumPatterns;
  Pattern* Patterns[];
  
  Preset(char* name, int numPixels, int numPatterns) : NumPatterns(numPatterns)
  {
  NumPatterns  Name = (numPatternschar *),malloc(strlen(name) + 1);
    NumPixelsstrcpy(numPixelsName, name);
{
    *Patterns = (Pattern*)malloc(sizeof(Pattern) * NumPatterns);

    for (int p = 0; p < NumPatterns; p++)
    {
        Patterns[p] = new Pattern(NumPixelsnumPixels);
    }
  }

  void Tick()
  {
    for (int p = 0; p < NumPatterns; p++)
    {
      Patterns[p]->Tick();
    }
  }
};

#endif

Pattern Source

#if !defined(_PATTERN_H)
#define _PATTERN_H

class Pattern: {
public:

  Pattern(int numPixels):{}

 NumPixels void Tick(numPixels){  }
};

#endif

Up untilThe code compiles but when i run the full version (this is a simplified version of the code) i get some strange behavior, so i would like to know if i am doing the initialization of the Presets everything seems to be working fine, no crashes or aparent memory overflowsand Patterns correctly. But

Also when it getsi try to Patterns[p] = new Pattern(NumPixels); print the Preset name in the LedDevice Tick function i get strange characters, so either i am not initializing the for cycle never stops tillstring correctly or the memory runs outpointers to the Presets are wrong.

I guess i amCan you tell if anything is not doing these initializationsbeing done correctly, can you see in the mistakeconstructors?

Device device;

void setup() 
{
    device = Device();
}

Device Header

Preset* Presets[];

Device Source

Device::Device():
    NumPresets(numPresets),
    NumPatterns(numPatterns)
{
    *Presets = (Preset*)malloc(sizeof(Preset) * NumPresets);

    for (int p = 0; p < NumPresets; p++)
    {
        Presets[p] = new Preset("test", NumPixels, NumPatterns);
    }   
}

Preset Header

Pattern* Patterns[];

Preset Source

Preset::Preset(char* name, int numPixels, int numPatterns):
    NumPatterns(numPatterns),
    NumPixels(numPixels)
{
    *Patterns = (Pattern*)malloc(sizeof(Pattern) * NumPatterns);

    for (int p = 0; p < NumPatterns; p++)
    {
        Patterns[p] = new Pattern(NumPixels);
    }
}

Pattern Source

Pattern::Pattern(int numPixels): NumPixels(numPixels){  }

Up until the initialization of the Presets everything seems to be working fine, no crashes or aparent memory overflows. But when it gets to Patterns[p] = new Pattern(NumPixels); , the for cycle never stops till the memory runs out.

I guess i am not doing these initializations correctly, can you see the mistake?

#include "LedDevice.h"

LedDevice device;

void setup() {
  device = LedDevice(10, 10, 10);
}

void loop() {
  Serial.println(F("Ticking"));
  device.Tick();
  delay(500);
}

LedDevice

#if !defined(_LEDDEVICE_H)
#define _LEDDEVICE_H

#include "Preset.h"
#include<Arduino.h>

class LedDevice {
public:
  Preset* Presets[];

  LedDevice(){}
  LedDevice(int numPixels, int numPresets, int numPatterns)
  {
    *Presets = (Preset*)malloc(sizeof(Preset) * numPresets);
  
    for (int p = 0; p < numPresets; p++)
    {
      Presets[p] = new Preset("test", numPixels, numPatterns);
    }
  }

  void Tick()
  {
    Serial.print(F("Preset ")); Serial.println(Presets[0]->Name);
    Presets[0]->Tick();
  }
};

#endif  //_LEDDEVICE_H

Preset

#if !defined(_PRESET_H)
#define _PRESET_H

#include "Pattern.h"

class Preset {
public:
  char *Name;
  int NumPatterns;
  Pattern* Patterns[];
  
  Preset(char* name, int numPixels, int numPatterns) : NumPatterns(numPatterns)
  {
    Name = (char *)malloc(strlen(name) + 1);
    strcpy(Name, name);

    *Patterns = (Pattern*)malloc(sizeof(Pattern) * NumPatterns);

    for (int p = 0; p < NumPatterns; p++)
    {
      Patterns[p] = new Pattern(numPixels);
    }
  }

  void Tick()
  {
    for (int p = 0; p < NumPatterns; p++)
    {
      Patterns[p]->Tick();
    }
  }
};

#endif

Pattern

#if !defined(_PATTERN_H)
#define _PATTERN_H

class Pattern {
public:

  Pattern(int numPixels){}

  void Tick(){}
};

#endif

The code compiles but when i run the full version (this is a simplified version of the code) i get some strange behavior, so i would like to know if i am doing the initialization of the Presets and Patterns correctly.

Also when i try to print the Preset name in the LedDevice Tick function i get strange characters, so either i am not initializing the string correctly or the pointers to the Presets are wrong.

Can you tell if anything is not being done correctly in the constructors?

Source Link

Initializing pointer to vector of objects inside another object

i want to create a somewhat complex structure of classes in an arduino. The short story is: a Device has Presets, and each Preset has a Patterns. For that i created the following structure (i am only posting the important stuff, if something is missing let me know):

INO file

Device device;

void setup() 
{
    device = Device();
}

Device Header

Preset* Presets[];

Device Source

Device::Device():
    NumPresets(numPresets),
    NumPatterns(numPatterns)
{
    *Presets = (Preset*)malloc(sizeof(Preset) * NumPresets);

    for (int p = 0; p < NumPresets; p++)
    {
        Presets[p] = new Preset("test", NumPixels, NumPatterns);
    }   
}

Preset Header

Pattern* Patterns[];

Preset Source

Preset::Preset(char* name, int numPixels, int numPatterns):
    NumPatterns(numPatterns),
    NumPixels(numPixels)
{
    *Patterns = (Pattern*)malloc(sizeof(Pattern) * NumPatterns);

    for (int p = 0; p < NumPatterns; p++)
    {
        Patterns[p] = new Pattern(NumPixels);
    }
}

Pattern Source

Pattern::Pattern(int numPixels): NumPixels(numPixels){  }

Up until the initialization of the Presets everything seems to be working fine, no crashes or aparent memory overflows. But when it gets to Patterns[p] = new Pattern(NumPixels); , the for cycle never stops till the memory runs out.

I guess i am not doing these initializations correctly, can you see the mistake?