17. april 2004 - 15:05Der 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;
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?
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.
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-
> 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).
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.
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.