Avatar billede rrm Nybegynder
17. april 2004 - 15:05 Der er 7 kommentarer og
1 løsning

Få størrelse af en record med dynamiske strenge med sizeof

Davs...

Jeg er ved at konstruere et klasse, der kan klare at komprimere data. I den forbindelse er jeg stødt på et lille problem. For at kunne komprimere data'en er jeg nødt til at kende den størrelse, dette har jeg før klaret med sizeof, men hvis jeg ønsker at komprimere struturer med strenge uden fast størrelse giver det problemer, idet sizeof opgiver forkert størrelse.
Hvilken måder kan man løse dette problem på??? Jeg har prøvet med at definere variablerne som string[længde], men så har jeg kun 256 pladser til rådighed.

Struturen ser sådan ud:
headerInfo = packed record
    versionNeeded: string;
    creationDate: string;
    files: word;
end;

På forhånd tak
rrm
Avatar billede doc404 Novice
19. april 2004 - 00:46 #1
Du kan ikke gøre det på den måde. En String er reelt en pointer til et andet område og derfor giver SizeOf ingen mening.

Du er nød til at lave en buffer, hvor du så først putter files i, derefter de to strenge og så komprimerer du hele bufferen med den størrelse den nu får.

Og et lille spm.. Når jeg ser et navn som CreationDate tænker jeg på en TDateTime og VersionNeeded - hvad indeholder den?
Avatar billede rrm Nybegynder
19. april 2004 - 01:36 #2
Jeg havde løst problemet med at have to records:

headerInfo = packed record
    versionNeeded: string;
    creationDate: string;
    files: word;
end;

headerInfoC = packed record
  versionNeeded: array[0..MAX_VERSION] of char;
  creationDate: array[0..MAX_DATE] of char;
  files: Integer;
end;

Og så kopier indholder af headerInfo til headerInfoC og så kompimere det. Jeg havde lidt håbet på at der måske fandes en bedre metode til at gøre det, hvor der var mulighed for at have dynamiske strenge...

> Og et lille spm.. Når jeg ser et navn som CreationDate tænker jeg på en TDateTime og VersionNeeded - hvad indeholder den?

CreationDate indeholder datoen for oprettelse af filen (hentet med now()) og VersionNeeded er den version af zlib der skal til at "udpakke" dataene.
Avatar billede doc404 Novice
19. april 2004 - 02:20 #3
hmmm...

Jamen så må du da kunne lave din HeaderInfo som:

TVersionLib = packed record
  MajorVersion : integer;
  MinorVersion : integer;
end;

HeaderInfo = packed record
  CreationDate : TDateTime;
  files : word;
  VersionNeeded : TVersionLib;
  end;

end;

Skal lige siges, at jeg ingen ide har om hvordan du bestemmer versionen af VersionNeeded...

Hvis du bruger en array[0..Max_Version] stil, så ryger du altid ind i enten, at din Max_Version på et eller andet tidspunkt biver for lille eller at du spilder en masse palds-
Avatar billede rrm Nybegynder
19. april 2004 - 12:55 #4
> Hvis du bruger en array[0..Max_Version] stil, så ryger du altid ind i enten, at din Max_Version på et eller andet tidspunkt biver for lille eller at du spilder en masse palds-

Ja, det er det jeg prøver at undgå hvis det er muligt...

Ved du om man kan lave en form for rekursiv funktion der kan finde størrelsen af en vilkårlig struktur???

> Skal lige siges, at jeg ingen ide har om hvordan du bestemmer versionen af VersionNeeded...

Jeg bruger en streng til dette idet den unit med komprimering delen har den version som en streng konstant (bruger ZLibEx).
Avatar billede ziggs Nybegynder
19. april 2004 - 14:52 #5
Prøv High
Avatar billede rrm Nybegynder
21. april 2004 - 17:31 #6
High kan ikke få størrelsen af en struktur. Jeg prøvede med high(test) hvor test var en struktur og den gav forkert type...
Avatar billede rrm Nybegynder
28. april 2004 - 18:53 #7
doc404 forslag kunne jeg godt bruge og til strukturer valgte jeg at havde 2 structure en til strenge og en hvor det var array of char i stedet og så komprimere den.

doc404 ligger du lige et svar???
Avatar billede doc404 Novice
28. april 2004 - 22:56 #8
merci
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester