Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Trebaju mi dvije linije koda (ili mozda cak samo jedna)

32 views
Skip to first unread message

Chupo

unread,
Oct 24, 2012, 9:55:36 PM10/24/12
to
Kao sta se vidi, ovaj program

http://codepad.org/WlTRv0cw

radi ispravno (sve se dogadja u linijama 30 i 32). Sad mi treba sta da
napisem umjesto njih da bi isti progam radio s managed array (detalji
su u komentarima), jednu sam mozda vec i napisao ali ne znam dalje.
--
Chupo

Chupo

unread,
Oct 24, 2012, 10:40:16 PM10/24/12
to
> sve se dogadja u linijama 30 i 32
>

Pardon - u linijama 29 i 31.
--
Chupo

Bruno Babic

unread,
Oct 25, 2012, 4:16:21 AM10/25/12
to
On 25.10.2012. 3:55, Chupo wrote:
> radi ispravno (sve se dogadja u linijama 30 i 32). Sad mi treba sta da
> napisem umjesto njih da bi isti progam radio s managed array (detalji
> su u komentarima), jednu sam mozda vec i napisao ali ne znam dalje.

29: tocka_rute tocke[] = new tocka_rute[broj_tocaka_rute];

Ovo ce ti deklarirati tocke kao managed array. Nisam bas siguran da sam
shvatio sto hoces.

I ti bi sad htio napraviti memcpy iz buffer_dyn tako da prepises jedan
element onog gore arraya?

--
bbabic(a)globalnet.hr
2b||!2b?

Chupo

unread,
Oct 25, 2012, 5:16:49 AM10/25/12
to
In article <k6ash5$fp4$1...@ls237.t-com.hr>, Bruno Babic <a@b.c> says...
> 29: tocka_rute tocke[] = new tocka_rute[broj_tocaka_rute];
>
> Ovo ce ti deklarirati tocke kao managed array. Nisam bas siguran da sam
> shvatio sto hoces.
>
> I ti bi sad htio napraviti memcpy iz buffer_dyn tako da prepises jedan
> element onog gore arraya?
>

Htio bih reproducirati isto sta radi ovaj program na kojeg sam dao
link:

http://codepad.org/WlTRv0cw

ali u C++/CLI Win Forms .NET aplikaciji.

Problem je da ne znam deklarirati unmanaged struct (ne znam niti da li
je to moguce) unutar managed koda. Ako bi mogo koristiti unmanaged
struct-ove, array-e i pointere, onda bi ovaj program radio bez ikakvih
preinaka. Medjutim ako probam deklarirati 'normalan' unmanaged struct,
compiler javlja:

error C2814: a native type cannot be nested within a managed type

ili

error C3923: local class, struct or union definitions are not allowed
in a member function of a managed class

u ovisnosti gdje ga pokusam deklarirati.

Program iz buffer_dyn u kojem je cijeli binarni file, s mjesta na
odredjenom offset-u s memcpy direktno u struct (koji je u array-u)
ubacuje 32 byte-a koji se tocno poklope s odgovarajucim variablama
unutar struct-a (s hex editorom sam provjerio da zapisi odgovaraju).

Program radi - ako stisnes fork pa npr. u liniji 20 umjesto 0x1e stavis
neki drugi broj i stisnes RUN, onda se moze vidjeti da ce se s memcpy
taj broj upisati upravo na poziciju LSB-a variable int brzina unutar
struct-a i u liniji 35 se ispravno ispisati kao tocke[0].brzina.

