Skocz do zawartości
Dester

Tworzenie if z użyciem if, klasy

Rekomendowane odpowiedzi

Przerabiam swój język programowania tak, żeby dało się tworzyć zmienne. Pomyślałem o czymś takim:

class numvar
{
   public:
      string name; 
      long double value;     
};
class txtvar
{
    public:
        string name;
        string value;    
};

numvar v1;
...
numvar v10;
txtvar v1;
...
txtvar v5;

Tylko, że teraz chcę stworzyć if. Jedyne co mi przychodzi do głowy to sprawdzanie podanego słowa ze wszystkimi nazwami zmiennych. A to oznacza bardzo skomplikowaną konstrukcję. Raz już próbowałem to napisać, ale gdzieś zrobiłem błąd w {}. Nie mogłem go znaleźć, więc wszystko poszło do usunięcia.

 

Dałoby się to zrobić jakąś prostszą metodą?

**Na pewno się da, tylko jak?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Będziesz potrzebował do tego jakiejś struktury danych, poczytaj o hasmapach, ewentualnie BST (łatwiej zaimplementować)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nie rozumiem trochę pytania, chodzi Tobie o język programowania w sensie że masz jakiś interpreter/kompilator napisany w C++ tak?

EDIT:

Może coś w tym stylu?

class numvars
{
    private:
        list<string>names;
        list<string>::iterator iter;
        list<int>values;   
    public:
        bool VarAdd(string name, int value)
        {
            names.push_back(name);
            values.push_back(value);
            //return false jak blad
            return true;
        }
        int GetVarByName(string name)
        {
            iter = std::find(names.begin(), names.end(), name);
            if(iter == names.end())
            {
                //blad nie znaleziono zmiennej
            }
            return values[iter];
        }
};

 

numvars VarsNum;
VarsNum.VarAdd("zmienna1", 42);
VarsNum.VarAdd("zmienna2", 53);

if( VarsNum.GetVarByName("zmienna1") == VarsNum.GetVarByName("zmienna2") )
{
    //cos tam blablabla
}

Też w miarę prosto.

 

PS: Pisane z pamięci więc mogą być błędy :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Tak, od jakiegoś czasu tworzę swój język. Już kiedyś o nim pisałem w 'nad czym aktualnie pracujesz'. Dzięki za ten kod. CHYBA go rozumiem, ale nie znam wielu z użytych funkcji.

EDIT: Usuwam 150 linijek kodu. Wracam za 5 minut :lol2:

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ale zdajesz sobie sprawę że to działa liniowo od ilości zmiennych? To będzie działało wolno.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

13 9 [Error] 'list' does not name a type

14 9 [Error] 'list' does not name a type

15 9 [Error] 'list' does not name a type

In member function 'bool numvars::VarAdd(std::string, int)':

19 28 [Error] 'names' was not declared in this scope

20 13 [Error] 'values' was not declared in this scope

In member function 'int numvars::GetVarByName(std::string)':

26 13 [Error] 'iter' was not declared in this scope

26 30 [Error] 'names' was not declared in this scope

31 20 [Error] 'values' was not declared in this scope

:huh:

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A jaki sposób nie działa liniowo? anyway

 

Właściwie zamiast tego co napisałem wystarczy użyć std::map :)

Przykład:

map<string, int>vars;
vars["zmienna"] = 5;
vars["zmienna2"] = 5;
if(vars["zmienna"] == vars["zmienna2"])
{
    cout << "równe" << endl;
}else
{
    cout << "nierówne" << endl;
}

