Wylistowanie nazw zmienych (kluczy) i ich wartości ze struktury w pętli
Ostatnio zmodyfikowano 2016-05-07 01:19
kamil2234 Temat założony przez niniejszego użytkownika |
Wylistowanie nazw zmienych (kluczy) i ich wartości ze struktury w pętli » 2016-05-06 20:23:15 Cześć mam taki obiekt i chcę go zamienić na json. W tym celu chciałem wylistować wszystkie nazwy kluczy i ich wartości w ramach pętli for lub while. Chcę jednak zrobić to bez deklarowania każdorazowo nazwy klucza, bo struktura tego obiektu będzie zaierać kilkadziesiąt zmiennych. Nie chce mi się za każdym razem w kodzie ich deklarować. Pytanie jak mogę się dobrać do nazw zmiennych w ramach struktury i sięgać po ich wartości dynamicznie w pętli? struct MySetingsTab { String wifi_ssid; String wifi_password; int svrport; int dhcp; int ip_0; int ip_1; int ip_2; int ip_3;
} mysetingstab;
|
|
mateczek |
» 2016-05-06 20:56:31 Ze struktury raczej się nie da. A o nazwach składników obiektów to możesz zapomnieć. Bo to po prostu kolejne adresy w pamięci. nazwy są tylko dla człowieka!!! kompilatorowi są raczej niepotrzebne. Gdyby w skład struktury wchodziło ze 20 zmiennych typu int. To od biedy można by jakąś pętlę wykombinować. Ale tylko co do wartości. #include <iostream> using namespace std; struct _lista { int ip1 = 2; int ip2 = 5; int ip3 = 15; int ip4 = 17; }; int main() { _lista l; int * intpointer =( int * ) & l; for( int i = 0; i < 4; i++ ) { cout << "ip" << i + 1 << " = " <<* intpointer << endl; intpointer++; } }
Choć obawiam się że i tak takie postępowanie nie daje gwarancji poprawności (kompilator chyba wcale nie musi układać danych struktury po kolei w pamięci !!!) |
|
kamil2234 Temat założony przez niniejszego użytkownika |
» 2016-05-06 21:27:17 Dzięki za pomoc ale mój problem polega na tym że nie będę mógł przewidzieć nazw kluczy i ich wartości.
W php jest coś takiego jak tablice asocjacyjne. Jak w języku c++ lub c# można poradzić sobie z ich brakiem? Czym zastąpić? |
|
carlosmay |
» 2016-05-06 21:37:29 std::map lub std::multimap std::map - cplusplusmultimap jest dla map z możliwością powtarzania się kluczy. |
|
mateczek |
» 2016-05-06 21:53:11 |
|
kamil2234 Temat założony przez niniejszego użytkownika |
» 2016-05-06 21:58:37 O chyba mnie nakierowałeś na właściwy trop :) Czytam właśnie o tym czym są konektory. Nie chcę duplikować klucza, więc czy zatem metoda set będzie tym czymś czego szukam? |
|
carlosmay |
» 2016-05-06 22:03:54 std::set nie ma osobno klucza. std::map<> jest tym czego szukasz. W C# jest IDictionary IDictionary - msdnedit: podlinkowana jest strona o mapie w C++ i słowniku w C#. |
|
michal11 |
» 2016-05-07 01:19:03 Jedyny problem z mapą jest taki, że może przechowywać tylko jeden typ jako wartość klucza więc albo będziesz miał kilka map na każdy rodzaj wartości (int, string, double itp.) co wydaje mi się najprostszym i najszybszym rozwiązaniem, ale zrobisz sobie jakaś klasę bazowa Value która będzie uniwersalnym "kontenerem" na wartość i dodasz klasy pochodne np. valuInt, ValueString które będą faktycznie przechowywały wartość, wtedy w mapie trzymasz tylko wskaźnik na Value i masz jedna mapę z różnymi kluczami, przynajmniej teoretycznie to powinno działać, ale jeżeli nie musisz bawić się w taki uniwersalne rozwiązanie (np. wiesz, że będzie max. 2-4 rodzaje wartości) to moim zdaniem nie ma sensu. |
|
« 1 » |