Trebalo bi mi da taj program, takav kakav je, mogu skompjlirati unutar
C++/CLI Win Form aplikacije - ali to ne mogu postici jer ne znam kako
da deklariram native struct, pa trazim neki workaround. Zbog toga sam
bio prisiljen deklarirati managed struct (s 'ref' i zato sam s

array<tocka_rute^>^ tocke = gcnew array<tocka_rute^>(broj_tocaka_rute);

pokusao deklarirati managed couterpart od

tocka_rute *tocke = new tocka_rute[broj_tocaka_rute];

ali nisam znao sta dalje.

Najsretniji bi bio kad ne bi ni trebao deklarirati managed struct nego
da mogu deklarirati 'obicni'.

To mi treba jer u file-u kojeg cu konvertirati ima nekoliko struktura
(indexi tocaka - nesta ko TOC, zaglavlja svake rute, podaci o svakoj
tocki rute - to je ovaj struct kojeg sam stavio za primjer, ...).

File kojeg cu kreirati ce sadrzavati iste informacije ali u drukcijim
blokovima podataka (neki float-i ce biti double-i i podaci su
organizirani malo drukcije).

Cilj mi je binarni file iz buffer-a po blokovima ucitavati u
odgovarajuce struct-ove, na osnovu procitanog puniti struct-ove koji
odgovaraju izlaznom file-u, puniti izlazni buffer, i na kraju izlazni
buffer upisati u file na disk-u.

Kad bih radio u 'obicnom' C++ sve bi vec bilo rijeseno ali ovako, s
obzirom da zelim napraviti Win Forms app, se je pojavio ovaj opisani
problem. Znaci, zelim da ovaj kod (ili njegov ekvivalent) s gornjeg
ilinka, koji inace radi tocno ono sta zelim, proradi u C++/CLI Win
Forms .NET aplikaciji.
--
Chupo

Bruno Babic

unread,
Oct 25, 2012, 6:31:36 AM10/25/12
to
On 25.10.2012. 11:16, Chupo wrote:
> Kad bih radio u 'obicnom' C++ sve bi vec bilo rijeseno ali ovako, s
> obzirom da zelim napraviti Win Forms app, se je pojavio ovaj opisani
> problem. Znaci, zelim da ovaj kod (ili njegov ekvivalent) s gornjeg
> ilinka, koji inace radi tocno ono sta zelim, proradi u C++/CLI Win
> Forms .NET aplikaciji.

MSDN is your friend:
http://msdn.microsoft.com/en-us/library/6w96b5h7.aspx

Dakle, ako zelis deklarirati managed struct, napravi to onako kako MS
kaze da treba.

Iako, nije mi bas jasno zasto zelis uopce koristiti managed C++?

--
bbabic(a)globalnet.hr
2b||!2b?

Chupo

unread,
Oct 25, 2012, 7:30:24 AM10/25/12
to
In article <k6b4er$nfa$1...@ls237.t-com.hr>, Bruno Babic <a@b.c> says...
> MSDN is your friend:
> http://msdn.microsoft.com/en-us/library/6w96b5h7.aspx
>
> Dakle, ako zelis deklarirati managed struct, napravi to onako kako MS
> kaze da treba.
>

Zelim deklarirati *un*managed struct ali unutar managed koda a managed
struct sam deklarirao silom prilika. Managed sam bio prisiljen
koristiti jer mi compiler unutar C++ Win Form aplikacije ne da
deklarirati unmanaged struct (odnosno, ne znam kako se to radi).

> Iako, nije mi bas jasno zasto zelis uopce koristiti managed C++?
>

Jer da bi napravio aplikaciju s GUI-em i ako zelim koristiti VS, C++ i
visual designer, a ne zelim koristiti MFC, Win API i slicno, kod
kreiranja Projecta-a mi ne preostaje drugo nego odabrati Windows Forms
Application i kao posljedica toga se javljaju razni problemi :-)

Kao npr. taj kojega sam opisao ili onaj kojeg sam opisao negdje unutar
prethodnog thread-a - problem s prebacivanjem izmedju System::String i
std::string, ovo na samom dnu posta:

http://tinyurl.com/cmpc3gr

oznaceno s #02.

Kod kojeg sam dao bi, samo da se nekako deklarira unmanaged struct,
radio nakon obicnog copy/paste-a u button click event od C++ Win Forms
aplikacije.

