Bonjour, j'ai un vector<Point> = [A,B ; C,D ; E,F; G,H] que j'aimerais convertir en array. J'ai donc créé un tab tel que int tab[4][4] . J'ai essayé de faire par une boucle for, puis la méthode copy(Point.begin(),Point.end(),tab) et avec memcpy, cela ne fonctionne pas. Auriez vous une solution ? Merci
En c++ on évite d'utiliser les tableaux à la C comme int[4][4] mais on privilégiera les containeurs de la STL en faisant éventuellement des tableaux de struct plutôt que des tableaux à deux dimensions (qui sont juste des tableaux e tableaux)
Pour une structure simple telle qu'un point (qu'il soit 2D ou 3D), avoir un std::vector<Point> me semble donc être une bonne chose. Si tu connais le nombre de point que tu auras à l'avance, std::array<Point,4> fait l'affaire
Sans info supplémentaire, difficile de dire si ta volonté de te ramener à un tableau int[4][4] est légitime ou farfelue. On est dans le cas d'un problèmeXY.
Tu nous poses une question sur la solution Y que tu veux implémenter pour résoure ton problème X mais tu ne nous explique pas le problème X.
Commence par nous expliquer ton problème de base avant de nous proposer ta tentative de solution et peut-être qu'on se rendra compte qu'il existe une bien meilleure solution que ce que tu essayes de faire avec du code C-style
Qu'est ce qu'un tableau à la C te permettrait de faire qu'un std::vector ne te permet pas ?
A priori rien, à moins d'interfacer son code C++ avec du code ou une interface C existante, on ne fait jamais ce que tu essayes de faire.
Les containeurs de la bibliothèque standard te permettent de faire tout ce que les tableaux C permettent et même plus. Ils apportent aussi beaucoup plus de sécurité et t'empêchant (entre autre) d'accéder à des indices hors limite du tableau
Avec le peu d'info à ma disposition je dirais que c'est une mauvaise idée de vouloir glisser du C dans ton code C++, ca ne t'apportera rien de plus à part des risques d'erreurs
- Edité par ThibaultVnt 25 octobre 2021 à 10:57:08
Si par exemple je veux récupérer la valeur en X je devrais écrire points[1][1] or cela ne fonctionne pas. Donc je me suis dis en mettant ces valeurs dans un array je pourrais mieux récupérer les valeurs.. Je me trompe peut être...
memcpy ça ne peux fonctionner qu'avec de simples structs qui sont "trivially copyable". D'une manière en général en C++, tu peux oublier cette technique. std::copy fera le nécessaire pour que les objets soient correctement copiés quels qu’ils soient.
Dans tous les cas, tu ne peux pas faire ce que tu veux, car cv::Point ne définit pas operator[], donc il faut manuellement aller chercher le "x" et le "y". Ou faire un wrapper. Aussi, la variable "hull" n'a pas forcément besoin de contenir de la mémoire quand elle fait juste référence à "points", dans ce cas, il est préférable de faire un std::move pour éviter de copier les points, mais ce n'est pas bon non plus.
Point est un typedef vers la classe Point2i qui est lui même un typdef vers le type cv::Point<int>. Si on regarde la doc de cette classe elle est composé de 2 champ publics x et y
Tu peux donc y accéder en lecture et écriture comme ceci :
Point p{}; // création d'un point vide
p.x = 10; // Affectation
p.y = 5;
std::cout << p.x << " : " << p.y
Point ne connait pas l'opérateur [] c'est pour ça que tu ne peux pas faire de std::cout<<points[1][1]
Ce que je veux dire par là, c'est que la variable "hull" permet juste de choisir l'un ou l'autre des vector, de manière à ce que le code qui suit ne se pose pas la question de quel vector il manipule, c'est le même quelque soit le vector derrière.
Dans ce cas, la variable "hull" devrait plutôt être une référence sur l'un ou l'autre des vector. En supposant que "convexHull" retourne un nouveau vector contenant le résultat, on pourrait faire un truc comme ça :
A noter que tu peux modifier facilement la manière 2 et 3 pour garder ta fonction "convexHull" qui ne renvoie pas de nouveau vector (mais d'ailleurs pourquoi ne pas lui faire renvoyer un nouveau vector ?)
Et aussi, je pense que tu ne veux pas faire des "using namespace", même si c'est tentant à première vue de ne pas avoir à tout préfixer, ça reste bien d'être clair sur d'où vienne les éléments, surtout si on utilise beaucoup de librairies
Oui j'ai compris. Ca fonctionne ! Mais, je suis embeter pour transférer mon "vector" de mon code.cpp à mon main... Comment je dois le déclarer dans ma fonction ? Car si je fais "vector<Point>hull" forcement cela ne fonctionne pas..
La gentillesse est le langage qu'un sourd peut entendre et qu'un aveugle peut voir.
Il n'y a qu'un seul monde et il est faux, cruel, contradictoire, séduisant et dépourvu de sens. Un monde ainsi constitué est le monde réel. Nous avons besoin de mensonges pour conquérir cette réalité, cette "vérité".
Une struct c'est fait pour "créer un nouveau type" en regroupant plusieurs données. Par exemple :
struct Point3D {
int x = 0;
int y = 0;
int z = 0;
}
Ici je défini une structure qui contient 3 entiers et qui me permet de créer de variables de type Point3D. On peut dire que Point3D c'est "le nom" de ma structure.
Quel est le nom de ta structure ? Quel est l'intéret de faire une stucture pour n'y ranger qu'un seul élément. Typedef c'est utilisé en C
Soit t'es en C et tu fais quelque chose cette forme là :
typedef struct {
TYPE var1;
TYPE var2;
// d'autres variables de n'importe quel type
} NOM_DE_La_STRUCTURE
Soit t'es en C++ et tu fais directement
struct NOM_DE_LA_STRUCTURE {
TYPE var1;
TYPE var2;
// d'autres variables de n'importe quel type
}
Tu es sûr que tu as bien assimilé les bases du C++ ? Tu fais beaucoup de truc à la C dans un code C++ et tu n'as pas l'air au point sur la synthaxe de déclaration des structures ni sur leur utilisation
OpenCV n'est pas non plus une lib très simple à utiliser si on a pas les bases solides. Peut-être devrait tu lever le pied et repasser un peu de temps à consolider ces bases sur un bon cours de C++
Oui d'accord je comprends ! Je me mélange encore les pinceaux entre le C et C++. Merci de votre aide à tous !
Tu peux mettre en résolu le sujet alors...
La gentillesse est le langage qu'un sourd peut entendre et qu'un aveugle peut voir.
Il n'y a qu'un seul monde et il est faux, cruel, contradictoire, séduisant et dépourvu de sens. Un monde ainsi constitué est le monde réel. Nous avons besoin de mensonges pour conquérir cette réalité, cette "vérité".
Conversion vector en tableau
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
La gentillesse est le langage qu'un sourd peut entendre et qu'un aveugle peut voir.
Il n'y a qu'un seul monde et il est faux, cruel, contradictoire, séduisant et dépourvu de sens. Un monde ainsi constitué est le monde réel. Nous avons besoin de mensonges pour conquérir cette réalité, cette "vérité".
La gentillesse est le langage qu'un sourd peut entendre et qu'un aveugle peut voir.
Il n'y a qu'un seul monde et il est faux, cruel, contradictoire, séduisant et dépourvu de sens. Un monde ainsi constitué est le monde réel. Nous avons besoin de mensonges pour conquérir cette réalité, cette "vérité".