2009-06-15 8 views
6

J'essaye d'écrire une application dans C++ managé, mais je ne peux pas m'expliquer comment déclarer un tableau de chaînes.Tableaux de chaînes dans C++ managé

Chaîne^linet [];

génère une erreur

'System :: String ^': un réseau natif ne peut pas contenir ce type géré

Je suppose qu'il ya une autre façon de le faire pour les données gérées les types. Qu'est-ce que c'est exactement?

+0

Juste un peu pinailler: Bien géré C++ et C++/CLI à ma connaissance être compilé dans le même code, ils sont en fait deux langues distinctes. –

Répondre

7

Voulez-vous vraiment dire C++ managé? Pas C++/CLI?

En supposant que vous utilisez réellement C++/CLI (en raison du message d'erreur que vous avez posté), il y a deux façons de le faire:

créera un tableau managé, soit le même type que chaîne [] en C#

gcroot<String^>[] unmanagedArray; 

va créer un tableau non géré C++ (je n'ai jamais essayé cela avec des tableaux - il fonctionne bien avec des conteneurs stl, il devrait donc travailler ici aussi).

+1

Comment cela fonctionne-t-il lorsque vous appelez String-> Split() (array of strings version)? –

+0

@ user645280 - array^sa = str-> Split (gcnew array {"un", "deux"}, StringSplitOptions :: None); Vous devez spécifier StringSplitOptions lorsque vous utilisez des chaînes spit. – erict

4

http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx

Cela devrait avoir toutes les réponses dont vous avez besoin :)

Lorsque vous travaillez avec Managed C++ (aka. C++/CLI aka. C++/CLR), vous devez tenir compte de vos types de variables dans tout ce que vous faire. Tout type "géré" (fondamentalement, tout ce qui dérive de System :: Object) ne peut être utilisé que dans un contexte géré. Un tableau C++ standard crée essentiellement un bloc de mémoire de taille fixe sur le tas, avec sizeof (type) x NumberOfItems octets, puis itère à travers cela. Un type géré ne peut pas être garanti pour rester au même endroit sur le tas qu'il était à l'origine, ce qui explique pourquoi vous ne pouvez pas le faire :)

+0

Juste un petit coup de pouce: Alors que C++ et C++/CLI seront à ma connaissance compilés dans le même code, ils sont en réalité deux langages distincts. –

+0

De https://en.wikipedia.org/wiki/Managed_Extensions_for_C%2B%2B "... Ces nouvelles extensions ont été désignées C++/CLI et incluses dans Microsoft Visual Studio 2005. [1] Le terme C++ géré et les extensions se réfère à sont donc déconseillés et remplacés par les nouvelles extensions .... "- Alors oui, vous avez absolument raison. – cwap

+0

Je l'ai seulement mentionné car Managed C++ n'utilise pas les handles (pointeurs gérés, déclarés comme 'type ^'), mais C++/CLI. ... Maintenant que j'y pense, la personne qui a posé la question a aussi confondu les deux. –

1

Vous utilisez une classe de collection de .Net. Pour example:

List<String^>^ dinosaurs = gcnew List<String^>(); 
Questions connexes