Managed struct bi znaci svakako zelio izbjeci ako se moze. Jer se
prilikom kopiranja iz managed u unmanaged koda (ili ne znam kako bi to
nazvao - mozda 'memorijskog okruzenja') zbog garbage collection-a
moraju pin-ati pointeri a i zbog drukcijeg mapiranja strukruta u RAM-u
se izgleda mora explicitno zadati nacin mapiranja variabli jer inace
memcpy ne bi imao smisla. Bar sam tako shvatio citajuci desetke
odgovora po raznim forumima. A u 'obicnom' C++ znam da su float i
double zapisani ko 4 ili 8 bytes LSB first i provjerio sam da se to
upravo poklapa sa zapisom u binarnom file-u kojeg citam - tako da bi mi
bilo idealno da se managed kodu ne moram niti pribliziti. Da li je ovo
situacija gdje se ne moze imati 'i ovce i novce', jos nisam siguran.
Jer jedan mi je covjek sa StackOverflow-a reko: 'Why are you having
trouble declaring the unmanaged struct in managed code? I can help you
there, if it is an option.', ali je u medjuvremenu otiso offline pa cu
vidjeti sta ce mi poslati kad ponovo dodje online... Odgovorio sam mu
da ne da mi je to opcija nego da mi je to prva opcija ako je moguca,
ali neznam u kojoj je on vremenskoj zoni, mozda je sad bas kod njega
noc, pa treba pocekati da vidim sta ce reci...
--
Chupo

Leclerc

unread,
Oct 25, 2012, 8:16:43 AM10/25/12
to
> Jer da bi napravio aplikaciju s GUI-em i ako zelim koristiti VS, C++ i
> visual designer, a ne zelim koristiti MFC, Win API i slicno, kod
> kreiranja Projecta-a mi ne preostaje drugo nego odabrati Windows Forms
> Application i kao posljedica toga se javljaju razni problemi :-)

a da proba� ne�to od ovoga?

http://en.wikipedia.org/wiki/List_of_platform-independent_GUI_libraries

Zeljko Vrba

unread,
Oct 25, 2012, 8:31:03 AM10/25/12
to
On 2012-10-25, Chupo <bad_...@yahoo.com> wrote:
>
> Managed struct bi znaci svakako zelio izbjeci ako se moze. Jer se
>
-cut-

Vrijeme ti je da si nabavis knjigu i pocnes otpocetka.

> prilikom kopiranja iz managed u unmanaged koda (ili ne znam kako bi to
> nazvao - mozda 'memorijskog okruzenja') zbog garbage collection-a
> moraju pin-ati pointeri a i zbog drukcijeg mapiranja strukruta u RAM-u
> se izgleda mora explicitno zadati nacin mapiranja variabli jer inace
> memcpy ne bi imao smisla. Bar sam tako shvatio citajuci desetke

I u cemu je problem sa pinanjem pointerima i opisom struct layouta?

Chupo

unread,
Oct 25, 2012, 11:05:45 AM10/25/12
to
In article <slrnk8ic87...@fly.srk.fer.hr>, Zeljko Vrba
<mordor...@fly.srk.fer.hr> says...
> I u cemu je problem sa pinanjem pointerima i opisom struct layouta?
>

Ocito je da da ne znam syntaxu pa da to i zapisem.
--
Chupo

Chupo

unread,
Oct 25, 2012, 11:10:52 AM10/25/12
to
In article <k6bajm$f52$1...@sunce.iskon.hr>, Leclerc
<gordan.si...@this.inet.hr> says...
> a da probaš nešto od ovoga?
>
> http://en.wikipedia.org/wiki/List_of_platform-independent_GUI_libraries
>

Odlican pregled, hvala!! Mislim da ce mi Lazarus i Qt biti prvi
kandidati za isprobavanje.
--
Chupo

Zeljko Vrba

unread,
Oct 25, 2012, 12:57:54 PM10/25/12
to
On 2012-10-25, Chupo <bad_...@yahoo.com> wrote:
>
> Ocito je da da ne znam syntaxu pa da to i zapisem.
>
Uopce nije ocito jer je konceptualno ispravno napisano. Tako da sam taj
odlomak shvatio kao jos kukanje o stvarima koje ti otezavaju zivot, za
razliku od PB-a gdje je sve straightforward.


