Mega 2560 Funcion que devuelve array

Hola a todos, estoy programando un a placa arduino y estoy utilizando C++ ,

Tengo algunos conocimientos de otros lenguajes como java, javascript, php... pero de C++ no estoy muy puesto

Pues bien este es mi problema, creo que es algo bastante sencillo pero no consigo el resultado adecuado.

Tengo 3 variales

//elementos
int elemento1 = 1;
int elemento2 = 2;
int elemento3 = 3;

y un array de 5 elementos tipo int;

int* array_1;
int* array_2;
int* array_3;

pues bien , creo una funcion que recibe un elemento , calcula los primeros elementos de la tabla de mutiplicar:
y devuelve el array con los elemtos

/**
   Calculo de los valores y carga en un array
*/
int*  carga_array (int valor) {

  //declaracion de array temporal y lo devuelvo
  int* array_temp;;

  //calculo de las variables
  array_temp[0] = valor;
  array_temp[1] = valor * 1;
  array_temp[2] = valor * 2;
  array_temp[3] = valor * 3;
  array_temp[4] = valor * 4;

  return array_temp;

}

y otra funcion que los muestra pon una consola

/**
  Mostrar por pantalla
*/
void mostrar(int* datos) {

  Serial.println("************ELEMENTO : " + (String)datos[0] + " **************************");
  Serial.println("Elemento 1: " + (String)datos[1]);
  Serial.println("Elemento 2: " + (String)datos[2]);
  Serial.println("Elemento 3 : " + (String)datos[3]);
  Serial.println("Elemento 4 : " + (String)datos[4]);
  Serial.println("********************************************************************");

}

//En el loop declaro

//carga del array_1 con los datos de la funcion
array_1=carga_array(elemento1);

//lo mostramos por pantalla
mostrar(array_1);

pues bien por consola, nos muestra datos correctos.

************ELEMENTO : -256 **************************
Elemento 1: 256
Elemento 2: -16270
Elemento 3 : 8703
Elemento 4 : 770
********************************************************************

Creo que tiene algo que ver con la referencia a la memoria de los elementos del array,

Tambien tengo problemas a la hora de definir el tamaño correcto de los array, de ahi que tengan esa anotacion int* que no se lo que significa

Como podria ejecutar este ejercicio?

Agradeceria mucho vuestra ayuda

jjmoya:
Tengo algunos conocimientos de otros lenguajes como java, javascript, php... pero de C++ no estoy muy puesto

Me doy cuenta. Aquí la manera de manejar la memoria es más "manual".

int* array_temp;;

Esto es un puntero de memoria, una variable que almacena una dirección de memoria; el tipo de dato solo indica cómo debe interpretarse el contenido en la posición (entre otras cosas). Puede apuntar a un array (que aquí es simplemente espacio contiguo destinado para tal función), pero no es así como se crea.

Retornar int* es solo retornar el puntero. No estoy seguro de qué sucede al hacerlo si se devuelve la referencia a un array creado dentro de la función; hay dos posibilidades:

  • El espacio se "libera" (solo se considera libre, no borra nada inmediatamente), lo que convertiría al puntero retornado, en una referencia a espacio libre o array que potencialmente se puede modificar inesperadamente.
  • Al retornarlo, el compilador entienda que ese espacio debe mantenerse asignado aunque la función muera; lo que llevaría a la "fuga de memoria" si el llamador no almacena el puntero resultante.

Como el puntero solo se declara y no el array en sí, el resultado fue modificar los primeros 10 bytes de la memoria RAM, o desde alguna posición aleatoria. Tuviste suerte que no se te colgara el programa.

A diferencia de lenguajes como Java, el C++ de Arduino no implementa excepciones; en su lugar tenemos el "comportamiento indefinido", que es todavía peor porque puede provocar cuelgues cuya causa no es tan fácil de localizar.

Muchas gracias por la contestacion, googleando un poco he dado con la solucion:

// Funcion de copiar (origen , destino,size del array)
void copy(int* src, int* dst, int len) {
    memcpy(dst, src, sizeof(src[0])*len);
}

Aqui dejo el ejemplo por si a alguien le puede valer :

///ejemplo de majeno de arrays
using namespace std;

//array para recoger los valores de
int array_1 [5];
int array_2 [5];
int array_3 [5];


int array_temp [5];


//elementos
int elemento1 = 1;
int elemento2 = 2;
int elemento3 = 3;

void setup() {
  //puerto serie
  //incializacion
  Serial.begin(115200);

  Serial.print("INICIO...");
}

void loop() {
  //carga del array
  carga_array (elemento1,array_1);
  //lo mostramos por pantalla
  mostrar(array_1);
    //carga del array
  carga_array (elemento2,array_2);
  //lo mostramos por pantalla
  mostrar(array_2);

  delay(1000);

}



////FUNCIONES/////
/**
  Mostrar por pantalla
*/
void mostrar(int* datos) {

  Serial.println("************ELEMENTO : " + (String)datos[0] + " **************************");
  Serial.println("Elemento 1: " + (String)datos[1]);
  Serial.println("Elemento 2: " + (String)datos[2]);
  Serial.println("Elemento 3 : " + (String)datos[3]);
  Serial.println("Elemento 4 : " + (String)datos[4]);
  Serial.println("********************************************************************");

}

/**
   Calculo de los valores y carga en un array
*/
void carga_array (int valor,int destino[5]) {

  //calculo de las variables
  array_temp[0] = valor;
  array_temp[1] = valor * 1;
  array_temp[2] = valor * 2;
  array_temp[3] = valor * 3;
  array_temp[4] = valor * 4;
  
  //copiamos el array
  copy(array_temp,destino,5);

}

// Funcion de copiar 
void copy(int* src, int* dst, int len) {
    memcpy(dst, src, sizeof(src[0])*len);
}