CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zapis struktury z dynmicznymi tablicami

Zapis struktury z dynmicznymi tablicami

dział ogólny

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » niedziela, 28 października 2012, 16:20

Najprawdopodobniej masz rację, wcześniej o POD'ach nie słyszałem, wg mnie to płaska struktura danych, tj bez konstruktorów/destruktorów wirtualnych funkcji - czyli zlepek danych (metody chyba ma), taka struktura - czyli coś jak moje struktura.
A napisałeś, że jednak moja struktura NIE jest POD'em - tego już nie wiem, możesz rozjaśnić dlaczego tak uważasz?

Załóżmy, że masz rację (bo pewnie i tak ją masz), to jedyną drugą jest serializacja danych? Wydaje mi się, że coś takiego zrobiłem, czy wobec tego, jest szansa, aby mój kod zadziałał (tj muszę się mało napracować, nie chodzi mi o podanie na tacy rozwiązania, bardziej podpowiedzi jak to naprawić)?

KOD cpp:     UKRYJ  
    KOD cpp:   �  UKRYJ  �
    plik2.seekg(end_static+1,ios::beg);
 


A to po co?


Już poprawiłem, dałem bez jedynki - w poprzednim moim poście jest. A po co - ja to widzę tak - dane statyczne odczytuje mi poniższe polecenie
KOD cpp:     UKRYJ  
//odczytuję częsc statyczna zbiorow
plik2.read(reinterpret_cast<char*>(&Param),sizeof(Param));
unsigned end_static=plik2.tellg();

a potem po odczytaniu tej części chciałem skoczyć o +/- 2 zmienne (double **tab_dyn i double **tab_ele) ale widzę, że poruszałem się o 2 bajty, a powinienem o 2*sizeof(double), choć teraz sam już nie jestem pewny...Ciągle mi się wydaje, że polecenie
KOD cpp:     UKRYJ  
plik2.read(reinterpret_cast<char*>(&Param),sizeof(Param));
 

zapamięta w zmiennych **tab_ele i **tab_dyn tylko ich adresy i aby ich nie nadpisywać, powinienem coś tutaj zrobić, ale coś chyba na kiełbasiłem tutaj
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez polymorphism » niedziela, 28 października 2012, 18:17

A napisałeś, że jednak moja struktura NIE jest POD'em - tego już nie wiem, możesz rozjaśnić dlaczego tak uważasz?

Dlatego, ponieważ jest tam tablica elementów typu String. Typ ten jest klasą z konstruktorem, który musi być wywołany dla każdej nowej instancji, nie jest POD-em. Obiekt klasy String tak naprawdę nie jest łańcuchem znakowym, który jest mu przypisany. Jest jedynie obiektem, który zarządza łańcuchem. Dlatego zapisując obiekt tej klasy zapisujesz jakieś dane niezbędne do zarządzania zawartością, ale nie sam łańcuch.

Tu masz przykład funlkcji (de)serializujących Stringa:
KOD cpp:     UKRYJ  
ostream& serialize(ostream &os, const String &str)
{
        uint32_t n = str.Length();
        os.write((const char*)&n, sizeof(uint32_t));
        os.write((const char*)str.c_str(), n * sizeof(wchar_t));
        return os;
}

istream& deserialize(istream &is, String &str)
{
        uint32_t n;
        wchar_t ch;
       
        is.read((char*)&n, sizeof(uint32_t));
       
        while(n-- > 0)
        {
                is.read((char*)&ch, sizeof(wchar_t));
                str += ch;
        }

        return is;
}

/* przy zapisie */
serialize(plik, Param.sep[0]);
serialize(plik, Param.sep[1]);


/* i analogicznie przy odczycie */
deserialize(plik, Param.sep[0]);
deserialize(plik, Param.sep[1]);
 


p.s. kod pisany z palca, mogłem się gdzieś machnąć. Założyłem, że String jest unikodowy (choć sensowniej jest serializować w utf-8, ale dla jasności przekazu nie bawiłem się w konwersję).

a potem po odczytaniu tej części chciałem skoczyć o +/- 2 zmienne (double **tab_dyn i double **tab_ele)

No ale po co Ty chcesz to przeskakiwać, jeśli już te dwa pola odczytałeś razem ze strukturą?! (już pominę fakt, że zapisywanie wskaźników do pliku jest, delikatnie mówiąc, nierozsądne)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » niedziela, 28 października 2012, 22:00