Chupo

unread,
Oct 25, 2012, 2:15:46 PM10/25/12
to
In article <slrnk8irsi...@fly.srk.fer.hr>, Zeljko Vrba
<mordor...@fly.srk.fer.hr> says...
> Uopce nije ocito jer je konceptualno ispravno napisano. Tako da sam taj
> odlomak shvatio kao jos kukanje o stvarima koje ti otezavaju zivot, za
> razliku od PB-a gdje je sve straightforward.
>

Napisao sam: 'Managed struct bi znaci svakako zelio izbjeci ako se
moze. Jer se prilikom kopiranja iz managed u unmanaged koda (ili ne
znam kako bi to nazvao - mozda 'memorijskog okruzenja') zbog garbage
collection-a moraju pin-ati pointeri a i zbog drukcijeg mapiranja
struktura u RAM-u se izgleda mora explicitno zadati nacin mapiranja
variabli jer inace memcpy ne bi imao smisla. Bar sam tako shvatio
citajuci desetke odgovora po raznim forumima.'

Iz ove se zadnje recenice vidi da govorim o necem o cemu sam samo citao
ali ne i isprobao u praxi.

Nakon sta sam procitao jos nekoliko desetaka odgovora na slicna pitanja
sam doso do dva slijedeca zakljucka:

1. Unutar managed koda se definitivno moze raditi s native struct-ovima

2. To je the way to go - odbacujem rjesenje s managed struct-ovima, a
do rjesenja kako unutar managed koda raditi s unmanaged struct-ovima
mislim da ce me odvesti upravo ovaj clanak:

http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx

Mozda nije bas up-to-date ali ni ja ne koristim bas up-to-date
framework. Clanak je odlican. Taj i ovaj na kojeg je autor dao link:

http://weblogs.asp.net/kennykerr/archive/2005/07/12/419102.aspx

U prvom je clanku je problematika koristenja native struct-a unutar
managed koda objasnjena jasno da da jasnije ne moze biti i cini mi se
da cu uz te informacije u managed kodu moci dobiti pointer na unmanaged
struct u kojeg cu podatke iz buffera kopirati s memcpy tocno na nacin
na koji ih kopiram u kodu kojeg sam dao u prvom postu.

Osim toga mi je covjek na isto ovo pitanje postavljeno na
StackOverflow-u najavio da ce mi napisati kako da u managed kodu
koristim unmanaged struct:

http://tinyurl.com/cchy6mf

Vjerojatno ce mi poslati kod slican ovome iz prvog clanka.
--
Chupo

Melzzzzz

unread,
Oct 25, 2012, 5:10:34 PM10/25/12
to
On Thu, 25 Oct 2012 20:15:46 +0200
Chupo <bad_...@yahoo.com> wrote:

> In article <slrnk8irsi...@fly.srk.fer.hr>, Zeljko Vrba
> <mordor...@fly.srk.fer.hr> says...
> > Uopce nije ocito jer je konceptualno ispravno napisano. Tako da
> > sam taj odlomak shvatio kao jos kukanje o stvarima koje ti
> > otezavaju zivot, za razliku od PB-a gdje je sve straightforward.
> >
>
> Napisao sam: 'Managed struct bi znaci svakako zelio izbjeci ako se
> moze. Jer se prilikom kopiranja iz managed u unmanaged koda (ili ne
> znam kako bi to nazvao - mozda 'memorijskog okruzenja') zbog garbage
> collection-a moraju pin-ati pointeri a i zbog drukcijeg mapiranja
> struktura u RAM-u se izgleda mora explicitno zadati nacin mapiranja
> variabli jer inace memcpy ne bi imao smisla. Bar sam tako shvatio
> citajuci desetke odgovora po raznim forumima.'

