Struktura z dynamicznie dodawanymi zmiennymi.

0

Czy jest sposób na strukturę, w której na bieżąco można zwiększać ilość pól ?
Chodzi o to, że czasami jest np. 20 zmiennych, a czasami 1500. Pewno można by to umieścić w jakimś np. sqlite ale to trochę bez sensu do takiej popierdółki :) Poza tym potrzebuje potem zobaczyć te dane w zwykłym pliku, bez jakichkolwiek narzędzi poza notepad.exe :)

struct dane{
  int zmienna1;
  int zmienna2;
  ....
  int zmiennaN;
};

P.S. Wybaczcie jeśli to jest trywialne pytanie ale nie jestem zawodowym programistą. Nie znam rozwiązania, nie znalazłem, więc pytam najlepszych :)

3

Dosłownie to, co chcesz — nie. Struktury mają znaną w momencie kompilacji liczbę (i rodzaj) zmiennych składowych.

Funkcjonalnie to, co chcesz — tak. https://en.cppreference.com/w/cpp/container/vector

0

Dziękuje bardzo, to już wiem czego szukać, a czego nie.

1

Są języki dynamiczne, które pozwalają na takie cuda, jak dodawanie nowych zmiennych do wybranych instancji klas. Jest to doskonały sposób na zagmatwanie sobie kodu — sytuacja, w której masz dwie instancje tego samego typu, które mają różne składowe, wymusza bardzo defensywne programowanie i jest mocno błędogenne. C++ taki nie jest.

0

Rozumiem. U mnie to tak proste, że ciężko się pomylić :) Właśnie nie mogłem znaleźć sposobu ze strukturą i zabrałem się za sqlite. Prawie rozwiązałem ten problem ale znowu podgląd okazał się problemem, bo musi być maksymalnie uproszczony. Więc zrobię tak jak mi poradziłeś.

2

Ja bym użył https://github.com/nlohmann/json
Ale nie wiem na ile to rozwiązanie jest kompatybilne z Twoimi potrzebami

2
Althorion napisał(a):

Funkcjonalnie to, co chcesz — tak. https://en.cppreference.com/w/cpp/container/vector

Można jeszcze zaproponować mapę (std::map), i zrobić sobie dostęp po nazwie

mirmur napisał(a):

Poza tym potrzebuje potem zobaczyć te dane w zwykłym pliku, bez jakichkolwiek narzędzi poza notepad.exe :)

W C++ trudno zrobić takie rzeczy.
O wiele łatwiej w językach posiadajacych refleksję (choć tez nie jest to dla początkujących). Kompilowane Java, C#, intepretery np Python.

Jaki jest rzeczywisty pierwotny cel, bo na razie to problem XY. https://piproductora.com/pl/na-czym-polega-problem-xy/

0

Można jeszcze zaproponować mapę (std::map), i zrobić sobie dostęp po nazwie

Dziękuję za podpowiedź, zobaczę na to.

Jaki jest rzeczywisty pierwotny cel, bo na razie to problem XY. https://piproductora.com/pl/na-czym-polega-problem-xy/

Zadanie jest proste:
odczyt z COM do momentu jak nie przyjdzie znacznik końca danych i zapis do pliku w formie zrozumiałej dla śmiertelnika. Pomyślałem, że odczytam, obrobię, umieszczę w strukturze i zapisze strukturę w pliku. Wydawało się proste do chwili jak nie doszła kwestia zmienności ilości danych. Oczywiście mogę to olać i stworzyć strukturę o wielkości 2000. Zmieści się na pewno, nikt nie będzie krzyczał, bo prawdopodobnie będą to widziały z 3 osoby (sam wynikowy exe) ale ja się będę się czuł bak buc ;)
Przepraszam ale nie do końca mogę napisać o jakie urządzenie chodzi.

1

@mirmur:

Bosch ... tobie ewidentnie chodzi o tablicę a nie strukturę ...

0
Adamek Adam napisał(a):

Ja bym użył https://github.com/nlohmann/json
Ale nie wiem na ile to rozwiązanie jest kompatybilne z Twoimi potrzebami

Dziękuję,
Oj, jakieś grubsze rozwiązanie ;) Ale zobaczę.

ZrobieDobrze napisał(a):

@mirmur:

Bosch ... tobie ewidentnie chodzi o tablicę a nie strukturę ...

Dwa pierwsze pola to string, reszta to int. Źle to napisałem na początku.

0
mirmur napisał(a):

Dwa pierwsze pola to string, reszta to int. Źle to napisałem na początku.

Czyli wystarczy tobie dwie zmienne na krzyż:

string strvalue;
int intvalue;
0
_13th_Dragon napisał(a):
mirmur napisał(a):

Dwa pierwsze pola to string, reszta to int. Źle to napisałem na początku.

Czyli wystarczy tobie dwie zmienne na krzyż:

string strvalue;
int intvalue;

string strvalue1;
string strvalue2;
int intvalue1;

a co dalej?

Oczywiście mogę robić to na bieżąco i na bieżąco pisać do pliku tylko czy nie rozjedzie się to jeśli dane przychodzą bardzo szybko.

2

Skupmy się na tym, bo to faktycznie problem XY:

mirmur napisał(a):

Jaki jest rzeczywisty pierwotny cel, bo na razie to problem XY. https://piproductora.com/pl/na-czym-polega-problem-xy/

