Witam. Testuję sobie przykłady z ksiązki - "Algorytmy - struktury danych i techniki programowania" autorstwa Piotra Wróblewskiego i akurat w środowisku Visual C++/CLI testuję sobie przykład tzw kolejki FIFO. Założenie jest proste, kolejka ma określoną ilość maksymalnych elementów, coś się do niej dokłada, międzyczasie sprawdza się czy jest pusta, lub czy przkroczono maksymalną ilość elementów. W programie przytoczony jest przykład dla kolejki z tablicą *char
, ja natomiast jestem skazany na posiłkowanie się wyłącznie nieszczęsnym - String^
Przepiszę może fragment książkowy dotyczący inicjacji konstruktora i funkcje odpowiedzialną za wstawianie nowego elementu:
template <class TypPodst> class FIFO
{
Typpodst* t;
int glowa,ogon,MaxElt;
public:
FIFO(int n)
{
MaxElt=n;
glowa=ogon=0;
t=new TypPodst[MaxElt+1];
}
void wstaw(TypPodst x)
t[ogon++]=x;
if(ogon>MaxElt)
ogon=0;
}
Pozostałe funkcję klasy są mniej istotne. Dalej w książce autor tworzy taką tablicę:
static char *tab[]=....
i powyższą kolejkę inicjuje i wstawia elementy tak:
FIFO<char*> kolejka(5);
for(int i=0;i<4;i++)
kolejka.wstaw(tab[i]);
Dla mnie jest to oczywiste, zrozumiałe etc, tyle tylko że jestem skazany na nieszczęsne C++/CLI gdzie występuje typ - String^
Żebym mógł stworzyć tablice tekstową,4 elementową, muszę użyć następujących instrukcji:
array<System::String^>^ tab = gcnew array<System::String^>(4);
tab[0]="AA"; tab[1]="BB"; tab[2]="CC"; tab[3]="DD";
Pierwszą trudnością z jaką się napotkałem to przypisanie wywołanie FIFO z char* na String^
czyli książkowy:
FIFO<char*> kolejka(5);
na uzyskany metodą prób i błędów
FIFO<String^*> kolejka(5);
Co prawda kompilator przyjmuje mi taką konstrukcje, ale czuje że jest to jakieś naciągane., bo już wstawić takiej tablicy złożonej ze String^
się nie da.
for (i = 0; i < 4; i++)
kolejka.wstaw(tab[i]);
Bład kompilatora - *Argument typu System::String^ jest niezgodny z paramtrem typu System::String^**. Czyli tak jak myślałem powyższej tablicy dynamiczna - "tab" typu String^
musi być jednak wywoływana inaczej w kolejce niż - FIFO<String^*>
. (próbowałem różnych wariacji z wywoływaniami typu <(String>^)^
i inne egzotyki, ale tylko powyższe FIFO<String^*>
kompilator mi przyjął). Reasumując wskaźnik do String^
w C++/CLI nie może być przypisany do typu array, chyba że ma ktoś jakiś pomysł jak to przypisać.