вернуть байтовый массив с Arduino - PullRequest
0 голосов
/ 23 октября 2019

У меня есть массив, содержащий bytes информации (полезная нагрузка), но я хочу использовать этот массив в двух функциях. Как я могу вернуть его? Я не знаю, должен ли я объявить это иначе или в другом месте.

Мой код:

void loop() {
    byte payload[] = find_fix();
    delay(5*60000);
}


byte find_fix(){
    byte payload[9];

    double lati = sodaq_gps.getLat();
    double longi = sodaq_gps.getLon();
    int nsatis = sodaq_gps.getNumberOfSatellites();
    long lax = lati * 10000000;
    long lox = longi * 10000000;

    payload[0] = (byte) ((lax & 0xFF000000) >> 24 );
    payload[1] = (byte) ((lax & 0x00FF0000) >> 16 );
    payload[2] = (byte) ((lax & 0x0000FF00) >> 8 );
    payload[3] = (byte) ((lax & 0X000000FF));
    payload[4] = (byte) ((lox & 0xFF000000) >> 24 );
    payload[5] = (byte) ((lox & 0x00FF0000) >> 16 );
    payload[6] = (byte) ((lox & 0x0000FF00) >> 8 );
    payload[7] = (byte) ((lox & 0X000000FF));
    payload[8] = (byte) (nsatis);
    SerialUSB.print(" MIGUEL. LATITUD: ");
    SerialUSB.print(payload[0], HEX);
    SerialUSB.print(payload[1], HEX);
    SerialUSB.print(payload[2], HEX);
    SerialUSB.println(payload[3], HEX);
    SerialUSB.print(" MIGUEL. LONGITUD: ");
    SerialUSB.print(payload[4], HEX);
    SerialUSB.print(payload[5], HEX);
    SerialUSB.print(payload[6], HEX);
    SerialUSB.println(payload[7], HEX);
    SerialUSB.print(" MIGUEL. Num Sats: ");
    SerialUSB.println(payload[8], HEX);

    return payload[];
}

Я хочу использовать 9 байтов информации, сначала я объявляю это byte payload[9]; а потом я начинаю писать на нем. Это хорошо работает, но теперь я хочу вернуть его для использования в других функциях, но не могу.

1 Ответ

2 голосов
/ 23 октября 2019

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

byte* find_fix(){
    byte* payload = new byte[9]; // Allocate memory on the heap

    return payload;
}

void loop() {
    byte* payload = find_fix();
    delete[] payload; // Free memory once it is no longer needed
}

Или, если вы знаете максимальный размер массива, вы можете передать в память функции find_fix следующим образом. ..

void find_fix(byte* payload) {
    ....
}

void loop() {
    byte payload[9];
    find_fix(payload);
}
...