Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 20 12:21 #2109

  • drschwarcz
  • drschwarcz profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 0
Így már tényleg működik, ha a rekordot is "packed"-re állítom. Tömörítve mind a két verzió egyformán kezeli a tömböket és a rekordokat. :woohoo: Köszönöm a megoldást!

Mellesleg jegyzem meg, hogy a konverzió készítése közben fedeztem fel, hogy az 1.6.0 a CopyFile és a DelTree függvényeknél sem kezeli a magyar ékezetes betűket. Kezdek kiábrándulni...
Lazarus 1.8.0RC1 @ Windows 10
“Csak két dolog végtelen: a Világegyetem és az emberi butaság, bár az elsőben nem vagyok egészen biztos.” (Albert Einstein) :D ;)

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 19 20:39 #2108

  • ejbenjaro
  • ejbenjaro profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
Hmm. Mind a két Lazarus verzióval nyomjál már egy SizeOf-ot a rekord típusodra. Én próbáltam összehozni egy ilyen rekordot, és az 1.4-es 1824 byte, az 1.6-os alatt 1796 byte volt a visszaadott érték.
Ha a rekordtípust az alábbira módosítottam mind a két verzió alatt, akkor nem volt gond a visszaolvasással SizeOf-ra pedig egységesen 1794 byte-ot kaptam:
type
  str250=String[250];
 
  Adat = packed Record
    SorSzamEv : Word;
    SorSzam : Integer;
    Nev: Str250;
    Adatmentes : Boolean;
    AnyagNev : packed Array [1..6] of Str250;
    AnyagDarab : packed Array [1..6] of Byte;
    AnyagAr : packed Array [1..6] of Integer;
  end;

Én azt csinálnám, hogy az 1.4-essel csinálnék egy programot, ami átkonvertálja ezt az adatbázist a fentebbi rekordtípus szerint, így már az 1.6-os verzióval fordított program sem fog problémázni az adatokkal.
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/
Megköszönték: drschwarcz

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 19 18:06 #2107

  • drschwarcz
  • drschwarcz profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 0
A "packed" kiegészítés sem segített, sajnos. Ékezetes adatokat sikeresen visszaolvas a tömb előtt.

Köszönöm az ötleteket.
Lazarus 1.8.0RC1 @ Windows 10
“Csak két dolog végtelen: a Világegyetem és az emberi butaság, bár az elsőben nem vagyok egészen biztos.” (Albert Einstein) :D ;)

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 19 17:45 #2104

  • ejbenjaro
  • ejbenjaro profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
AnyagNev : packed Array [1..6] of String[250];
AnyagDarab : packed Array [1..6] of Byte;
AnyagAr : packed Array [1..6] of Integer;

Ha így alakítod a rekordban a tömböket az 1.6-os alatt? Vagy próbálj meg ékezetek nélkül felvinni adatokat a string tömbbe, hogy akkor visszaolvassa e. Ha igen, akkor talán közelebb jutottunk a probléma megoldásához.
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 19 13:27 #2102

  • drschwarcz
  • drschwarcz profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 0
Amíg nincs tömb használat, addig rendben visszaolvassa az adatokat. A "kiadva ügyfélnek" pipa egy Boolean típus. Ez még rendben visszajön és ez nincs tömbbe foglalva. A "megnevezés", "darab", "ár" mezők adatai vannak tömbben tárolva.
Kiadva : Boolean;
AnyagNev : Array [1..6] of String[250];
AnyagDarab : Array [1..6] of Byte;
AnyagAr : Array [1..6] of Integer;

Az első kép az eredeti...



Lazarus 1.8.0RC1 @ Windows 10
“Csak két dolog végtelen: a Világegyetem és az emberi butaság, bár az elsőben nem vagyok egészen biztos.” (Albert Einstein) :D ;)
Mellékletek:

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 18 18:25 #2101

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Ha másolnál ide egy rekordot (személyes adatok nélkül), hogy mi az eredetileg mentett és mi az amit visszaad helyette az új változat az sokat segíthetne a hibakeresésben...
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 18 05:15 #2100

  • drschwarcz
  • drschwarcz profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 0
A gondolat kiváló, én is próbáltam, de sajnos nem oldja meg a dolgot. A problémát nem a változók kezelése okozza, szerintem a rekord és a tömb kezelés a gond, de nem találtam megoldást.
Lazarus 1.8.0RC1 @ Windows 10
“Csak két dolog végtelen: a Világegyetem és az emberi butaság, bár az elsőben nem vagyok egészen biztos.” (Albert Einstein) :D ;)

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 17 20:45 #2099

  • ejbenjaro
  • ejbenjaro profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
