Please ignore this.  It is an FPC mailing list error, repeated from August


----- Original Message ----- From: "Urbansound" <[EMAIL PROTECTED]>
To: <fpc-pascal@lists.freepascal.org>
Cc: "Matt Emson" <[EMAIL PROTECTED]>
Sent: Tuesday, August 02, 2005 1:41 PM
Subject: Re: [fpc-pascal] Extended float to single and pchar types


Thanks Matt.

See replies within the body please.

----- Original Message ----- From: "Matt Emson" <[EMAIL PROTECTED]> To: "Urbansound" <[EMAIL PROTECTED]>; "FPC-Pascal users discussions"
<fpc-pascal@lists.freepascal.org>
Sent: Tuesday, August 02, 2005 11:26 AM
Subject: Re: [fpc-pascal] Extended float to single and pchar types


Hi,

I have a stdcall reference to a c based dll. called target.dll
In c the setup is ...

Are you sure it is stdcall? Quite often it's the calling convention that
messes up the calling of a C DLL. Could it be safecall or cdecl? Which
compiler made the DLL?

Tried all three and results are the same always, (which I find odd,
considering mangling)


float Get_l1_BidPriceSingle(void* p);

The Pascal reference is...

function Get_l1_BidPrice(p : pointer) : single;
stdcall; external 'target.dll' name 'Get_l1_BidPrice';

Which all looks okay.

The end result is to allow a usage in win32 as ...
SendMessage(listbox, LB_ADDSTRING, 0, longint(Pchar(s)));

Hmmm.. this is not a good idea if 's' is of type string. If 's' is a
string
(AnsiString or whatever) you should probably call SetLength on it, and I'd also advise passing a pointer to the first char too, rather relying on the
cast.

E.g.

 s := 'Test data';
 SetLength(s, Length(s));
 SendMessage(listbox, LB_ADDSTRING, 0, longint(@(s[1])));

Working only by virtue of the non error checking method using
Str(bid_price:5:3,s);
See example at bottom.

That probably has more chance of working, but still assumes you are not
crossing process boundaries. If threads are involved, it's not going to
work.

Single thread, confirmed

The c reference is  a 'Single' float, but each time I make refernece to
data
conversion, errors tell me that the reference to the call is returning a
10
bit "Extended" float which fails, appearing to be a default autotype
conversions to an extended 10 byte float, in fpc.

If it is a "reference", it should probably be a pointer. Is the C function
really returning the resultant by value, or by reference?

Converted data as an "Ansistring" seems to fail any type of conversion,
as
a
runtime 207 crash.

Convert how? FloatToStr should handle any floating point type.

Apparently that is a problem when the float is in a callback.


e.g.

var
 f: single;
 d: double;
 e: extended;
begin
 f := 10.01;
 d := 10.01;
 e := 10.01;

 messagebox(0, PChar(FloatToStr( .. ), 0); // replace '..' with f, d or e
end;

Crashes when incorporated into the callback.

If I store Str conversions to a "shortstring", I can format the fp and
convert it to a fixed decimal rounded output, xxx.yyy, but using length()
direct or pointer access, still pulls the 0 byte and extra characters of
the
string into any other converted output, requiring array managment and
parsing.

var
  s: string;
  f: single;
begin
 f := 123.45678; //this will round
 s := format('%3.3f', [f]); //think sprintf
end;

Crashes same when f holds the value returned in the callback.

Is there a way to take an "extended" FP and covert it ultimately to a
Pchar
that would allow messaging to win32 list boxes or similar to a litteral
equivelent behaviour, without having to run through all the symantics of
array management?

OR

Can one circumvent the auto-typing to extended, so that single or double
would behave to conversion methods like FloatToStr() that I could then
type
over to pchar and serve the same purpose?

Surely you could just use an extended and then cast it? So long as it is
possible to store the value in the variable you wish to, it'll work.

Clearly I'm not yet comfortable with string manipulation in Pascal, so an
example would go a long way toward getting me to where I can do the work
myself.

Well, it's an awful lot simpler that C until you have to interact with C
API
calls!!

M

Any ansistring causes a hard crash.

Below will run without crashing, but again the string length is even cast at
9, the max expected and equal white space being seed to the string first.
You can see the image "output.jpg" attached, showing the residual string
data, right of the values. These are stock market symbols and their related
prices being quoted, which are the content coming back from the live API.

Type shortstring = string[9];
var
   bid_price : extended; //or double, or single = same result
   s : shortstring;

begin
    SendMessage(listbox, LB_ADDSTRING, 0,
       longint(Get_secsym(quote)));
   // quote data may range nn.nnn to nnnnn.nnn
    bid_price := Get_l1_BidPrice(quote);
    //s:=FloatToStr(bid_price);           //crashes 207
    s:='         ';                                    // 9 bytes white
space
    Str(bid_price:5:3,s);                      //convert+ 5 places, 3
decimal  = 6
    SetLength(s, Length(s));
    SendMessage(listbox, LB_ADDSTRING, 0, longint(@(s[1])));
end;



--------------------------------------------------------------------------------


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to