Aller au contenu


Photo
- - - - -

Utiliser un tableau 2 dimensions en paramètre d'une fonction


  • Veuillez vous connecter pour répondre
25 réponses à ce sujet

#21 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 18 janvier 2019 - 09:04

Ta première solution est très proche (le 2eme readtab) de celle que je proposais ici, https://www.robot-ma...ruped/?p=101630 .
Comme je le disais dans ce poste, cette solution est un grand classique qui consiste à parcourir un tableau 2D, en une seule dimension.
C'est cette solution que je retiens pour la nouvelle version de mon programme.

Le malloc ? Non, vraiment pas. Pour le coup, je ne trouve pas cela lisible.
Le sizeof(double), une erreur ?

Merci pour ton aide.

#22 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 18 janvier 2019 - 09:34

Ah oui le sizeof(Double) est pas beau :) D'ailleurs le sizeof(int) de la ligne du dessus est pas forcément toujours vrai, le premier c'est la taille de N pointeurs (souvent de la taille d'un int mais bon faut faire gaffe), bref un sizeof(int*) serait mieux.

 

Bah en fait le malloc il est pas à prendre en compte, c'est la fonction que tu veux réutiliser, l'initialisation du tableau c'est pour l'exemple.

 

Ce que j'aime bien dans cette solution c'est le fait de pouvoir utiliser qqc qui rappelle vraiment un tableau à deux dimensions et l'utiliser comme tel.

 

 

Pour la petite précision, effectivement on peut mettre "int t[l][c]" plutot que "int t[][c]", mais dans l'absolu ça ne sert à rien d'avoir la taille de la première colonne, on le voit quand on y accède de la façon "t[i*c+j]" qui n'utilise pas le nombre de ligne.

 

Après un peu de réflexion, je pense qu'on ne pourra pas utiliser un tableau static (int[][]) en entrée sur un int**, même si l'un peut se faire passer pour l'autre, dans l'absolu ces deux déclarations n'ont pas la même sémantique au final, l'un est vraiment un tableau (donc un espace mémoire de nbLigne*nbColonnes continu), l'autre un pointeur qui pointe sur un pointeur qui pointe vers un entier.

 

 

Même si j'ai pas eu bcp de temps, j'ai bien aimé, ça faisait longtemps que j'avais pas trop réfléchi à comment ça marche en vrai, et c'est la que je vois qu'il me manque quelques notions sur le fonctionnement interne du C.


  • Oracid aime ceci

#23 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 20 janvier 2019 - 04:58

Merci Mike !

Je dois avouer que la simplicité de ton exemple m'a perturbé l'esprit.
J'ai cherché pourquoi je n'avais pas tester cela.
Et j'ai trouvé !
Dans ma fonction, je ne suis pas censé connaitre les tailles du tableau que je dois donc passer en paramètres.
Exemple : void readtab (int tab[][], int l, int c ) { }
Malheureusement, cela ne fonctionne pas.
Cherche sur le web et tu verras que je ne suis pas le premier à avoir ce problème qui revient de manière récurrente.

 

 

 

Cela compile, mais ça donne n'importe quoi.
Sinon, Cocothebo et Mike, ma dernière version de programme plus haut, il ne vous convient pas ?

const int lg=2; 
const int cl=2;
int tab[lg][cl]= {{0, 1},
                  {2, 3}};

void setup() { 
  Serial.begin(9600);
  readtab((int**)tab, lg, cl);
}

void loop() {}

void readtab (int **tab, int l, int c) {
  for(int i = 0; i < l; i++) {
    for(int j = 0; j < c; j++) {
      Serial.println(tab[i][j]);
    }
  }
}

 

 

Donc je suppose que c'est ça que tu cherches à faire : 

 

int tab0[] = {0,1};
int tab1[] = {2,3};
int *tab[] = {tab0, tab1};

void setup() { 
  Serial.begin(9600);
  readtab(tab, 2, 2);
}

void loop() {}

void readtab (int** tab, int l, int c) {
  for(int i = 0; i < l; i++) {
    for(int j = 0; j < c; j++) {
      Serial.println(tab[i][j]);
    }
  }
}

Quoi qu'il en soit quand je relis ton code de base je le trouve lourd ... Je sais pas si utiliser cette méthode va l'alléger suffisament pour que j'arrête de le trouver lourd... Et je trouve le choix "ligne / colone " assez perturbant ... 

Il me parraît plus logique de mettre autant de colone qu'il y a de servo et autant de ligne que de positions successives que tu veux jouer ... 

Mais bon là je suppose que c'est surtout une question de point de vue ...


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#24 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 20 janvier 2019 - 07:53

Mais bon là je suppose que c'est surtout une question de point de vue ...

Ah, oui, vraiment ! J'ai suivi cette démarche parce que je rajoutais une ligne à chaque fois que je rajoutais un servo.
Si tu n'as qu'un seul servo, tu vas bien avoir qu'une seule ligne. Et donc, si tu ajoute un deuxième servo, logiquement tu ajoute une nouvelle ligne. Mais tu as raison, c'est vraiment une question de point de vue.

En tout cas, ton code est vraiment intéressant !
J'ai lu, mais je ne me rappelle plus où, qu'au travers d'une structure on pouvait passer un tableau en 2D. Cela ressemble un peu à ta solution. Non ?
  



#25 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 20 janvier 2019 - 08:59

En tout cas, ton code est vraiment intéressant !
J'ai lu, mais je ne me rappelle plus où, qu'au travers d'une structure on pouvait passer un tableau en 2D. Cela ressemble un peu à ta solution. Non ?
 

 

Hum... Non pas du tout.

 

tab0 est un pointeur sur le tableau d'entier {0,1}
tab1 est un pointeur sur le tableau d'entier {2,3}

tab est un pointeur sur le tableau de pointeurs {tab0, tab1}

 

Mais oui il existes d'autres méthodes encore ... 

Il y a la technique de mettre la taille au début du tableau, ( genre si tu veux avoir des tableaux qui pointent sur des tableaux qui vont avoir différentes longueurs ... tu peux faire des classes ... Une structure tableau + taille ...

 

 

Par contre pour les lignes et les colonnes, pour moi, le nombre de moteurs sur un quadrupède reste " une constante N fixe connue" 
et le nombre de position que le robot va prendre est un nombre potentiellement "infini  x"...
Du coup je fais des lignes qui contiennent le N fixe de servo et les x lignes ... qui tendent vers l'infini ...

 

 

Pour reprendre l'exemple de briel le robot bipède, j'ai 10 servo qui est un nombre fixe, et je crée autant de tableau que de pose que le robot peut prendre. 

Et du coup j'ai un "player de pose " qui permet de jouer tous les servo en passant d'une pose à une autre de manière fluide avec autant de crans que tu veux / à la vitesse que tu veux  ... Sans avoir à découper le mouvement manuellement ... Et en pouvant changer à la volée la position suivante en cours en partant de la position où en sont chaque servomoteurs ... 
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#26 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 20 janvier 2019 - 12:11

Par contre pour les lignes et les colonnes, pour moi, le nombre de moteurs sur un quadrupède reste " une constante N fixe connue"

Non, pas du tout ! Aujourd'hui, j'ai 8 servos, demain je peux passer à 12.

Et du coup j'ai un "player de pose " qui permet de jouer tous les servo en passant d'une pose à une autre de manière fluide avec autant de crans que tu veux / à la vitesse que tu veux ... Sans avoir à découper le mouvement manuellement ... Et en pouvant changer à la volée la position suivante en cours en partant de la position où en sont chaque servomoteurs ...

Pour moi, ce n'est pas contradictoire.

Il ne faut pas voir ce programme comme étant spécifique à mon quadrupède. L'idée, c'était de faire un petit utilitaire que chacun pouvait utiliser dans un contexte avec plusieurs servos. Histoire de faire bouger sa réalisation. Un testeur de la mécanique, en somme.




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users