Results 1 to 11 of 11

Thread: D2009; shortstring to string

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    D2009; shortstring to string

    Ik ben bezig om mijn applicatie om te zetten naar D2009.
    Daarbij heb ik in een unit deze Type staan.

    Code:
    type
      TRecLijstSet = packed record
        printlijst : string;
        directory  : string;
        typesturing: string[2];
        verpsturing: string[2];
        bestemming : string[2];
        uitvoering : string;
        printer    : string;
        printernaam: string;
        lade_1     : string;
        lade_2     : string;
        gevonden   : boolean;
    end;
    Tijdens compilatie komt D2009 met deze melding:
    [DCC Warning] functies.pas(265): W1057 Implicit string cast from 'ShortString' to 'string'
    Ik weet dat het alleen een warning is en geen error, maar mag je dan in D2009 geen string[] gebruiken?
    Delphi is great. Lazarus is more powerfull

  2. #2
    3 weken terug had Vos hetzelfde probleem
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Bij Jelmer werd er gesproken over een string[64], die getypecasted werd met string().
    Kan dat ook met een een type declaratie?
    Code:
    type
      string2 : string(string[2]);
    
      TRecLijstSet = packed record
        printlijst : string;
        directory  : string;
        typesturing: string2;
        verpsturing: string2;
        bestemming : string2;
        uitvoering : string;
        printer    : string;
        printernaam: string;
        lade_1     : string;
        lade_2     : string;
        gevonden   : boolean;
    end;
    Delphi is great. Lazarus is more powerfull

  4. #4
    Neen, je zal op alle plaatsen die shortstring moeten casten
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik ben even niet blij met de unicode conversie.
    Ik gebruik in mijn applicatie 2 type records. Beide heb ik de string[] om moeten zetten naar string. Het probleem is n.l. dat de type records tijdeliijk gevuld worden en zijn waarde teruggeven aan een fieldbyname().AsString of aan een item in een box. Beide zijn in D2009 omgezet naar een unicode-string.
    Wat werkt is dit:
    Code:
    type
      TRecLijstSet = packed record
        typesturing: string[2];
        verpsturing: string[2];
    end;
    
    FieldByName().AsString := string(RecLijstset[0].typesturing);
    Maar moet ik dan terug deze optie?
    Code:
    RecLijstset[0].typesturing := Ansistring(FieldByName().AsString);
    Een beetje omslachtig allemaal.
    Nu komt de vraag natuurlijk:" Waarom ben je zo zuinig met aanroepen van geheugen door een string een vaste lengte te geven?". Misschien ben ik ouderwets, maar ik vind dat je niet meer moet gebruiken, dan dat je nodig hebt. Ondanks dat de meeste pc's toch wel minimaal 512 MB ram geheugen hebben.
    Delphi is great. Lazarus is more powerfull

  6. #6
    Nou, zo heel veel meer gebruik je sowieso niet. Een string is tenslotte normaal gesproken maar zo lang als zijn inhoud + enkele bytes voor een header.
    1+1=b

  7. #7
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    De ansistring is ook een aparte allocatie, de shortstring niet (tenzij je pshortstring gebruikt);

    voor een ansistring, het aantal tekens in de string +

    (oude D6/D7 memmanager) 8 bytes heap + 8 bytes header (len+ref) + dubbel nul terminator (MBCS compliant) + afronden allocatie omhoog naar 4 bytes. (8 bytes voor FastMM) = 20 + 0..3 (0..7 voor fastmm)

    Shortstring + 1 byte lengte, alignment alleen als de record of class een speciaal alignment heeft.

    Denk er wel aan dat shortstring altijd zijn lengte gebruikt. Met name als je veel lege strings hebt, kan ansistring nog steeds overall zuiniger zijn.

    Zelf gebruik ik geen shortstrings op dit moment (of in recente banen). Het kan nuttig zijn
    als je erg grootte OPFs hebt (miljoenen objecten), of voor extreem snelle verwerking (de FPC compiler gebruikt shortstrings voor zijn symbols, die toch niet al te lang mogen zijn), maar dat zijn allebei voorbeelden van extreem bewerkelijke code.

    Voor gewone businesscodeis het gevaar van introduceren van lengte beperkingen me te groot.

  8. #8
    Quote Originally Posted by jkuiper View Post
    Nu komt de vraag natuurlijk:" Waarom ben je zo zuinig met aanroepen van geheugen door een string een vaste lengte te geven?". Misschien ben ik ouderwets, maar ik vind dat je niet meer moet gebruiken, dan dat je nodig hebt. Ondanks dat de meeste pc's toch wel minimaal 512 MB ram geheugen hebben.
    Volgens mij wordt er voor iedere string[x] altijd 256 bytes gereserveerd
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  9. #9
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dan zal het in delphi anders zijn dan in C
    Delphi is great. Lazarus is more powerfull

  10. #10
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    In delphi is het helemaal anders dan C. Een tijdje terug had ik uiterst vreemde dingen in een multi-thread DLL, en na lang (lang!) zoeken, bleek het (hou je vast) de interne memory locking van de strings te zijn! Die kan je aan of uit schakelen met IsMultiThread:boolean (in unit System), normaal gaat dat volautomatisch, alleen in een multi-thread DLL voor een ISAPI extension natuurlijk niet...

  11. #11
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Wat ik bedoel is het volgende:
    in C heb je dit type record
    Code:
      struct TReclijst {
         lijst char[20];
         int nummer;
    }
    zal dan in delphi zijn
    Code:
    type  TReclijst = packed record
         lijst string[20];
         nummer integer;
    Beide zouden net zoveel geheugen alloceren. Dus als Henkie zegt dat er altijd 256 bytes worden reseserveerd bij een string[20], vind ik een beetje raar.

    Maar goed. C is voor mij toch alweer 15 jaar geleden.
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •