Where is the best place to get help on converting Delphi 2007 strings to Delphi 2009? The most common problem getting Delphi 7-Delphi 2007 components to compile seems to be caused by the new Unicode strings in Delphi 2009. It would be great if there was some place to go to get help with this. Maybe there should be a new group for String conversion where developers could ask short questions about conversion. For example: Delphi 7 - Delphi 2007 CharArrayPtr = ^CharArray; CharArray = array[0..MaxInt-1] of Char; Compiles Delphi 2009 CharArrayPtr = ^CharArray; CharArray = array[0..MaxInt-1] of Char; [DCC Error] xxxTypes.Pas(85): E2100 Data type too large: exceeds 2 GB Conversion: Regards, Bill
![]() |
0 |
![]() |
Bill Miller wrote: > Where is the best place to get help on converting Delphi 2007 strings > to Delphi 2009? I've written an article here: http://dn.codegear.com/article/38693 that has a lot of information. You can ask all the questions you want in our forums here. > For example: > > Delphi 7 - Delphi 2007 > CharArrayPtr = ^CharArray; > CharArray = array[0..MaxInt-1] of Char; > Compiles > > Delphi 2009 > CharArrayPtr = ^CharArray; > CharArray = array[0..MaxInt-1] of Char; > [DCC Error] xxxTypes.Pas(85): E2100 Data type too large: exceeds 2 GB > Conversion: The problem here is that SizeOf(Char) is now 2 bytes, so you are trying to create an array bigger than the OS can handle. -- Nick Hodges Delphi Product Manager - Embarcadero http://blogs.codegear.com/nickhodges
![]() |
0 |
![]() |
> {quote:title=Bill Miller wrote:}{quote} > Conversion: type CharArrayPtr = ^CharArray; CharArray = array[0..MaxInt div 2-1] of Char; But if you actually use CharArray as a byte buffer then convert to ByteArrayPtr = ^ByteArray; ByteArray = array[0..MaxInt-1] of Byte;
![]() |
0 |
![]() |
Aleg Azarousky wrote: > CharArray = array[0..MaxInt div 2-1] of Char; Or better: CharArray = array[0 .. (MaxInt div SizeOf(Char)) - 1] of Char; -- Nick Hodges Delphi Product Manager - Embarcadero http://blogs.codegear.com/nickhodges
![]() |
0 |
![]() |
> Or better: > > CharArray = array[0 .. (MaxInt div SizeOf(Char)) - 1] of Char; Of course, it's backward compatible.
![]() |
0 |
![]() |
Nick, Maybe you need some more examples in another article: how to handle this: if assigned(namedblocks.p_OiFilNam) then freemem(namedblocks.p_OiFilNam); l := strlen(@ptr[pos]); getmem(namedblocks.p_OiFilNam, l + 1); move(ptr[pos], namedblocks.p_OiFilNam^, l + 1); Bill
![]() |
0 |
![]() |
Bill Miller wrote: > getmem(namedblocks.p_OiFilNam, l + 1); > move(ptr[pos], namedblocks.p_OiFilNam^, l + 1); l + 1 => (l + 1) * SizeOf(Char) That's backwards-compatible, too. See also: http://chrisbensen.blogspot.com/2007/11/unicode-sizeof-is-different-than-length.html -- Craig Stuntz ยท Vertex Systems Corp. ยท Columbus, OH Delphi/InterBase Weblog : http://blogs.teamb.com/craigstuntz/
![]() |
0 |
![]() |
Aleg Azarousky wrote: > Of course, it's backward compatible. And forwards compatible. ;-) -- Nick Hodges Delphi Product Manager - Embarcadero http://blogs.codegear.com/nickhodges
![]() |
0 |
![]() |
Additionally l := strlen(pChar(@ptr[pos])); Won't compile without the type cast.
![]() |
0 |
![]() |
Bill Miller wrote: > Delphi 2009 > CharArrayPtr = ^CharArray; > CharArray = array[0..MaxInt-1] of Char; > [DCC Error] xxxTypes.Pas(85): E2100 Data type too large: exceeds 2 GB The same as with any other pointer to a maximized out array, IOW: XYZArrayPtr = ^XYZArray; XYZArray = array[0.. Maxint div SizeOf(XYZ) - 1] of XYZ; So for Char, this becomes: CharArrayPtr = ^CharArray; CharArray = array[0..MaxInt div Sizeof(Char) - 1] of Char; -- Rudy Velthuis (TeamB) http://www.teamb.com "Life is pleasant. Death is peaceful. It's the transition that's troublesome." -- Isaac Asimov
![]() |
0 |
![]() |
Bill Miller wrote: > Nick, > > Maybe you need some more examples in another article: > > how to handle this: > > if assigned(namedblocks.p_OiFilNam) then > freemem(namedblocks.p_OiFilNam); > l := strlen(@ptr[pos]); > getmem(namedblocks.p_OiFilNam, l + 1); > move(ptr[pos], namedblocks.p_OiFilNam^, l + 1); l := (StrLen(@ptr[pos]) + 1) * SizeOf(Char); GetMem(namedblocks.p_OiFilNam, l); Move(ptr[pos], namesblocks.p_OiFilNam^, l); But it would be interesting to see what ptr[] is. -- Rudy Velthuis (TeamB) http://www.teamb.com "Obstacles are those frightful things you see when you take your eyes off your goal." -- Henry Ford (1863-1947)
![]() |
0 |
![]() |
> {quote:title=Rudy Velthuis (TeamB) wrote:}{quote} > > if assigned(namedblocks.p_OiFilNam) then > > freemem(namedblocks.p_OiFilNam); > > l := strlen(@ptr[pos]); > > getmem(namedblocks.p_OiFilNam, l + 1); > > move(ptr[pos], namedblocks.p_OiFilNam^, l + 1); > > > l := (StrLen(@ptr[pos]) + 1) * SizeOf(Char); > GetMem(namedblocks.p_OiFilNam, l); > Move(ptr[pos], namesblocks.p_OiFilNam^, l); I assume l is the length of the string in characters. So to be precise the Craig's suggestion is more reliable. > But it would be interesting to see what ptr[] is. Most likely ptr: pChar;
![]() |
0 |
![]() |
Aleg Azarousky wrote: > > {quote:title=Rudy Velthuis (TeamB) wrote:}{quote} > > > > if assigned(namedblocks.p_OiFilNam) then > > > freemem(namedblocks.p_OiFilNam); > > > l := strlen(@ptr[pos]); > > > getmem(namedblocks.p_OiFilNam, l + 1); > > > move(ptr[pos], namedblocks.p_OiFilNam^, l + 1); > > > > > > l := (StrLen(@ptr[pos]) + 1) * SizeOf(Char); > > GetMem(namedblocks.p_OiFilNam, l); > > Move(ptr[pos], namesblocks.p_OiFilNam^, l); > > I assume l is the length of the string in characters. So to be > precise the Craig's suggestion is more reliable. I don't quite care what l is supposed to be (in my example, it should be renamed to something like bufsize). In the code I saw l was the size of the buffer to allocate, minus one. Why calculate twice if you can do it once? -- Rudy Velthuis (TeamB) http://www.teamb.com "Talk sense to a fool and he calls you foolish." -- Euripides
![]() |
0 |
![]() |
{quote:title=Rudy Velthuis (TeamB) wrote:}{quote} > > I assume l is the length of the string in characters. So to be > > precise the Craig's suggestion is more reliable. > > I don't quite care what l is supposed to be (in my example, it should > be renamed to something like bufsize). In the code I saw l was the size > of the buffer to allocate, minus one. Why calculate twice if you can do > it once? This variable can be used below in the code, say for an iteration in a cycle as limit.
![]() |
0 |
![]() |
{quote:title=Rudy Velthuis (TeamB) wrote:}{quote} > Why calculate twice if you can do it once? If a rewrite is allowed then I would suggest to original poster to redesign this part entirely, and to use String type instead of PChar. Let the Delphi care about an allocating/freeing of memory!
![]() |
0 |
![]() |
Aleg Azarousky wrote: > {quote:title=Rudy Velthuis (TeamB) wrote:}{quote} > > > > I assume l is the length of the string in characters. So to be > > > precise the Craig's suggestion is more reliable. > > > > I don't quite care what l is supposed to be (in my example, it > > should be renamed to something like bufsize). In the code I saw l > > was the size of the buffer to allocate, minus one. Why calculate > > twice if you can do it once? > > This variable can be used below in the code, say for an iteration in > a cycle as limit. As long as I don't see any code using it, I'll asume it was only used here.-- Rudy Velthuis (TeamB) http://www.teamb.com "Computers make it easier to do a lot of things, but most of the things they make it easier to do don't need to be done." -- Andy Rooney.
![]() |
0 |
![]() |
Aleg Azarousky wrote: > {quote:title=Rudy Velthuis (TeamB) wrote:}{quote} > > > Why calculate twice if you can do it once? > > If a rewrite is allowed then I would suggest to original poster to > redesign this part entirely, and to use String type instead of PChar. > Let the Delphi care about an allocating/freeing of memory! That is always a good suggestion. -- Rudy Velthuis (TeamB) http://www.teamb.com "Incrementing C by 1 is not enough to make a good object-oriented language." -- M. Sakkinen
![]() |
0 |
![]() |