Dawno nic nie kodziłem i się zapomina :(

 

EDIT:

13 9 [Error] 'list' does not name a type

14 9 [Error] 'list' does not name a type

15 9 [Error] 'list' does not name a type

In member function 'bool numvars::VarAdd(std::string, int)':

19 28 [Error] 'names' was not declared in this scope

20 13 [Error] 'values' was not declared in this scope

In member function 'int numvars::GetVarByName(std::string)':

26 13 [Error] 'iter' was not declared in this scope

26 30 [Error] 'names' was not declared in this scope

31 20 [Error] 'values' was not declared in this scope

Wiesz co to nagłówki prawda?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@ediepl Pytasz jaki sposób nie działa liniowo i podajesz mapy, które działają logarytmicznie. sprytne : f

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Dodałeś na początku:

#include <list>
using namespace std;

?

**

#include <map>

Teraz już tak :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

int zmiennaOffset = 20;
char dane[256] = { 0 };
int *view = nullptr;

view = (int*)&dane[zmiennaOffset];

int wartosc = *view;

Chyba jedna z najszybszych metod dostępu.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

niezbyt dobry pomysł. Jak system na którym to puścisz będzie miał inny rozmiar inta niż sobie założyłeś to dostaniesz śmieci.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
niezbyt dobry pomysł. Jak system na którym to puścisz będzie miał inny rozmiar inta niż sobie założyłeś to dostaniesz śmieci.

Podałem tylko przykład O(1), dla ścisłości zależy to od kompilatora, niektóre posiłkują się typami tj. int8_t, int16_t, int32_t, int64_t itd.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

właściwie dlaczego użyłes tablicy charowej by potem castować na inty?

Czym twoje rozwiązanie różni się od używania zwykłej tablicy intów?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
właściwie dlaczego użyłes tablicy charowej by potem castować na inty?

Czym twoje rozwiązanie różni się od używania zwykłej tablicy intów?

Offset liczony co do bajta, a nie co 4-8 bajty jak w przypadku tablicy z intami.

Można w char[1..4] zmieścić 2 zmienne 16 bitowe np.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ale zdajesz sobie sprawę że to jest wolniejsze niż używanie po prostu intów?

Jeżeli nie masz specjalistycznego zapotrzebowania to lepiej zostawić to kompilatorowi by sobie dopasował pamięć jak mu lepiej, a nie samemu definiować po ile bajtów maja liczby i odkąd je wczytywać. To ma zwłaszcza znaczenie przy przesyłaniu danych do SSE gdzie ładowanie zmiennych nie wyrównanych do konkretnych wartości znacząco spowalnia proces(i ogólnie wiele komponentów wymaga by adres był podzielny przez konkretną liczbę i jeśli nie jest, to kompilator musi to przepisać na adres spełniający warunki).

 

Tak więc jak potrzeba do konkretnych rzeczy to ok. np do trzymania zserializowanych obiektów o różnej ilości bajtów, ale to trzymania zwykłych liczb jest to zupełnie nieopłacalne.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Ale zdajesz sobie sprawę że to jest wolniejsze niż używanie po prostu intów?

Jeżeli nie masz specjalistycznego zapotrzebowania to lepiej zostawić to kompilatorowi by sobie dopasował pamięć jak mu lepiej, a nie samemu definiować po ile bajtów maja liczby i odkąd je wczytywać. To ma zwłaszcza znaczenie przy przesyłaniu danych do SSE gdzie ładowanie zmiennych nie wyrównanych do konkretnych wartości znacząco spowalnia proces(i ogólnie wiele komponentów wymaga by adres był podzielny przez konkretną liczbę i jeśli nie jest, to kompilator musi to przepisać na adres spełniający warunki).

 

Tak więc jak potrzeba do konkretnych rzeczy to ok. np do trzymania zserializowanych obiektów o różnej ilości bajtów, ale to trzymania zwykłych liczb jest to zupełnie nieopłacalne.

Hm, dobrze wiedzieć, nie pomyślałem w ten sposób. Dzięki.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Używam <map>. Jak sprawdzić czy zmienna istnieje? Potrzebuję do instrukcji warunkowych i input stream, żeby rozróżnić zmienne z tekstem od liczbowych.

 

np.

if(a=="ask"){
source>>a;

if(/*exists*/ vars[a]){
cin>>vars[a];
}else if(/*exists*/ txtvars[a]){
cin>>txtvars[a];
}else /*error*/

}

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

auto exists = container.count(key);

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

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

×