Lecture d'un tableau à deux dimensions dans un objet

Bonjour à tous,
Je viens vers vous suite à un petit soucis dans la lecture de tableau à deux dimensions passé en attribut d’un objet.
Le tableau est copié dans un membre privé de l’objet puis parcouru (pour vérification, ce n’est pas le but ultime…) et le résultat n’est pas bon pour les 2 premiers éléments de mon tableau…
J’ai d’autres souci lorsque j’augmente la taille du tableau, mais ceci est une autre histoire et probablement résolu après vos lumières éclairées.
Une dernière info je compile pour un ESP8266.

Le code seras certainement plus parlant
DEV.INO

int oneArray [1][4] = {{7, 2, 3, 4}};
Number one(oneArray, 1);

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

void loop() {
  one.begin(&Serial);
  one.draw();
  delay(1000);
}

Number.cpp

#include "Number.h"

Number::Number(int (coords)[][4], int nb_lines ) {
  for (int i = 0; i < nb_lines ; i++) {
    for (int j = 0; j < 4; j++) {
      _coords[i][j] = coords[i][j];
    }
  }
  _nbreLigne = nb_lines;
}


void Number::begin( HardwareSerial *serial) {
  _stream = serial;
}

void Number::draw() {
  for (int i = 0; i < _nbreLigne; i++) {
    _stream->println("###########");
    _stream->println(i);
    for (int j = 0; j < 4; j++) {
      _stream->println("*************");
      _stream->println(_coords[i][j]);
    }
    _stream->println("*************");
  }
  _stream->println("###########");
}

NUMBER.H

#ifndef __NUMBER_H
#define __NUMBER_H
#include "Arduino.h";
class Number {
  public:
    Number(int (coords)[][4], int nb_lines);

    void draw();
    void begin( HardwareSerial *serial);
  private:
    int _coords[][4] ;
    int _nbreLigne;
    HardwareSerial *_stream;
};
#endif //__NUMBER_H

Enfin le résultat:

###########
0
*************
1
*************
1073668908
*************
3
*************
4
*************

alors que j’attend :

###########
0
*************
7
*************
2
*************
3
*************
4
*************

Merci d’avance.

caps1g3f:

Number::Number(int (coords)[][4], int nb_lines ) {

C'est quoi ces parenthèses autour de coords ?
Enlève-les pour voir... (.cpp et .h)

@biggil, honnêtement je ne me souviens plus trop pourquoi ces parenthèse - un copier/coller malheureux probablement. En tout état de cause, cela ne change rien :neutral_face:.
Les données érronée sont toujours les 2 ières et toujours avec la même valeur...
Franchement je ne vois pas ou cela peut être :

  • à l'initialisation dans la copie dans le membre privé ?
  • à la lecture
  • ou dans l'affichage ?

Merci pour le coup de main.

Je ne suis pas certain que cette déclaration puisse fonctionner

  private:
    int _coords[][4] ;

Comment l'espace mémoire pour stocker le tableau peut-il être réservé???
Je pense que ce que tu affiches c'est le contenu de

    int _nbreLigne;
    HardwareSerial *_stream;

@fdufnew, la syntaxe sans valeur est OK d'aprés ce que j'en connais : seule la dernière dimension est obligatoire.
L'affichage (ie utilisation de stream) n'est pas obligatoire, peut être erroné (peut être mais uniquement sur les deux premiers éléments, pkoi pas tous ?) ce n'est pas le but de l'objet Number, cependant bien pratique pour vor si les données passé en param sont bonne.

Si on prend le prb autrement : je souhaite créer un objet qui prenne en paramétre un tableau , les conserve en attribut privé et puisse les utiliser. Je continu mes recherches, mais il doit bien y avoir un moyen.

Merci

fdufnews:
Je ne suis pas certain que cette déclaration puisse fonctionner

  private:

int _coords[4] ;


...

Et je suis certain qu'elle ne peut pas fonctionner :slight_smile:
Un objet occupe un espace de taille fixe en RAM.

A toutes fin utiles je suis arrivé à mes fins de la manière suivante :
Number.h

class Number {
  public:
    Number(Coord *coords, int nb_lines);
    void draw();
    void begin( HardwareSerial *serial);
  private:
    Coord *_coordo ;
    int _nbreLigne;
    HardwareSerial *_stream;
};

Number.cpp

Number::Number(Coord *coords, int nb_lines ) {
  _coordo = new Coord [nb_lines];
  for (int i = 0; i < nb_lines ; i++) {
    _coordo[i] = coords[i];
  }
  _nbreLigne = nb_lines;
}

Main.ino

#include "Number.h"
Coord oneArray[2] = {{4, 1, 5, 1}, {5, 2, 5, 7}};
Number one(oneArray, 2);
void setup() {
  Serial.begin(115200);
}
void loop() {
  one.begin(&Serial);
  one.draw();
  delay(1000);
}

J’ai remplace mon tableau a deux dimension par un tableau de structure (peut être equivalent), mon constructeur prend un pointeur vers ma structure (equiv à un tableau de structure) et je construit dynamiquement mon membre privé avec le mot clé ‘new’.
Je me suis largement inspiré de ce topic SO, je ne sais pas si je vais au devant de prb mais pour le moment ça fait le job.
Titre modifié, pour plus de clarté et passé en Résolu