-2

I'm doing an Arduino project and I need to pass arrays with different sizes as parameter to my function.
The problem is that std::vector is not an option.

How can I do that?

463035818_is_not_an_ai
  • 109,796
  • 11
  • 89
  • 185
BrunoTS
  • 171
  • 2
  • 17

3 Answers3

2

The fallback is to pass a pointer to the first element in the array and the size:

void foo(int* arr, size_t size);

The reason for std::vector not being available on some platforms is that on some platforms dynamic allocations is a bad idea. However, once you are dynamically allocating arrays:

int* x = new int[42];
foo(arr,42);          // array decays to pointer
delete[] x;

then you could as well use std::vector.

If std::vector is not available to you, then either search for an alternative (maybe this?) or write your own. The pointer + size approach is fragile and not recommended unless absolutely necessary. The power of std::vector is from the abstract concept to encapsulate the array, its size and capacity. Nobody can prevent you to apply that concept even if you cannot use std::vector.

In case you are talking about statically sized arrays, then thats not quite the use case for std::vector. You do not need dynamic allocation, and you can pass arrays by reference. I won't repeat here what you can find in this answer (std::array) or here (c-arrays).

463035818_is_not_an_ai
  • 109,796
  • 11
  • 89
  • 185
1

Something like this should work

template<size_t N>
void DaFunction(std::array<int, N>& daArray)
Surt
  • 15,501
  • 3
  • 23
  • 39
0

you can do it without having to deal with memory allocation or pointers just by creating a string variable and a limited size array and then you start shifting

#include <Arduino.h>
class ArrayShifter
{
private:
    // String Reservoire Tank
    String _text;
    // a fixed size array of 5 in my case (depending on the amount of data you expect)
    String _viewPortArray[5];
    int _size = 0;
    // Methode to fill the array
    bool shiftArray(int position);
public:
    ArrayShifter(/* args */);
    // Method that gets the text from Serial
    String getSerialText();
    
    // get data from the array
    String getArrayData(int index);
    // array size getter
    int getSize();
    //clear the array
    void clearArray();
    //remove item
    void removeArrayItem(int index);
};

ArrayShifter::ArrayShifter(/* args */)
{
}

String ArrayShifter::getSerialText()
{
    // lesteing to the serial and returning the value
    _text = Serial.readString();
    return _text;
}
bool ArrayShifter::shiftArray(int position)
{
    /*Assuming that the data is comming separated with ";" for each row and ":" for each value
    to optimize the size of array in this way :
        name:value;age:value;gender:value;
    */
    String text = getSerialText();
    int index = 0;
    _size = 0;
    if (text.length() > 0) // text isn't empty
    {

        if (position <= 5) // if the data belongs to the first 5 range
        {

            for (int i = 0; i < 5; i++)
            {
                 // get the index of our separator that we've chosed to be ";"
                index = text.indexOf(";");
                if (index > 0)
                {
                    // index found
                    _size++;
                    // putting the value before ";" in the array
                    _viewPortArray[i] = text.substring(0, index);
                    // deleting the value from the tank
                    text = text.substring(index + 1);
                }
            }
        }
        else
        {
            _size = 0;
            // to wich range the desired index belongs
            unsigned int dataRange = ((position - position % 5));
            int ghostIndex = 0;
            // looping throught all ";" to get indexes
            for (int i = 0; i < dataRange; i++)
            {

                ghostIndex = text.indexOf(";");
                if (ghostIndex > 0)
                {
                    _size++;
                    text = text.substring(ghostIndex + 1);
                }
            }
            // grabing just 5 of the data
            for (int i = 0; i < 5; i++)
            {
                if (ghostIndex > 0)
                {
                    _size++;
                    _viewPortArray[i] = text.substring(0, ghostIndex);
                    text = text.substring(ghostIndex + 1);
                }

                // updating ghost index
                ghostIndex = text.indexOf(';');
            }
        }
        return true;
    }
    return false;
}
String ArrayShifter::getArrayData(int index)
{

    // turn the roulette
    if (shiftArray(index))
    {
        if (index <= 5)
        {
            // yes we have this
            return _viewPortArray[index];
        }
        else
        {
            // but we have to put it in the range of 5
            index = index - 5;
            return _viewPortArray[index];
        }
    }
}
int ArrayShifter::getSize()
{
    return _size;
}
 void ArrayShifter::clearArray()
 {
    for(int i  = 0 ; i <5 ; i ++)
    {
        _viewPortArray->remove(i);
        _size = 0;
    }
    
 }
 void ArrayShifter::removeArrayItem(int index)
 {
    _viewPortArray->remove(index);
    _size--;
 }

main class :

#include <Arduino.h>
#include <ArrayShifter.h>

ArrayShifter array;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while (!Serial){}
  
}

void loop() {
  
  if(Serial.available()>0)
  {
    Serial.println(array.getArrayData(7));
    int sizeOption2 = array.getSize();
    Serial.println(sizeOption2);
    array.removeArrayItem(7);
    Serial.println(array.getArrayData(7));

  }
}

please check my github repository https://github.com/Riadam/ViewPort-Array-Shifter-for-Arduino-Uno.git

ramrane
  • 1
  • 1
  • Proper answers might contain a link to your repo, but should not consist solely of a link to your repo. Stack Overflow answers should stand on their own without it being necessary to refer a repo that might not be there later, might be renamed, etc. – TomServo Aug 31 '22 at 01:50