VC++ 2008 --> String array

Programovacie jazyky, rady, poradňa...
Trek
Novice
Novice
Príspevky: 5
Registrovaný: 02 jún 2013, 15:22

VC++ 2008 --> String array

Príspevok od používateľa Trek »

ahoj,

nevěděl by někdo z jakého důvodu nejede tento kód a jestli by nešel nějal zprovoznit?

Vývojové prostředí: Microsoft Visual C++ 2010

Kód: Vybrať všetko

// Tady dam nekolik slov mezi kterymi chci aby slo prepinat
String ^ slova[4] = {"prvni", "druhe", "treti", "ctvrte"};

// Udelam si promenou do ktere chci nacpat jedno ze čtyř slov
String ^ slovo;

// Zkouším do proměnné přiřadit "treti"
slovo = slova[2];

Hlásí to chybu:
error C2728: 'System::String ^' : a native array cannot contain this managed type
1> Did you mean 'array<System::String ^>'?
na prvním řádku...

Nějaké nápady? :)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: VC++ 2008 --> String array

Príspevok od používateľa BX »

To je v akom jazyku?

// hm, že C++/CLI. Čakal som nejaký hybrid pascalu a Cčka od Microsoftu :D Našťastie to tak nie je, vidím to prvý krát :oops:
Trek
Novice
Novice
Príspevky: 5
Registrovaný: 02 jún 2013, 15:22

Re: VC++ 2008 --> String array

Príspevok od používateľa Trek »

Trek napísal: Vývojové prostředí: Microsoft Visual C++ 2010
C++
MeanSeriously
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 430
Registrovaný: 14 apr 2012, 15:07

Re: VC++ 2008 --> String array

Príspevok od používateľa MeanSeriously »

Keď pracuješ s poliami v C++/CLI, vždy si musíš zvážiť typ. Všetky manažované typy* môžu byť použité len v manažovanom kontexte. Štandardné pole** v C++ sa vytvára na halde (alebo v zásobníku) ako fixed-size - pevnej veľkosti. V prípade manažovaného poľa to tak nie je.
Odporúčam ti prečítať si: http://www.codeproject.com/Articles/770 ... s-in-C-CLI

@BX: je to C++/CLI


*jasné - typy a nie premenné
**štandardné pole v zmysle unmanaged
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: VC++ 2008 --> String array

Príspevok od používateľa pcsiete »

Ach jaj!
MeanSeriously napísal:Keď pracuješ s poliami v C++/CLI, vždy si musíš zvážiť typ. Všetky manažované premenné môžu byť použité len v manažovanom kontexte.
aké manažované premenné? Jedná sa o typy z Managed C++/CLI, ktoré nie sú zakódované v podpore CIL pre .NET.
MeanSeriously napísal:Štandardné pole v C++ sa vytvára na halde ako fixed-size - pevnej veľkosti. V prípade manažovaného poľa to tak nie je.
Odporúčam ti prečítať si: http://www.codeproject.com/Articles/770 ... s-in-C-CLI
WTH? Miešaš hrušky s medziplanetárnym prachom. Štandardné pole v C++ sa vytvára na zásobníku (ako v C, nerátajúc s C99) a má pevnú veľkosť, pretože už v compile time musí byť jasné, aký bude zásobníkový rámec. V prípade managed typu moze byt pole managed aj nemanaged. To zase moze mat podla typu premenlivu alebo pevnu velkost.

Kód: Vybrať všetko

array<String^>^ //referencia na array referencii na string
nazov = gcnew   //= new garbage-collected obejct
array<String^>(velkost); //objekt arrayu referencii na string o velkosti 'velkost'
V tvojom pripade sa da pouzit

Kód: Vybrať všetko

array<String^>^ slova = gcnew array<String^> {"prvni", "druhe", "treti", "ctvrte"};
existuje ale aj moznost

Kód: Vybrať všetko

gcroot<String^>[] nazov;
... kde array nebude managed, ale bude array 'nativnych' (beznych Cckovskych) handlerov referencie na String ... taky mensi cheat.

//autoeditácia príspevku (02 Jún 2013, 18:38)
C++/CLI je genialita sama o sebe, no treba poznat classic C++, inak sa zacnu veci miesat. Jednym zo zakladov C++/CLI je Garbage-collecting, alebo inak "kaslanie na delete a delete []". Preto vsetky tie veci.
Trek
Novice
Novice
Príspevky: 5
Registrovaný: 02 jún 2013, 15:22

Re: VC++ 2008 --> String array

Príspevok od používateľa Trek »

Děkuji moc, nakonec dělat to přes stringy bude asi naprd, protože se tam nedá jednoduše manipulovat ze znaky..

Jestli by tu byl ještě někdo ochotný.. Potřebuju 4 věci..

Napíšu jak si myslím, že by to mělo fungovat, ale asi to bude blbě..

1) Udělat globální proměnnou (asi CHAR nakonec)

Kód: Vybrať všetko

char globalniSlovo[32]; // Nejvetsi problemy dela ta velikost pole..
2) Posléze ji změnit na nějaký text jeden třeba 11 znaků a druhý 8 znaků dlouhý

Kód: Vybrať všetko

if(neco == 1)globalniSlovo = "FOTOSYNTEZA";
else globalniSlovo = "AKVARIUM";
3) Nahradit třeba 3. pismeno na X třeba..

Kód: Vybrať všetko

globalniSlovo[2] = 'X';
4) Jak potom tu proměnou vypsat v labelu potom?

Kód: Vybrať všetko

this->Napis->Text = "" + globalniSlovo
Byl bych Vám moc vděčný když mi někdo odepíšete ;)
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: VC++ 2008 --> String array

Príspevok od používateľa pcsiete »

pracovat s char array je robota navyse. Urob si

Kód: Vybrať všetko

String^ globalneSlovo;
...
if(neco == 1) globalniSlovo = "FOTOSYNTEZA";
else globalniSlovo = "AKVARIUM";
....
globalniSlovo.Chars[2] = 'X';
alebo pouzi klasicky std::string a ako text labelu daj

Kód: Vybrať všetko

this->Napis->Text = gcnew String(retazec.c_str());
Napísať odpoveď