To ti isto vazi i za standardan c++. Naime sta ako je int 64 bitni ;)
Onda moras definisati tip int32_t ili koristiti <cstdint> ...
Jednostavnije ti je samo da pinas pointer pa opalis memcpy.

public ref class Reader abstract sealed
{
public:
generic <typename T> where T : value class
static T Read(array<System::Byte>^ data)
{
T value;

pin_ptr<System::Byte> src = &data[0];
pin_ptr<T> dst = &value;

memcpy((void*)dst, (void*)src,
/*System::Runtime::InteropServices::Marshal::SizeOf(T::typeid)*/
sizeof(T));

return value;
}
};

http://www.codeproject.com/Articles/25896/Reading-Unmanaged-Data-Into-Structures



Chupo

unread,
Oct 26, 2012, 1:14:09 AM10/26/12
to
> Htio bih reproducirati isto sta radi ovaj program na kojeg sam dao
> link:
>
> http://codepad.org/WlTRv0cw
>
> ali u C++/CLI Win Forms .NET aplikaciji.
>
> Problem je da ne znam deklarirati unmanaged struct (ne znam niti da li
> je to moguce) unutar managed koda. Ako bi mogo koristiti unmanaged
> struct-ove, array-e i pointere, onda bi ovaj program radio bez ikakvih
> preinaka. Medjutim ako probam deklarirati 'normalan' unmanaged struct,
> compiler javlja:
>
> error C2814: a native type cannot be nested within a managed type
>
> ili
>
> error C3923: local class, struct or union definitions are not allowed
> in a member function of a managed class
>
> u ovisnosti gdje ga pokusam deklarirati.
>

<snip>

>
> Trebalo bi mi da taj program, takav kakav je, mogu skompjlirati unutar
> C++/CLI Win Form aplikacije - ali to ne mogu postici jer ne znam kako
> da deklariram native struct, pa trazim neki workaround. Zbog toga sam
> bio prisiljen deklarirati managed struct...
>

<snip>

>
> Kad bih radio u 'obicnom' C++ sve bi vec bilo rijeseno ali ovako, s
> obzirom da zelim napraviti Win Forms app, se je pojavio ovaj opisani
> problem. Znaci, zelim da ovaj kod (ili njegov ekvivalent) s gornjeg
> linka, koji inace radi tocno ono sta zelim, proradi u C++/CLI Win
> Forms .NET aplikaciji.
>

Konacno evo rjesenja do kojeg sam doso nakon sta mi je covjek na ovo
isto postavljeno pitanje na StackOvewflow-u:

http://tinyurl.com/cchy6mf

odgovorio s 4 rijeci!! :-)) Napisao mi je:

'investigate #managed and #unmanaged'

Na osnovu toga sam pogledao:

http://msdn.microsoft.com/en-us/library/0adb9zxe.aspx

i rjesenje je:

1. Staviti

#pragma managed (push,off)
int read_block(char *buffer_dyn, int broj_tocaka_rute) {
// OVDJE DEKLARIRATI UNMANAGED STRUCT
// obaviti sve sta je potrebno (mymcpy itd.)
return return tocke[0].brzina; // recimo, nije bitno sta vracam
}
#pragma managed (pop)

2. Promijeniti compiler-ovu command line opciju iz /clr:pure u /clr

I to je to!! C++ kod kojeg sam dao u prvom postu dalje radi unutar
managed okruzenja bez ikakvih preinaka, copy/paste C++ koda i gotovo...
Nikakvih zezancija s razmisljanjem kako su struct-ovi spremljeni u
managed RAM-u, nikakvih pin-anja pointera, sve rijeseno. Testirao sam i
radi. Naravno, da bi sve bilo funkcionalno u read_block() treba poslati
i pointer na izlazni buffer i jos par parametara, ovdje sam stavio samo
primjer koji demonstrira rjesenje koje sam trazio.