Esetleg egy {$PACKRECORDS 32 c} fordítódirektíva? ( freepascal.org/docs-html/current/prog/progsu60.html#x67-660001.2.60 )

Ez alapján:
RTTI for Records

Old behavior: Records RTTI stored field Offsets as 32bit integers.
New behavior: Records RTTI stores field Offsets as platform-dependent integers (the same size as pointers).
Reason: Internally the compiler stores Offsets as platform-dependent integers. The new behaviour is Delphi-compatibile.
Remedy: You need to adjust your code if you used field offsets of record RTTI. This is also true if your code processes any vInitTable field within the VMT of a class.
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/
Megköszönték: drschwarcz

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 14 19:49 #2098

  • drschwarcz
  • drschwarcz profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 0

Elsőre azt mondanám, hogy az Integer típus mérete okozhatja a problémát, mely nem minden fordító üzemmódban ugyanaz. Az alapértelmezett (FPC) módban az Integer típus mérete 16bit, míg az ObjFPC és Delphi módokban 32bit. Lásd: Predefined integer types

Próbáld úgy fordítani a programodat, hogy az egyszerű Integer helyett SmallInt vagy LongInt típust használsz. Szintén segíthet a {$MODE xxxx} direktíva megfelelő paraméterrel történő használata a forráskód elején.


A programot alapból {$MODE ObjFPC}{H+} kapcsolókkal készítettem, így az Integer típust alapból LongInt-ként kezeli a fordító. Átalakítottam a szükséges dolgokat, hogy {$MODE FPC} kapcsolóval elinduljon a progi, de ez sem hozott eredményt. A Delphi mód eleve kizárva, mivel pont a Delphi-vel való kompatibilitási változtatások (FPC 2.6.4 -> 3.0.0) okozzák a gondomat.

Magyar ékezetes betűk szerepeltek a string-ben? A karakterek különböző kódolásai a freepascal verzióváltásnál okozhat meglepetéseket. A régi Ansi-ként menthette le, az új meg UTF8-ként próbálná értelmezni, és ez pl. magyar ékezetes karakterek esetén nem lesz sikeres. Ha ez a helyzet, akkor WinCPToUTF8 függvénnyel lehetne egyszer átkonvertálni a fájl string tartalmát magyar Ansi-ről UTF8-ra.


Egy esetben jelentkezett ez a probléma, amikor MessageBox függvényt használok. WinCPToUTF8 függvényt nekem nem talált a fordító. Nem nagy gond, MessageBox helyett QuestionDlg tökéletesen működik.
Lazarus 1.8.0RC1 @ Windows 10
“Csak két dolog végtelen: a Világegyetem és az emberi butaság, bár az elsőben nem vagyok egészen biztos.” (Albert Einstein) :D ;)

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 13 09:10 #2097

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
Magyar ékezetes betűk szerepeltek a string-ben? A karakterek különböző kódolásai a freepascal verzióváltásnál okozhat meglepetéseket. A régi Ansi-ként menthette le, az új meg UTF8-ként próbálná értelmezni, és ez pl. magyar ékezetes karakterek esetén nem lesz sikeres. Ha ez a helyzet, akkor WinCPToUTF8 függvénnyel lehetne egyszer átkonvertálni a fájl string tartalmát magyar Ansi-ről UTF8-ra.
Megköszönték: drschwarcz

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 13 06:26 #2096

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Elsőre azt mondanám, hogy az Integer típus mérete okozhatja a problémát, mely nem minden fordító üzemmódban ugyanaz. Az alapértelmezett (FPC) módban az Integer típus mérete 16bit, míg az ObjFPC és Delphi módokban 32bit. Lásd: Predefined integer types

Próbáld úgy fordítani a programodat, hogy az egyszerű Integer helyett SmallInt vagy LongInt típust használsz. Szintén segíthet a {$MODE xxxx} direktíva megfelelő paraméterrel történő használata a forráskód elején.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64
Megköszönték: drschwarcz

Adat kompatibilitás Lazarus 1.4.4 és 1.6 között 2016 szept. 12 14:28 #2095

  • drschwarcz
  • drschwarcz profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 0
Sziasztok!

Egy típusos fáljban tárolok adatokat. A fájl típusául szolgáló record, leegyszerűsítve:

Adat = Record
SorSzamEv : Word;
SorSzam : Integer;
Nev: String[250];
Adatmentes : Boolean;
AnyagNev : Array [1..6] of String[250];
AnyagDarab : Array [1..6] of Byte;
AnyagAr : Array [1..6] of Integer;
end;


Az adatok feltöltése Lazarus 1.4.4-gyel fordított programmal történt. A gond ott kezdődik, ha ugyanazt a forráskódot lefordítom Lazarus 1.6-tal, akkor az adatok visszakérdezése hibás. Sejtem, hogy a FPC 2.6.4 és 3.0.0 között történt változás a változók kezelésében, de olvasgatva a változáslistát, abból nekem nem derült ki, hogy hogyan lehetne ezt orvosolni.

Valaki találkozott hasonlóval, esetleg van megoldás is?

Windows rendszer alatt fejlesztek.

Előre is köszönöm a válaszokat.

Ottó
Lazarus 1.8.0RC1 @ Windows 10
“Csak két dolog végtelen: a Világegyetem és az emberi butaság, bár az elsőben nem vagyok egészen biztos.” (Albert Einstein) :D ;)

  • Oldal:
  • 1