Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

dejot44

[C++] Problem ze stosem.

Rekomendowane odpowiedzi

Mam taki problem: chcę napisać stos, który będzie obsługiwał kilka typów zmiennych(tzn. można do/z niego wpisać/wypisać int, string, char, itp.). Jednak mam problem przy funkcji pop. Musi ona wyglądać mniej więcej w ten sposób:

dowolny_typ_zmiennej pop();

Jest możliwe coś takiego? Z góry dzięki za pomoc ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Z tego co widzę, szablony dodatkowo strasznie ukrócą mi kod. Wielkie dzięki ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A jednak :/ Mam kolejny problem. Tak wygląda przykładowy program wykorzystujący mój stos:

#include <iostream>
#include "Stack.h"

using namespace std;

int main()
{
   Stack stos;
   stos.push('5');
   stos.push("tekst");
   stos.push(12);
   stos.push(3.14);
   cout<<stos.pop<float>()<<" "<<stos.pop<int>()<<" "<<stos.pop<string>()<<" "<<stos.pop<char>();
}

Jednak po pierwsze:

Czy da się usunąć te <typ_zmiennej>?

Po drugie:

ten kod wywala mi takie błędy:

||=== Build: Debug in Struktury Danych (compiler: GNU GCC Compiler) ===|

obj/Debug/main.o||In function `main':|

/home/mcjulcz44/Desktop/Struktury Danych/main.cpp|13|undefined reference to `char Stack::pop<char>()'|

/home/mcjulcz44/Desktop/Struktury Danych/main.cpp|13|undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > Stack::pop<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >()'|

/home/mcjulcz44/Desktop/Struktury Danych/main.cpp|13|undefined reference to `int Stack::pop<int>()'|

/home/mcjulcz44/Desktop/Struktury Danych/main.cpp|13|undefined reference to `float Stack::pop<float>()'|

||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Być może to problem samej budowy klasy(która nie jest dokończona).

Kod do Stack.h: http://wklej.org/id/1969216/

Kod do Stack.cpp: http://wklej.org/id/1969217/

z góry dziękuję za pomoc :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może lepiej najpierw określ dokładnie co chcesz zrobić (z hipotetycznymi przykładami użycia takiej klasy). Z początku myślałem że chcesz napisać prosty stos do trzymania wartości konkretnego typu - coś jak vector, ale kod sugeruje coś zupełnie innego :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

yyyhmm - chyba nie do końca zrozumiałeś sens działania templatów ;)

zastanów się co chcesz osiągnąć - bo o ile na stos łatwo położyć cokolwiek to ściągając z niego element tak naprawdę musisz znać jego typ (bo np. konwersja z string na float ma spore szanse się nie powieść)

czy liczba obsługiwanych typów faktycznie ma być nieograniczona czy limitowana?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

yyyhmm - chyba nie do końca zrozumiałeś sens działania templatów ;)

zastanów się co chcesz osiągnąć - bo o ile na stos łatwo położyć cokolwiek to ściągając z niego element tak naprawdę musisz znać jego typ (bo np. konwersja z string na float ma spore szanse się nie powieść)

czy liczba obsługiwanych typów faktycznie ma być nieograniczona czy limitowana?