Zahvaljujem svima koji su izdvojili vrijeme da procitaju moje postove i
da mi svojim odgovorima pomognu, kao i svaki put - usput sam naucio
dosta korinih novih stvari. A onima koje je sve ovo skupa na neki nacin
uznemirilo predlazem da me jednostavno stave u filter i na taj nacin
vrlo elegantno izbjegnu eventualna buduca zivciranja zbog mojih
eventualnih buducih pitanja. Istina, text mojeg posta bi se mogo
pojaviti i u necijem quote-u, pa - ako je i to problem - mozemo sloziti
regexp-ove koji ce filtrirati i takve postove :-) Zadnju recenicu bi
trebalo shvatiti ko malo humora u ova tmurna vremena :-)
--
Chupo

Chupo

unread,
Oct 26, 2012, 1:18:07 AM10/26/12
to
In article <k6c9sb$i55$1...@news.albasani.net>, Melzzzzz <m...@zzzzz.com>
says...
> To ti isto vazi i za standardan c++. Naime sta ako je int 64 bitni ;)
> Onda moras definisati tip int32_t ili koristiti <cstdint> ...
> Jednostavnije ti je samo da pinas pointer pa opalis memcpy.
>
> public ref class Reader abstract sealed
> {
> public:
> generic <typename T> where T : value class
> static T Read(array<System::Byte>^ data)
> {
> T value;
>
> pin_ptr<System::Byte> src = &data[0];
> pin_ptr<T> dst = &value;
>
> memcpy((void*)dst, (void*)src,
> /*System::Runtime::InteropServices::Marshal::SizeOf(T::typeid)*/
> sizeof(T));
>
> return value;
> }
> };
>
> http://www.codeproject.com/Articles/25896/Reading-Unmanaged-Data-Into-Structures
>

Hvala na linku i kodu! I na ostalim odgovorima od ranije.

Malo prije sam rijesio uz odgovor kojeg sam dobio na StackOverflow,
prije par minuta sam u ovaj thread poslao opis rjesenja.

Pozdrav,
--
Chupo

Zeljko Vrba

unread,
Oct 26, 2012, 2:14:04 AM10/26/12
to
On 2012-10-25, Chupo <bad_...@yahoo.com> wrote:
>
> Iz ove se zadnje recenice vidi da govorim o necem o cemu sam samo citao
> ali ne i isprobao u praxi.
>
Tako je, i to na ni na koji nacin ne implicira da ne znas
kako se mrdnut dalje.

http://www.codeproject.com/Articles/10750/Fast-Binary-File-Reading-with-C


Zeljko Vrba

unread,
Oct 26, 2012, 2:19:12 AM10/26/12
to
On 2012-10-26, Chupo <bad_...@yahoo.com> wrote:
>
> I to je to!! C++ kod kojeg sam dao u prvom postu dalje radi unutar
> managed okruzenja bez ikakvih preinaka, copy/paste C++ koda i gotovo...
> Nikakvih zezancija s razmisljanjem kako su struct-ovi spremljeni u
> managed RAM-u, nikakvih pin-anja pointera, sve rijeseno. Testirao sam i
>
Radi zapravo slucajno. Direktno citanje iz fajla u struct u memoriji
ce se garantirano raspast pod manje sretnim okolnostima.

natko

unread,
Oct 26, 2012, 2:32:32 AM10/26/12
to

"Zeljko Vrba" <mordor...@fly.srk.fer.hr> wrote in message news:slrnk8kar0...@fly.srk.fer.hr...
Stvarno imaš volje :-))

Chupo

unread,
Oct 26, 2012, 3:07:23 AM10/26/12
to
In article <slrnk8kar0...@fly.srk.fer.hr>, Zeljko Vrba
<mordor...@fly.srk.fer.hr> says...
> Radi zapravo slucajno.

Naravno da sam prvo u hex editoru analizirao svaki od razlicitih
podataka spremljenih unutar file-a. U file-u su cjelobrojni podaci
spremljeni u 4 byte-a (LSB first), float i double su spremljeni u 4 i 8
byte-ova, tocno po IEEE-754 kako su spremljeni i u RAM-u unutar C++
programa pokrenutnog na 32 bitnim Windows-ima.

> Direktno citanje iz fajla u struct u memoriji
> ce se garantirano raspast pod manje sretnim okolnostima.
>

Nisam nikad previse istrazivao ali mislim da bi compiler vec kod
compajliranja morao znati koliko koja variabla zauzima byte-ova. U tom
smislu tumacim i ovu recenicu: 'The values of the columns Size and
Range depend on the system the program is compiled for.', a na slican
zakljucak navodi i podatak kojeg sam negdje procitao da se sizeof()
izracunava jos za vrijeme kompajliranja.

Ali ipak, program cu svakako testirati i na 32 i 64 bitnim verzijama
XP-a, Viste i Sedmice (poslacu ga frendovima u mail-u :-) da ga
isprobaju jer ja imam samo XP). Ako bi u nekom slucaju int zauzeo 8
umjesto 4 byte-a, lako cu u vrlo kratkom vremenu prepraviti program da
podatke kopira byte po byte (o cemu sam vec razmisljao kad jos nisam
znao da li ce se poklapati endianness) ili u medjubuffer iz kojega cu
vrijednosti iscitavati sa svojom funkcijom. Ali ne vjerujem da ce biti
problema, float-i su standardizirani sa spomenutom normom i mislim da
ce se podaci i tamo podudarati s

http://babbage.cs.qc.cuny.edu/IEEE-754/

a zbog gore navedenih razloga mislim da bi OK trebalo biti i s
integerima.
--
Chupo

Chupo

unread,
Oct 26, 2012, 3:26:53 AM10/26/12
to
In article <slrnk8kahc...@fly.srk.fer.hr>, Zeljko Vrba
<mordor...@fly.srk.fer.hr> says...
> Tako je, i to na ni na koji nacin ne implicira da ne znas
> kako se mrdnut dalje.
>
> http://www.codeproject.com/Articles/10750/Fast-Binary-File-Reading-with-C
>

Iako je sad rijeseno na drugi nacin, svakako cu detaljno prouciti i ovo
sta si poslao, hvala!
--
Chupo

Zeljko Vrba

unread,
Oct 26, 2012, 7:42:08 AM10/26/12
to
On 2012-10-26, natko <n...@gmail.com> wrote:
>
> Stvarno imaš volje :-))
>

:)

Chupo

unread,
Oct 27, 2012, 12:44:47 AM10/27/12
to
In article <slrnk8kar0...@fly.srk.fer.hr>, Zeljko Vrba
<mordor...@fly.srk.fer.hr> says...
> Radi zapravo slucajno. Direktno citanje iz fajla u struct u memoriji
> ce se garantirano raspast pod manje sretnim okolnostima.
>

Niti je slucajno niti ce se citati samo direktno iz file-a u struct,
nego ce se cak citati direktno iz file-a (preko buffer-a naravno) u
array of struct. Na slici:

http://img196.imageshack.us/img196/5236/arrayofstructhex.png

je gore hex file-a (otvorenog s hard disk-a u hex editoru i offset-i se
odnose na pocetak file-a, na 0x6c pocinju index-i GPS ruta). Ispod je
sadrzaj RAM-a na lokaciji koju zauzima array koji je napunjen ovako:

offset = 0x6c;
index_rute *indexi_ruta = new index_rute[broj_ruta_u_fileu];
memcpy(&indexi_ruta[0],input_buffer+offset,broj_ruta_u_fileu*12);

Struct zauzima 12 byte-ova:

typedef struct GPS_index {
int broj_rute;
int offset_rute; // offset na prvi byte header-a rute
int broj_tocaka;
} index_rute;

u ovom slucaju je broj_ruta_u_fileu = 2 pa su se u jednom kopiranju
prebacila 24 byte-a i poklopila se s nultim i prvim elementom array-a,
a koji su struct-ovi od po 3 4 byte-na integera.

input_buffer je

char *input_buffer;

u kojeg je s ifstream ucitani cijeli binarni file.

Uz sve ono sta sam napisao ranije, i uz ovo:

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

a s obzirom da je #pragma pack (show) prijavio 8, ne trebam nista
mijenjati da bi zapis array-a struct-ova u RAM-u bio u skladu s
podacima koje u njega kopiram.

To da je 'proradilo slucajno' implicira da radim na pamet, da ne znam
sta radim, i da sam imao srece. Medjutim, prvo o cemu sam razmisljao je
bilo da li cu podatke takve kakvi jesu u file-u moci - ili ih necu
moci, bez pretumbavanja kopirati u velikim blokovima.

Ovaj screenshot

http://img547.imageshack.us/img547/3956/gsr02.png

takodjer dokazuje da sve radi ispravno - isti podaci su ispisani dvaput
jer ih iscitavam na dva razlicita nacina, a u obadva slucaja ispisuju
nakon sta su podaci prebacivani s memcpy.

I sad kad jos malo razmisljam - brzina izvodjenja programa ce ipak biti
vazna. Programu koji se dobije uz GPS uredjaj treba nekoliko sekundi da
nakon otvaranja file-a s podacima koji su nastali logiranjem podataka u
roku 2 sata, te iste podatke i prikaze u prozoru. GPS sam tek kupio i
jos nisam napunio RAM, ali s obzirom da u njega stane podataka za preko
18 sati logiranja (ako se svi podaci logiraju svake sekunde), nije isto
da li ce program logirane podatke prikazati nakon 5 ili 45 sekundi
cekanja. A moj ce program (nadam se) podatke prikazati u za red
velicine kracem vremenu od programa koji se isporucuje s uredjajem.
--
Chupo

Zeljko Vrba

unread,
Oct 27, 2012, 2:09:19 AM10/27/12
to
On 2012-10-27, Chupo <bad_...@yahoo.com> wrote:
>
> Niti je slucajno niti ce se citati samo direktno iz file-a u struct,
> nego ce se cak citati direktno iz file-a (preko buffer-a naravno) u
> array of struct. Na slici:
>
Nije blitva nego kelj :p

Chupo

unread,
Oct 28, 2012, 3:20:06 AM10/28/12
to
In article <slrnk8mukf...@fly.srk.fer.hr>, Zeljko Vrba
<mordor...@fly.srk.fer.hr> says...
> Nije blitva nego kelj :p
>

Bilo kako bilo, works like a charm:

http://codepad.org/qWvd1GXn

Ovo je srce programa, siguran sam da ce ti se dopasti memcpy u polovicu
struct-a u 82. liniji :-)

Ko sta se moze vidjeti, nisam jos odgonetnuo sve podatke ali one koje
nisam, sam ili hard kodirao ili kopirao. U ovom djelicu programa nema
koda koji se bavi s file-om do offset-a 0x6c, ali on nije tako
zanimljiv. Iz GPS-a sam iste rute spremio sa starom verzijom
isporucenog software-a, pa onda s novom - stari file sam sa svojim
programom konvertirao u novi i rezultat binary file compare-a je:

244092 bytes match
0 bytes diff
244092 bytes total
(ulazni file je imao 162780 bytes)

http://img96.imageshack.us/img96/2189/gsr03.png
--
Chupo

Chupo

unread,
Oct 29, 2012, 10:46:58 AM10/29/12
to
> siguran sam da ce ti se dopasti memcpy u polovicu
> struct-a u 82. liniji
>

Inace je zanimljivo da Intellisense ne radi upravo od te linije:

memcpy((char*)&tocka_new+32,(char*)&tocka_old+16,16);

pa sve do kraja funkcije. Ako tu liniju zakomentiram, onda Intellisense
opet radi unutar cijele te funkcije :-/
--
Chupo

mimix

unread,
Oct 31, 2012, 2:36:21 PM10/31/12
to
Ne bih ni ja radio nakon takve linije :))


--
Milan Mimica
http://sparklet.sf.net
0 new messages