Dester Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 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 Więcej opcji udostępniania...
kt1117 Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 Będziesz potrzebował do tego jakiejś struktury danych, poczytaj o hasmapach, ewentualnie BST (łatwiej zaimplementować) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 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 Więcej opcji udostępniania...
Dester Opublikowano 4 Września 2016 Autor Udostępnij Opublikowano 4 Września 2016 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: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kt1117 Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 Ale zdajesz sobie sprawę że to działa liniowo od ilości zmiennych? To będzie działało wolno. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dester Opublikowano 4 Września 2016 Autor Udostępnij Opublikowano 4 Września 2016 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 Więcej opcji udostępniania...
ediepl Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 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 Więcej opcji udostępniania...
Dester Opublikowano 4 Września 2016 Autor Udostępnij Opublikowano 4 Września 2016 Tak, ale nigdy w życiu nie dzieliłem projektu na kilka plików Nie było takiej potrzeby Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 @ediepl Pytasz jaki sposób nie działa liniowo i podajesz mapy, które działają logarytmicznie. sprytne : f Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dester Opublikowano 4 Września 2016 Autor Udostępnij Opublikowano 4 Września 2016 Co z tymi nagłówkami? :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
tramur Opublikowano 4 Września 2016 Udostępnij Opublikowano 4 Września 2016 Dodałeś na początku: #include <list> using namespace std; ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dester Opublikowano 4 Września 2016 Autor Udostępnij Opublikowano 4 Września 2016 Dodałeś na początku: #include <list> using namespace std; ? ** #include <map> Teraz już tak :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 6 Września 2016 Udostępnij Opublikowano 6 Września 2016 int zmiennaOffset = 20; char dane[256] = { 0 }; int *view = nullptr; view = (int*)&dane[zmiennaOffset]; int wartosc = *view; Chyba jedna z najszybszych metod dostępu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 7 Września 2016 Udostępnij Opublikowano 7 Września 2016 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 7 Września 2016 Udostępnij Opublikowano 7 Września 2016 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 Więcej opcji udostępniania...
Danielus Opublikowano 7 Września 2016 Udostępnij Opublikowano 7 Września 2016 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? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 7 Września 2016 Udostępnij Opublikowano 7 Września 2016 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 Więcej opcji udostępniania...
Danielus Opublikowano 7 Września 2016 Udostępnij Opublikowano 7 Września 2016 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 Więcej opcji udostępniania...
Konrad-GM Opublikowano 7 Września 2016 Udostępnij Opublikowano 7 Września 2016 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 Więcej opcji udostępniania...
Dester Opublikowano 17 Września 2016 Autor Udostępnij Opublikowano 17 Września 2016 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 Więcej opcji udostępniania...
PsichiX Opublikowano 17 Września 2016 Udostępnij Opublikowano 17 Września 2016 auto exists = container.count(key); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę