convertir le vecteur en caractère ** C ++

J’ai un vector variable. Je dois le transmettre à une méthode qui accepte char** tant que paramètre d’entrée.

comment faire ça? Si possible, j’ai besoin de passer un écrit.

Mise à jour 1: Dans un outil de création de méthode de service, je donne les parameters sous la forme std :: vector, mais définit automatiquement le qualificateur sur &, ce qui signifie que la définition de ma méthode générée par l’outil ressemblera à:

 std::ssortingng SvcImpl::myMethodname ( const std::ssortingng par1, const std::vector& par2, const std::vector& par3 ) { } 

Cette méthode est appelée automatiquement avec les valeurs du paramètre patameter passées. Maintenant, à l’intérieur de cette méthode, je vais appeler une méthode dans une DLL dans un dossier lib qui ressemble à ceci:

 int method_to_be_called(char* par1, char ** par2, char ** par3, void* pRetValue); 

pour par1 -> je passe (char *) par1.c_str ()

J’ai besoin de savoir comment passer des variables pour Par2 et Par3 et pour pRetValue. les valeurs pour par2 et par3 sont disponibles dans vector, mais le dernier paramètre pRetValue est un paramètre de sortie que j’ai besoin de renvoyer sous la forme std :: ssortingng.

désolé si je suis très déroutant ou si je pose des questions très basiques.

Il est possible de résoudre le problème sans copier tous les std::ssortingngs tant que la fonction ne modifie pas le caractère transmis char** . Sinon, je ne vois pas d’autre solution que de tout copier dans une nouvelle structure char ** ` (voir deuxième exemple) .

 void old_func(char** carray, size_t size) { for(size_t i = 0; i < size; ++i) std::cout << carray[i] << '\n'; } int main() { std::vector ssortingngs {"one", "two", "three"}; std::vector cssortingngs; cssortingngs.reserve(ssortingngs.size()); for(size_t i = 0; i < strings.size(); ++i) cstrings.push_back(const_cast(ssortingngs[i].c_str())); // Do not change any of the ssortingngs here as that will // invalidate the new data structure that relies on // the returned values from `c_str()` // // This is not an issue after C++11 as long as you don't // increase the length of a ssortingng (as that may cause reallocation) if(!cssortingngs.empty()) old_func(&cssortingngs[0], cssortingngs.size()); } 

EXEMPLE 2: Si la fonction doit modifier les données transmises:

 void old_func(char** carray, size_t size) { for(size_t i = 0; i < size; ++i) std::cout << carray[i] << '\n'; } int main() { { // pre C++11 std::vector ssortingngs {"one", "two", "three"}; // guarantee contiguous, null terminated ssortingngs std::vector> vssortingngs; // pointers to rhose ssortingngs std::vector cssortingngs; vssortingngs.reserve(ssortingngs.size()); cssortingngs.reserve(ssortingngs.size()); for(size_t i = 0; i < strings.size(); ++i) { vstrings.emplace_back(strings[i].begin(), strings[i].end()); vstrings.back().push_back('\0'); cstrings.push_back(vstrings.back().data()); } old_func(cstrings.data(), cstrings.size()); } { // post C++11 std::vector ssortingngs {"one", "two", "three"}; std::vector cssortingngs; cssortingngs.reserve(ssortingngs.size()); for(auto& s: ssortingngs) cssortingngs.push_back(&s[0]); old_func(cssortingngs.data(), cssortingngs.size()); } } 

REMARQUE: révisé pour fournir un meilleur code.

La réponse de Galik pose un certain nombre de problèmes de sécurité. Voici comment je le ferais en C ++ moderne:

 #include  #include  #include  void old_func(char** carray, std::size_t size) { for(std::size_t i(0); i < size; ++i) std::cout << carray[i] << '\n'; } void other_old_func(const char** carray, std::size_t size) { for(std::size_t i(0); i < size; ++i) std::cout << carray[i] << '\n'; } int main() { { std::cout << "modifiable version\n"; std::vector ssortingngs{"one", "two", "three"}; std::vector cssortingngs{}; for(auto& ssortingng : ssortingngs) cssortingngs.push_back(&ssortingng.front()); old_func(cssortingngs.data(), cssortingngs.size()); std::cout << "\n\n"; } { std::cout << "non-modifiable version\n"; std::vector ssortingngs{"four", "five", "six"}; std::vector cssortingngs{}; for(const auto& ssortingng : ssortingngs) cssortingngs.push_back(ssortingng.c_str()); other_old_func(cssortingngs.data(), cssortingngs.size()); std::cout << std::endl; } } 

Pas de gestion de la mémoire en désordre ou méchant const_cast s.

Live sur Coliru.

Les sorties:

 modifiable version one two three non-modifiable version four five six