1
votes

impossible de passer un tableau flottant hors d'une fonction

Je suis nouveau en C ++, et je veux passer un tableau flottant hors d'une fonction à l'aide d'un pointeur. Cependant, le tableau renvoyé est toujours 0; J'utilise un Arduino Uno.

Voici mon code. Je veux que la fonction readSensor () passe un tableau flottant composé de 3 flotteurs. Le tableau float doit être passé à la sortie du pointeur *. Mais lorsque j'imprime des lectures, il affiche 0.00 au lieu des valeurs que j'ai passées.

void setup() {
  Serial.begin(9600);
}

void loop() {
  float readings[3];
  readSensor(readings);
  for (int i = 0;i < 3;i++) {
    Serial.println(readings[i]);
  }
  delay(1000);
}

// pass out these 3 floats
float val1 = 3.14159;
float val2 = 2.741;
float val3 = 87;
void readSensor(float* output) {
  float container[3] = {val1, val2, val3};
  output = container;
}


4 commentaires

À quoi pointe la «sortie»? Un tableau modifiable d'au moins 3 éléments?


Pourquoi utilisez-vous un pointeur brut en C ++? Cela fait-il partie de l'interface?


ce que j'espère faire est de passer le tableau de conteneurs au tableau "output", qui sont les "lectures" dans mon cas. Je suis vraiment nouveau, peut-être que ce n'est pas la bonne façon de faire.


@ Steven97102 Vous utilisez la mauvaise construction. Utilisez simplement std :: array , pas des tableaux stupides, et la plupart de votre code resterait le même.


3 Réponses :


2
votes
void readSensor(float* output) 
{
    float container[3] = {val1, val2, val3};
    for (int i=0; i<3; i++)
    {
        output[i] = container[i];
    }   
}
Please vote-up and accept the answer if it was useful

5 commentaires

Bonne réponse, mais il serait utile d'expliquer pourquoi.


Techniquement correct, mais il est important d'expliquer que c'est une mauvaise façon de renvoyer un tableau.


Pouvez-vous expliquer quelle est la meilleure approche?


@ Steven97102 Utilisez std :: array et ne regardez jamais en arrière.


@ Steven97102 Je pense que la description de ce lien vous aidera



1
votes
void readSensor(float* output) {
  float container[3] = {val1, val2, val3};
  output = container;
}
Here you are creating an array container on the stack and initializing it, and assigning the address of its first element to output. You then destroy container when you reach the end of the function, and by the time the function returns, the array that output used to point to no longer exists.j.doe's answer is one solution to this, but you have to be careful to ensure output already points to an array of sufficient size before assigning values to it. You could also consider looking into std::array or std::vector.

2 commentaires

Non seulement le tableau sur lequel la sortie désignait autrefois n'existe plus, mais la sortie n'existe plus. L'attribution d'une valeur à un paramètre non référencé ne change rien au code appelant.


@JaMiT Vous avez raison, j'ai raté la façon dont l'OP appelait la fonction. Bonne prise



5
votes

Vous ne pouvez pas "passer un tableau hors d'une fonction" comme vous le recherchez. C ++ n'offre pas un tel mécanisme en utilisant simplement un pointeur et un tableau brut (style C).

Dans votre approche particulière

#include <vector>

std::vector<float> readSensor()
{
     float container[3] = {1, 2, 3};
     std::vector<float> output;
     for (int i = 0; i < 3; ++i)
        output.push_back(container[i]);
     return output;
}

int main()
{
     std::vector<float> result;
     result = readSensor();
     // use result here
}

conteneur cesse d'exister lorsque la fonction revient. De plus, la sortie est passée par valeur, de sorte que l'affectation output = container n'est pas visible pour l'appelant.

Il est nécessaire de passer un pointeur vers (le premier élément de) un tableau dans la fonction et demandez à la fonction de copier les données selon les besoins. Par exemple,

int main()
{
     float result[3];
     readSensor(result);   // data will be copied into result
     // use result here
}

Et l'appelant doit fournir le tableau et le transmettre.

void readSensor(float* output)
{
     float container[3] = {1, 2, 3};
     for (int i = 0; i < 3; ++i)
        output[i] = container[i];
}

Gardez à l'esprit que l'appelant est responsable de l'appel correct de la fonction. Par exemple, si l'appelant de la fonction ci-dessus passe un tableau avec deux éléments, le comportement n'est pas défini.

Une méthode préférée en C ++ est d'utiliser un conteneur standard, tel qu'un std :: vector . Par exemple;

void readSensor(float* output) {
 float container[3] = {val1, val2, val3};
 output = container;
}

Si vous ne savez pas comment utiliser les conteneurs standard, il y a beaucoup de documentation autour.


2 commentaires

Vous pouvez simplement renvoyer {1,2,3}; .


@ FrançoisAndrieux - oui, c'est vrai. Cependant, cette question est évidemment posée par un débutant. Et cette syntaxe aura l'air de renvoyer un tableau, même si elle fait quelque chose de très différent (construire un vecteur en utilisant une liste d'initialisation et renvoyer cela).