Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wylistowanie nazw zmienych (kluczy) i ich wartości ze struktury w pętli

Ostatnio zmodyfikowano 2016-05-07 01:19
Autor Wiadomość
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;

P-147986
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.



C/C++
#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 !!!)
P-147988
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ć?
P-147990
carlosmay
» 2016-05-06 21:37:29
std::map
 lub
std::multimap
std::map - cplusplus
multimap jest dla map z możliwością powtarzania się kluczy.
P-147992
mateczek
» 2016-05-06 21:53:11
Php jest językiem interpretowanym z tekstu. C++ jest kompilowany i wykonywany bezpośrednio przez procesor!!!
https://pl.wikibooks.org/wiki​/C%2B%2B/Map
dodatkowo unie jak chcesz trzymać różne typy

P-147993
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? 
P-147994
carlosmay
» 2016-05-06 22:03:54
std::set nie ma osobno klucza. std::map<> jest tym czego szukasz.
W C# jest IDictionary IDictionary - msdn

edit: podlinkowana jest strona o mapie w C++ i słowniku w C#.
P-147996
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.
P-148000
« 1 »
  Strona 1 z 1