Ma być(najlepiej) nieograniczona, jednak mój kod mówi co innego(część kodu napisałem przed ogarnięciem template'ów, a i tak nawet z nimi nie wiem jak miałaby wyglądać funkcja wstawiająca dowolny typ do stosu).

 

Może lepiej najpierw określ dokładnie co chcesz zrobić (z hipotetycznymi przykładami użycia takiej klasy). Z początku myślałem że chcesz napisać prosty stos do trzymania wartości konkretnego typu - coś jak vector, ale kod sugeruje coś zupełnie innego :P

Chcę zrobić stos, który będzie mógł przechowywać dowolny typ danych. Kod jest jaki jest, ponieważ jeszcze nie oswoiłem się z template'ami, aby cokolwiek sensownego wymyślić i napisać :/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli potrzebujesz takich czarów to zainteresuj się językami dynamicznie typowanymi. W C++ typ w danym wyrażeniu musi być znany na etapie kompilacji (przynajmniej częściowo).

To co chcesz osiągnąć może i jest wykonalne, ale nie będzie to ani łatwe do napisania, ani proste w użyciu, ani tym bardziej eleganckie.

 

No dobra, jak użyć experimental::any to może będzie łatwe do napisania, ale wciąż nie będzie łatwe do użycia, ani eleganckie (rtti? pls)

 

Napisz przykładowy kod który miałby korzystać z takiej klasy, może coś innego da radę Ci zasugerować :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może lista niejednorodna? Powinno dać się dzięki temu uzyskać to co próbujesz zrobić.

 

http://forum.pclab.pl/topic/68869-c-lista-niejednorodna-faq/

 

Ew. robisz sobie nowy element: rodzaj, wartosc; i przy wrzucaniu na stos definiujesz tyle pushy ile potrzeba (na int, char, float itd), konwertujesz przekazaną zmienną na string i dodajesz na stos element z podanym rodzajem i wartością; przy zdejmowaniu konwertujesz w drugą stronę, czy jakoś tak ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli potrzebujesz takich czarów to zainteresuj się językami dynamicznie typowanymi. W C++ typ w danym wyrażeniu musi być znany na etapie kompilacji (przynajmniej częściowo).

To co chcesz osiągnąć może i jest wykonalne, ale nie będzie to ani łatwe do napisania, ani proste w użyciu, ani tym bardziej eleganckie.

 

No dobra, jak użyć experimental::any to może będzie łatwe do napisania, ale wciąż nie będzie łatwe do użycia, ani eleganckie (rtti? pls)

 

Napisz przykładowy kod który miałby korzystać z takiej klasy, może coś innego da radę Ci zasugerować :)

Wszystko jest spowodowane tym, że za bardzo zacząłem iść do przodu(kilka gierek w SFML, kilka aplikacji w Qt i kalkulator na androida), że zapomniałem o dalszej nauce nowych rzeczy. Więc zajrzałem do książki i zauważyłem cały dział "struktury danych". Zrozumiałem na jakiej zasadzie działa stos i kolejka i w ramach ćwiczeń postanowiłem napisać sobie taki, tylko że przyjmujący dowolny typ danych. ~ tak w skrócie ;)

Ogółem nie potrzebuję tego do żadnej klasy, tylko dla własnej satysfakcji :)

Może lista niejednorodna? Powinno dać się dzięki temu uzyskać to co próbujesz zrobić.

 

http://forum.pclab.pl/topic/68869-c-lista-niejednorodna-faq/

 

Ew. robisz sobie nowy element: rodzaj, wartosc; i przy wrzucaniu na stos definiujesz tyle pushy ile potrzeba (na int, char, float itd), konwertujesz przekazaną zmienną na string i dodajesz na stos element z podanym rodzajem i wartością; przy zdejmowaniu konwertujesz w drugą stronę, czy jakoś tak ;)

Dzięki, chętnie zajrzę i postaram się powiedzieć, czy pomogło :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Twój link uświadomił dla mnie jak dużo jeszcze może zaoferować C++. Aż się trochę w tym pogubiłem :/ Ale no cóż, jak coś napiszę, to dam znać i dam gotowy kod, może komuś się przyda ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poprawiony kod:

main.cpp: http://wklej.org/id/1979106/

Stack.h: http://wklej.org/id/1979101/

Jednak mimo braku błędów, terminal nic nie wyświetla. Dopiero zamienienie linijki 19, na:

cout<<*(string*)one.pop()<<*(int*)one.pop();

pomaga. Jednak wtedy program nie działa, jak powinien. Wie ktoś może o co może chodzić? :/

Edit: Zrezygnowałem z listy niejednorodnej, ponieważ, chyba jeszcze nie byłem na takie cos gotowy(prawie nic z niej nie rozumiem :/)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jaki ma sens robienie stosu trzymającego różne typy skoro i tak pisząc program musisz pamiętać co i w jakiej kolejności było w nim umieszczone, by potem poprawnie te elementy rzutować?

 

Błąd jaki popełniasz - przyjmujesz do metody push argument przez kopię! A jak wiadomo lokalna zmienna w funkcji przestaje istnieć gdy tylko wykonywanie owej funkcji kończy się. Wskaźnik umieszczony w wektorze traci ważność zaraz po zakończeniu pusha.

 

 

Lista niejednorodna wyżej (której przydałyby się pomniejsze poprawki, przede wszystkim zastąpienie niestałych (!) intów enumami (a najlepiej enum class) które są używane do rozpoznawania typów) nie przyda Ci się - chcesz mieć obsługę wszystkich typów, a w niej każdy typ musi mieć podklasę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...