Zadanie jest proste:
odczyt z COM do momentu jak nie przyjdzie znacznik końca danych i zapis do pliku w formie zrozumiałej dla śmiertelnika. Pomyślałem, że odczytam, obrobię, umieszczę w strukturze i zapisze strukturę w pliku. Wydawało się proste do chwili jak nie doszła kwestia zmienności ilości danych. Oczywiście mogę to olać i stworzyć strukturę o wielkości 2000. Zmieści się na pewno, nikt nie będzie krzyczał, bo prawdopodobnie będą to widziały z 3 osoby (sam wynikowy exe) ale ja się będę się czuł bak buc ;)
Przepraszam ale nie do końca mogę napisać o jakie urządzenie chodzi.

To już ma więcej sensu, ale nadal wygląda na to, że źle się do tego zabierasz.

Urządzenie zapewne wysyła ci dane w jakimś formacie.
Musisz doczytać dokładnie dokumentację urządzenia co ci ono wysyła, następnie na tej podstawie zaprojektować strukturę danych.
Najprawdopodobiej będzie to coś co będzie zawierać kilka pól stałych plus pole typu std::vector.
Tak długo jak będziesz szczegóły zachowywał dla siebie, nie będziemy w stanie ci lepiej pomóc.

1

Trochę to przypomina sytuacje: Chce upiec chleb mam produkty, jaki kolor garnka będzie najlepszy ?

Też mam wrażenie że pytający się źle zabiera do problemu,
fakt #1 są jakieś dane wejściowe i pliki na wyjściu , jak nie ma żadnych informacji co ma być pomiędzy trudno pomóc

Nie używaj garnka weź makutrę

1
string readStringFromDevice() { return "Diabel wie"; } // ma czytać z urządzenia
int readIntFromDevice() { return 666*100+rand()%100; } // ma czytać z urządzenia

ofstream sout("for_human.txt");
sout<<readStringFromDevice()<<endl<<readStringFromDevice()<<endl;
while(true)
{
  sout<<readIntFromDevice()<<endl;
}
0
MarekR22 napisał(a):

Skupmy się na tym, bo to faktycznie problem XY:

mirmur napisał(a):

Jaki jest rzeczywisty pierwotny cel, bo na razie to problem XY. https://piproductora.com/pl/na-czym-polega-problem-xy/

Zadanie jest proste:
odczyt z COM do momentu jak nie przyjdzie znacznik końca danych i zapis do pliku w formie zrozumiałej dla śmiertelnika. Pomyślałem, że odczytam, obrobię, umieszczę w strukturze i zapisze strukturę w pliku. Wydawało się proste do chwili jak nie doszła kwestia zmienności ilości danych. Oczywiście mogę to olać i stworzyć strukturę o wielkości 2000. Zmieści się na pewno, nikt nie będzie krzyczał, bo prawdopodobnie będą to widziały z 3 osoby (sam wynikowy exe) ale ja się będę się czuł bak buc ;)
Przepraszam ale nie do końca mogę napisać o jakie urządzenie chodzi.

To już ma więcej sensu, ale nadal wygląda na to, że źle się do tego zabierasz.

Urządzenie zapewne wysyła ci dane w jakimś formacie.
Musisz doczytać dokładnie dokumentację urządzenia co ci ono wysyła, następnie na tej podstawie zaprojektować strukturę danych.
Najprawdopodobiej będzie to coś co będzie zawierać kilka pól stałych plus pole typu std::vector.
Tak długo jak będziesz szczegóły zachowywał dla siebie, nie będziemy w stanie ci lepiej pomóc.

Podanie danych mogłoby mnie pozbawić pokarmu na jakieś 2 lata :)

Producent drogiego urządzenia do pewnej analizy stwierdził, że kupujący będzie sobie na bieżąco drukował wyniki, a jak zabraknie prądu lub papier zaleje kawa pani Joli, to jego problem. No bo przecież coś takiego jak zapis w pliku, na nośniku w XXI wieku nie istnieje ;). Urządzenie ma UART-a i pokazują się tam dane. Okazało się, że są to dane tych analiz. Zaszyfrowane...uwaga..., xor-em :) :)
Więc czytam, robię xor i do pliku. Tyle.
Faktycznie dwa razy string plus vector pewno załatwi sprawę.

0
mirmur napisał(a):

Tak długo jak będziesz szczegóły zachowywał dla siebie, nie będziemy w stanie ci lepiej pomóc.

Podanie danych mogłoby mnie pozbawić pokarmu na jakieś 2 lata :)

Zawsze jakoś mi dziwnie, jak ludzie początkujący w języku mówią o wielkiej kasie.
Ja osobiście miałbym wielki dyskomfort sumienia pracując poza obszarem swoich kompetencji.

1
ZrobieDobrze napisał(a):
mirmur napisał(a):

Tak długo jak będziesz szczegóły zachowywał dla siebie, nie będziemy w stanie ci lepiej pomóc.

Podanie danych mogłoby mnie pozbawić pokarmu na jakieś 2 lata :)

Zawsze jakoś mi dziwnie, jak ludzie początkujący w języku mówią o wielkiej kasie.
Ja osobiście miałbym wielki dyskomfort sumienia pracując poza obszarem swoich kompetencji.

Zanim takie żale będziesz wyrzucał z siebie, to przeczytaj zer zrozumieniem. Lub jeśli to nie wnosi nic do sprawy, to zachowaj dla siebie.

  • Moja praca nie ma nic wspólnego z jakimkolwiek językiem programowania. Ba! Nawet z informatyką (chyba, że licząc obsługę przepływu dokumentów). Zaznaczyłem to wyraźnie - jestem laikiem i jak widać nawet źle się do tego zabierałem i dziękuję kolegom z powyższych postów, że mi to uświadomili. A lojalka, z zarobki to dwie różne rzeczy.
  • Nikt mi nic nie zlecał. Ot, chciałem pomóc i finalnie pomogłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1