Dziękuję bardzo za cenne uwagi - tablicę String (w sumie jak to interpretować - łańcuch o długości 2 znaków??) zamieniłem na tablicę charów także otrzymałem POD'a . Wszędzie do tablic dałem pętle for (do dynamicznych oraz statycznych tablic) i .... zadziałało :D okazało się, że w jednym miejscu pomyliłem ilości elementów tab_nod z tab_ele (w jednym z wymiarów tablic są 3 elementy, w drugiej 5 elementów, stąd wywalało błąd pamięci).

Nie mniej dzięki za sposób na Stringa, przyda się w przyszłości.

PS. Przez przypadek zauważyłem, że istnieją dwa stringi, z różnymi metodami i polami jeden to "String" drugi to "string" - może podpowiecie, skąd ten string pisany małą literką? Kompilator BCv6
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez polymorphism » poniedziałek, 29 października 2012, 11:29

(...) tablicę String (w sumie jak to interpretować - łańcuch o długości 2 znaków??)

A dlaczego dwóch znaków?

może podpowiecie, skąd ten string pisany małą literką?

Ze standardu języka C++. Ta klasa jest częścią języka i znajdziesz ją w każdym środowisku języka C++. W przeciwieństwie do klasy (a raczej aliasu) String, która jest jedynie częścią biblioteki VCL, a ta związana jest tylko z jednym środowiskiem - C++ Builder. W zasadzie każda porządna biblioteka GUI definiuje swoją klasę do obsługi łańcuchów znakowych, np. w wxWidget jest wxString, w Qt - QString.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » wtorek, 30 października 2012, 18:52

Mam jeszcze jedno pytania - a jak zrealizować zapis "ludzki", tj coś na poniższy wzór (plik system.ini)

Kod: Zaznacz cały
; for 16-bit app support
[drivers]
wave=mmdrv.dll
timer=timer.drv
[mci]
[driver32]
[386enh]
woafont=app852.FON
EGA80WOA.FON=EGA80852.FON
EGA40WOA.FON=EGA40852.FON
CGA80WOA.FON=CGA80852.FON
CGA40WOA.FON=CGA40852.FON


czyli [NAGŁOWEK SEKCJI] i dane poniżej. Na pewno zamiast formatu bin będę musiał wybrać format out - czy po prostu najpierw odczytać cały plik i zapamiętać pozycje odpowiednich sekcji w pliku, a następnie przypasować do odpowiedniej zmiennej/tabeli dane między sekcjami (ewentualnie końcem pliku)?

Czasami łatwiej mi będzie zmienić coś w danych w tradycyjny sposób, tj przez edycję pliku niż zmieniać masę parametrów w programie.
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez Mironas » wtorek, 30 października 2012, 19:14

W pliku nagłówkowym (np Unit1.h):
KOD cpp:     UKRYJ  
#include <IniFiles.hpp>
// ---------------------------------------------------------------------------
private:
  String tekst;
  int liczba;
 

W pliku CPP:
KOD cpp:     UKRYJ  
void TForm1::WczytajDane()
{
  // Wczytanie danych z pliu INI
  TIniFile *INI = new TIniFile("C:\\Plik.ini");
  tekst = INI->ReadString("Sekcja", "Nazwa1", "Wartosc_domyślna");
  liczba = INI->ReadInteger("Sekcja", "Nazwa2", 0);  // 0 - wartość domyślna
  delete INI;
}
// ---------------------------------------------------------------------------
void TForm1::ZapiszDane()
{
  // Zapisanie danych do pliu INI
  TIniFile *INI = new TIniFile("C:\\Plik.ini");
  INI->WriteString("Sekcja", "Nazwa1", tekst);
  INI->WriteInteger("Sekcja", "Nazwa2", liczba);
  delete INI;
}
// ---------------------------------------------------------------------------
 


[EDIT]
Tutaj masz szczegółowo: Obsługa Plików Ini
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » wtorek, 30 października 2012, 21:43

Super, dzięki za odp. zabieram się za pracę, mam do Twego linku jedno pytanie - w tej chwili mam parametr określający wymiar tablicy dynamicznej, czy biblioteka IniFiles.hpp będzie potrafiła "powiedzieć" ile jest wierszy w danej sekcji - chodzi mi o to, czy muszę mieć ten parametr zapisany w jakiejś zmiennej w pliku (aktualnie tak mam zrobione), gdyż wolałbym go uniknąć. A dlaczego - w razie prostej edycji pliku i dodanie/usunięcia choć jednego wiersza bez zmiana informacji o długości tablicy w pliku, cała informacja "leci" (tj na pewno się pokrzyczy co najmniej ta jedna sekcja).
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez Cyfrowy Baron » wtorek, 30 października 2012, 22:12

