以前、下記の質問でお世話になったS23です。
https://www.petitmonte.com/bbs/answers?question_id=8870
今度は、UDPで数値データを送ろうとしていますが、エラーで動きません。
absoluteの使い方が間違っているのでしょうか。
// ボタンを押したら文字列を送信する
procedure TForm1.Button1Click(Sender: TObject);
var
aryByte : array[0..127] of byte;
aryDuble : array[0..31] of double absolute aryByte;
aryStr : string absolute aryByte;
begin
aryByte[0]:=1; ←は下記※のメッセージが出ます。
aryByte[1]:=2;
aryDuble[5]:=111.111; ←エラーは出ませんが、aryStrに反映されません。
aryDuble[6]:=222.222;
IdUDPServer1.Send('127.0.0.1', 12345,aryStr);
end;
※ aryByte[0]:=1; のメッセージ
$775DDDC2 で初回の例外が発生しました。例外クラスは EAccessViolation メッセージは 'モジュール 'SIM.exe' のアドレス 0040A0D4 でアドレス 00000058 に対する読み取り違反がおきました。'。 プロセス SIM.exe (16352)
111.111 をバイト配列に格納すると,C976BE9F1AC75B40 という値になるわけです.
複数の実数値のそのようなバイトデータを結合して文字列にするというのが
いまいち理解できませんが.
(意味のある文字列にはならないような気がします)
> aryStr : string absolute aryByte;
が曲者のような気がします.
absolute を使用しない方向で考えてみてはどうでしょうか ?
absolute を使用しなければならない理由があれば別ですが.
数値データを送る方法が分からなかったので、文字列を再定義して送れるか試してみたところです。
受け取った方でも、同じ方法で数値データを取り出そうとしています。
もっと簡単に数値データを送る方法を教えていただけないでしょうか。
よろしくお願いします。
考え方はいろいろあると思います.
数値を文字列にして改行文字で区切って,あるいは指定桁数の文字列にして,文字列として送るとか.
以下は数値をバイトデータで送る例です.
バイトデータ (バイト配列) 関係の操作についてはネットで検索してください.
動作確認は Windows 7 U64(SP1) + Delphi 10.2.3 Community (VCL-32) + Indy 10.6.2
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
var
LStream : TMemoryStream;
LDoubleArr : array [0..1] of Double;
LDouble : Double;
begin
LStream := TMemoryStream.Create;
try
LStream.Write(AData[0], Length(AData));
LStream.Position := 0;
LStream.Read(LDoubleArr, SizeOf(LDoubleArr));
for LDouble in LDoubleArr do begin
Memo1.Lines.Add(LDouble.ToString);
end;
finally
FreeAndNil(LStream);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
LDoubleArr : array [0..1] of Double;
LStream : TMemoryStream;
LIdBytes : TIdBytes;
begin
LDoubleArr[0] := 111.111;
LDoubleArr[1] := 222.222;
LStream := TMemoryStream.Create;
try
LStream.Write(LDoubleArr, SizeOf(LDoubleArr));
SetLength(LIdBytes, SizeOf(LDoubleArr));
LStream.Position := 0;
LStream.Read(LIdBytes[0], SizeOf(LDoubleArr));
IdUDPServer1.SendBuffer('127.0.0.1', 12345, LIdBytes);
finally
FreeAndNil(LStream);
end;
end;
Mr.XRAYさん、ありがとうございました。
Streamを使うと非常に便利ですね。
おかげさまで無事に数値を送ることができました。
これからも、よろしくお願いします。