• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wykonanie funkcji zawartej wewnątrz stringa.

Object Storage Arubacloud
+1 głos
210 wizyt
pytanie zadane 4 czerwca 2016 w C i C++ przez CzikaCarry Szeryf (75,340 p.)

Witam. Mam pewną zagwozdkę, a mianowicie nie wiem jak napisać program, aby zawartość zmiennej traktował jako część składni. O co chodzi pewnie zapytacie? Załóżmy że mam taką zmienną

string dzialanie="(a*b)/c+3";

i chciałbym, aby można było użyć tej zmiennej w kodzie w taki sposób, aby te działanie było traktowane jako hmm... sam nie wiem jak to powiedzieć. Chodzi mi o to, aby zamiast 

long double o;

o= (a*b)/c+3;

można było napisać coś takiego

string dzialanie = "(a*b)/c+3";
long double o;

o= dzialanie;

Z góry dzięki za pomoc!

3 odpowiedzi

+3 głosów
odpowiedź 4 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 4 czerwca 2016 przez CzikaCarry
 
Najlepsza
Całkiem niedawno miałem styczność z podobnym problemem.. C++ nie posiada wbudowanych możliwości by osiągnąć coś takiego, ale można napisać funkcję która zrobi to za nas. Oto (bardzo ogólna) lista kroków:
1. Zamieniasz działanie matematyczne zapisane w stringu na tzw. postać ONP (Odwrotna Notacja Polska) Przykładowo działanie 2*(1+5) zostanie zapisane tak: 1 5 + 2 *.
2. Gdy masz już postać ONP tworzysz funkcję, która obliczy ci tą wartość (specjalny algorytm). W tym wypadku kolejne kroki sprawią że stos będzie wyglądał tak:
1 [1]
5 [1 5]
+ [6]
2 [6 2]
* [12]
Tutaj masz linka, w którym wszystko jest dokładnie wyjaśnione:
https://pl.wikipedia.org/wiki/Odwrotna_notacja_polska
+3 głosów
odpowiedź 4 czerwca 2016 przez draghan VIP (106,230 p.)
C++ nie wspiera metaprogramowania (zresztą ktoś niedawno pytał o podobną rzecz, tyle że tam chodziło o dynamiczne dołączanie nagłówków w runtime).

Musisz napisać własny parser matematyczny, poszukać jakiegoś gotowego, lub zaprząc do tego język skryptowy.
+1 głos
odpowiedź 4 czerwca 2016 przez Józef Mądrala (5,200 p.)
Coś takiego jest możliwe, ale wymaga skorzystania z preprocesorów. Na przykład przed main wpisujemy:

#define xyz a+b+c

#define x cout

Teraz za każdym razem, gdy użyjemy w kodzie (jako zmiennej, wartości itp) wyrażenia xyz lub x, to zostanie ono zastąpione przez  a+b+c albo cout. Nie jest to do końca to, o co Ci chodzi, ale nie spotkałem się z innym sposobem. Zanim jednak zaczniesz się tak bawić poczytaj o preprocesorach (np. w Symfonii C++), bo mechanizm ten może stwarzać problemy.
komentarz 4 czerwca 2016 przez CzikaCarry Szeryf (75,340 p.)
Okej poczytam, ale czy wartości tych xyz można zmieniać w trakcie działania kodu, tzn. czy program będzie mógł sam sobie zmieniać te działanie zawarte w xyz?
komentarz 4 czerwca 2016 przez Józef Mądrala (5,200 p.)
Raczej nie. W takim przypadku kod przed kompilacją jest przeglądany w poszukiwaniu określonego wyrazu, a następnie wszędzie tam, gdzie został odnaleziony, zastępuje go innym wyrażeniem. Całość polega więc na modyfikacji kodu, która nie będzie możliwa po stworzeniu i odpaleniu programu.
komentarz 4 czerwca 2016 przez draghan VIP (106,230 p.)
Dyrektywy preprocesora to coś zupełnie różnego od możliwości wykonania kodu, zdefiniowanego podczas runtime. Pierwszą i ostatnią przeszkodą jest to, że preprocesor pracuje przed właściwą kompilacją, a więc do runtime ma jeszcze "dalej", niż kompilator.
komentarz 4 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)

Poczytaj o tzw. makrach. Zapisuje się je np. tak:
#define dzialanie(x) 2*(x+5)
Od teraz jeżeli użyjesz w kodzie takiego zapisu: dzialanie(jakikolwiek_tekst/liczba) to w czasie kompilacji program zmieni to sobie na 2*(jakikolwiek_tekst/liczba+5). Nie oznacza to jednak, że kompilator rozumie to jako działanie do wykonania.. mówiąc najprościej "edytuje" frazy w twoim kodzie w trakcie kompilacji.

1
komentarz 4 czerwca 2016 przez draghan VIP (106,230 p.)

Od teraz jeżeli użyjesz w kodzie takiego zapisu: dzialanie(jakikolwiek_tekst/liczba) to w czasie kompilacji program zmieni to sobie na

Żeby być ścisłym - przed kompilacją.

komentarz 4 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Masz rację.. mój błąd x)

Podobne pytania

0 głosów
1 odpowiedź 209 wizyt
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 14 grudnia 2015 w PHP przez kaminiak23 Użytkownik (640 p.)
0 głosów
1 odpowiedź 734 wizyt

92,617 zapytań

141,467 odpowiedzi

319,783 komentarzy

61,999 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...