Ошибка Guru meditation загрузка запрещена, esp32s. При использовании Fastled

Я сталкиваюсь с ошибкой Guru meditation, загрузка запрещена в моем текущем скетче для esp32s.

Вот код:

#include <FastLED.h>

#define NUM_LEDS 120
#define LED_PIN 3
CRGB leds[NUM_LEDS];

int H1[12][10] = {
  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 
  {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, 
  {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, 
  {30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, 
  {40, 41, 42, 43, 44, 45, 46, 47, 48, 49}, 
  {50, 51, 52, 53, 54, 55, 56, 57, 58, 59}, 
  {60, 61, 62, 63, 64, 65, 66, 67, 68, 69}, 
  {70, 71, 72, 73, 74, 75, 76, 77, 78, 79}, 
  {80, 81, 82, 83, 84, 85, 86, 87, 88, 89}, 
  {90, 91, 92, 93, 94, 95, 96, 97, 98, 99}, 
  {100, 101, 102, 103, 104, 105, 106, 107, 108, 109}, 
  {110, 111, 112, 113, 114, 115, 116, 117, 118, 119}
  
};


int connections[7][6] = { // не забудьте изменить 7 на количество концентраторов
  {2,3,4,5,6,7},
  {1,7,3,0,0,0},
  {1,2,4,0,0,0},
  {1,3,5,0,0,0},
  {1,4,6,0,0,0},
  {1,5,7,0,0,0},
  {1,2,6,0,0,0}
};

int const life = 3;
int numHubs = 7;

void setup() {
}

void loop() {
  path_taker(path_picker(numHubs, connections), H1);
  delay(500);
}


int* path_picker(int numHubs,int connections[7][6]){ // не забудьте изменить 7 на количество концентраторов!
  int hub = random(1,numHubs)-1;
  int i = 1;
  int path[life];
  int a = 0;
  path[0] = hub;
  
  while (i <= life){
    a = connections[hub][random(0,6)];
    if (a != 0){
      path[i] = a;
      hub = a;
      
      i = i+1;
    }
    
  }
  return path;
}

void path_taker(int path[life], int H1[12][10]){
    int ini = 0;
    int fin = 0;
    int rod[10];
    for (int i = 0; i < sizeof(path) - 1; i++){
      ini = path[i];
      fin = path[i+1];
      switch (ini){
        case 1:
        switch (fin){
          case 2:
          lightup(arrayBuilder(0, H1, false));
          break;

          case 3:
          lightup(arrayBuilder(4, H1, false));
          break;

          case 4:
          lightup(arrayBuilder(3, H1, true));
          break;

          case 5:
          lightup(arrayBuilder(5, H1, false));
          break;

          case 6:
          lightup(arrayBuilder(8, H1, true));
          break;

          case 7:
          lightup(arrayBuilder(9, H1, false));
          break;
        }
        break;
        
        case 2:
        switch (fin){
          case 1:
          lightup(arrayBuilder(0, H1, true));
          break;

          case 3:
          lightup(arrayBuilder(1, H1, false));
          break;

          case 7:
          lightup(arrayBuilder(11, H1, true));
          break;
        }
        break;
        
        case 3:
        switch (fin){
          case 1:
          lightup(arrayBuilder(4, H1, true));
          break;

          case 2:
          lightup(arrayBuilder(1, H1, true));
          break;

          case 4:
          lightup(arrayBuilder(2, H1, false));
          break;
        }
        break;
        
        case 4:
        switch (fin){
          case 1:
          lightup(arrayBuilder(3, H1, false));
          break;

          case 3:
          lightup(arrayBuilder(2, H1, true));
          break;

          case 5:
          lightup(arrayBuilder(6, H1, true));
          break;
        }
        break;
        
        case 5:
        switch (fin){
          case 1:
          lightup(arrayBuilder(5, H1, true));
          break;

          case 4:
          lightup(arrayBuilder(6, H1, false));
          break;

          case 6:
          lightup(arrayBuilder(7, H1, false));
          break;
        }
        break;
        
        case 6:
        switch (fin){
          case 1:
          lightup(arrayBuilder(8, H1, false));
          break;

          case 5:
          lightup(arrayBuilder(7, H1, true));
          break;

          case 7:
          lightup(arrayBuilder(10, H1, true));
          break;
        }
        break;
        
        case 7:
        switch (fin){
          case 1:
          lightup(arrayBuilder(9, H1, true));
          break;

          case 2:
          lightup(arrayBuilder(11, H1, false));
          break;

          case 6:
          lightup(arrayBuilder(10, H1, false));
          break;
        }
        break;
      }
    }
  }

int* arrayBuilder(int row, int hexigon[12][10], bool reverse){
  int rod[10];
  if (reverse){
    for (int i=9; i>=0;i--){
      rod[i] = hexigon[row][i];
    }
  }else{
    for (int i=0; i<10;i++){
      rod[i] = hexigon[row][i];
    }
  }
  return rod;
}

void lightup(int rod[10]){
  int i = 0;
  while (i<10){
    EVERY_N_MILLISECONDS(50){
      leds[rod[i]] = leds[i] = CHSV(255, 255, 255);
      fadeToBlackBy( leds, NUM_LEDS, 10);
    }
  }
  
  FastLED.show();
}

Вот декодированное исключение из декодера исключений:

 EXCVADDR: 0x00000000 Decoding stack results 0x400d0cc7:
path_taker(int*, int (*) [10]) at C:\Users\****\Documents\Arduino\Wall_Art_MKI/Wall_Art_MKI.ino line 75

0x400d0d3e: loop() at C:\Users\****\Documents\Arduino\Wall_Art_MKI/Wall_Art_MKI.ino line 44

0x400d1315: loopTask(void*) at C:\Users\*****\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.6\cores\esp32\main.cpp line 23

0x40085d81: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143 

Я опубликовал это на Reddit, и пользователь предположил, что ошибка произошла в строке 201. Проблема в том, что я пытаюсь вернуть указатель на локальную переменную внутри функции ArrayBuilder.

Я проводил исследования на эту тему, но до сих пор не могу понять, как устранить ошибку.

Я был бы очень признателен за любой совет!

, 👍-1


1 ответ


0

Вместо того, чтобы пытаться вернуть указатель на локальную переменную (что всегда обречено на неудачу, поскольку в итоге вы получаете указатель на мусор), вы должны создать свой массив вне функции и передать указатель на него в качестве параметра, а затем заполнить этот массив через указатель:

void arrayBuilder(int row, int hexigon[12][10], bool reverse, int *rod){
  if (reverse){
    for (int i=9; i>=0;i--){
      rod[i] = hexigon[row][i];
    }
  }else{
    for (int i=0; i<10;i++){
      rod[i] = hexigon[row][i];
    }
  }
}

Затем...

int rod[10];
arrayBuilder(rownum, myhex, false, rod);
,