oneiro napisał(a):ile jest wierszy w danej sekcji


To nie są wiersze lecz klucze z przypisanymi wartościami - patrz: ReadSection.

oneiro napisał(a):czy muszę mieć ten parametr zapisany w jakiejś zmiennej w pliku


W jakiej zmiennej, w jakim pliku? W pliku INI?

Czy rozumiesz zasadę działania plików INI?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    WindowsChrome

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez Mironas » środa, 31 października 2012, 11:02

oneiro napisał(a):mam parametr określający wymiar tablicy dynamicznej

W przypadku pliku INI nie jest Ci to do niczego potrzebne

oneiro napisał(a):czy biblioteka IniFiles.hpp będzie potrafiła "powiedzieć" ile jest wierszy w danej sekcji

Nie wiem po co Ci to ale możesz wczytać całą sekcję do TStrings za pomocą ReadSection i sprawdzić ile ma wierszy:
KOD cpp:     UKRYJ  
  TStrings* lista = new TStringList();
  INI->ReadSection("NazwaSekcji", lista);
  ShowMessage(lista->Count);
  delete lista;
 


oneiro napisał(a):czy muszę mieć ten parametr zapisany w jakiejś zmiennej w pliku.

Nie - nic nie musisz. Zrób tak jak podałem w przykładach i dokładnie przeczytaj poradę jaką Ci wskazałem. Przy obsłudze plików INI nie musisz martwić się długością pliku, długością tekstów itp. Plik, sekcja, klucz i wartość - to wszystko co potrzebujesz.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » niedziela, 27 stycznia 2013, 14:04

Powrócę jeszcze do pliku INI

A) Jak dodać komentarz do pliku INI?
Dając komuś plik INI w razie czego będzie mógł sam dojść, za co który parametr odpowiada i jakie może przyjąć wartości bez czytania pomocy

B) Jak dodać pustą linię w pliku INI?
Aby plik INI stał się czytelny, między liniami, a przynajmniej między sekcjami chciałbym dać pustą linię.
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez Cyfrowy Baron » niedziela, 27 stycznia 2013, 14:40

oneiro napisał(a):Jak dodać komentarz do pliku INI?


To co znajduje się poza sekcją nie jest odczytywane, podobnie to co nie ma przypisanego klucza. Poza tym zauważ, ze z pliku możesz pobrać tylko to co znajduje się w sekcji i w kluczu, a klucz może być przechowywany tylko w jednej linii. Możesz więc komentować plik do woli. Nie przewidziano żadnych tagów dla komentowania tych plików.

oneiro napisał(a):B) Jak dodać pustą linię w pliku INI?


Tylko ręcznie edytując plik. Jeżeli to program tworzy plik, to nie będzie zostawiał w nim pustych linii. Nie przewidziano żadnej funkcji do tworzenia takich pustych linii.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » niedziela, 27 stycznia 2013, 15:30

Cyfrowy Baron napisał(a): Nie przewidziano żadnych tagów dla komentowania tych plików.


Szkoda

Cyfrowy Baron napisał(a):Tylko ręcznie edytując plik. Jeżeli to program tworzy plik, to nie będzie zostawiał w nim pustych linii. Nie przewidziano żadnej funkcji do tworzenia takich pustych linii.


Znowu szkoda :/
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez polymorphism » niedziela, 27 stycznia 2013, 15:43

Napisz sobie swój format INI-like, który będzie miał możliwość zamieszczania komentarzy. Ewentualnie użyj jakichś innych formatów, np. XML.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez Cyfrowy Baron » niedziela, 27 stycznia 2013, 16:08

Dokładnie tak. Na bazie klasy TIniFile można stworzyć własną klasę rozszerzoną o dodatkowe elementy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis struktury z dynmicznymi tablicami

Nowy postprzez oneiro » niedziela, 27 stycznia 2013, 16:14

Heheh, żebym jeszcze wiedział jak to zrobić, pewnie musiałbym odziedziczyć wszystko po klasie TIniFile plus metoda zapisująca komentarz - i tutaj zaczynają się schody, bo nawet nie wiem od czego zacząć
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości