Kolejka FIFO z typem String^

0

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ć.

1

@davout:

Rzuć tą książkę w diabły, spluń trzy razy *) i nigdy w tamta stronę nie patrz.
Właśnie "odkryłeś" najbardziej upierdliwe centrum C++/CLI: wszystkie jest podwójnie: dwa rodzaje wskaźników, dwa spsoby alokowania

Ten język (zresztą dawno ostawiony w boczną uliczkę przez małomiekkeigo) to taki frankenstein. Niczego dobrego tam się nie nauczysz.
Możesz się uczyć albo (w miarę) standardowego C++, albo C#, i na tym nie zmarnujesz czasu (co więcej, dopiero po zrozumieniu C# wstecznie zrozumiesz ten bełkot C++/CLI)

https://4programmers.net/Forum/C_i_.NET/196733-o_naduzywaniu_c++cli

2

Głownym powodem istnienia C++CLI jest możliwość mieszania kodu C/C++ z tym napisanym dla .Net np w C# jeśli domyślne bindowanie się nie sprawdza.
Używanie C++CLI w innym celu jest formą masochizmu, bo ani to C++ ani .Net.

Jak go używałem (projekt wieloplatformowy C++ z bindowaniem do róznych języków, w tym C#), to najbardziej irytowały mnie dwa destruktory ten C++-owy ~Foo() i ten dla garbage collectora !Foo(). I tak było dużo lepiej niż z bindowaniem do Java (JNI to prawdziwa katorga).

0

Czyli w algorytmice i wszelkim przetwarzaniu tekstów typ String^ jest raczej balastem niż zaletą. Trochę jestem w szoku, że nie można w Cisual C++/CLI (może coś trzeba zmienić w ustawieniach) w ogóle używać zwykłego stringa z C++. Na poczekaniu napisałem prostą funkcję, która mi na końcu zawsze przekonwertuje uniwersalne char* na ten dziwaczny String^, które niestety jest niezbędny do wypisywania tekstów na komponentach/formatkach tego środowiska

System::String^ Konwertuj(char* tekst)
		{
			String^ wartosc = gcnew String(tekst);
			return wartosc;
		}

1
davout napisał(a):

Czyli w algorytmice i wszelkim przetwarzaniu tekstów typ String^ jest raczej balastem niż zaletą.

Źle zrozumiałeś. W CLI wszystko jest balastem.

davout napisał(a):

Na poczekaniu napisałem prostą funkcję, która mi na końcu zawsze przekonwertuje uniwersalne char* na ten dziwaczny String^,

Pudrowanie trupa

Edit: pomysł tej ksiażki - po krótkim przeglądzie waszych wynalazków - ma kuuupę dziur, m.in. GC w dotnecie oszaleje. Tego sie nie czuje w programach studenckich, które nigdy nie dochodzą do etapu oczyszczania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1