Skocz do zawartości

Tworzenie if z użyciem if, klasy


Dester

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?

Odnośnik do komentarza
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 :)

Odnośnik do komentarza
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:

 

Odnośnik do komentarza
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?

Odnośnik do komentarza
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.

Odnośnik do komentarza
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.

Odnośnik do komentarza
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.

Odnośnik do komentarza
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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

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*/

}

Odnośnik do komentarza
Udostępnij na innych stronach

auto exists = container.count(key);

Odnośnik do komentarza
Udostępnij na innych stronach

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

Jedynie 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ę poniżej.

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

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...