UDPで数値データを送りたいのですが

解決


S23  2018-09-07 18:01:22  No: 49496

以前、下記の質問でお世話になった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)


Mr.XRAY  2018-09-08 00:17:09  No: 49497

111.111 をバイト配列に格納すると,C976BE9F1AC75B40 という値になるわけです.
複数の実数値のそのようなバイトデータを結合して文字列にするというのが
いまいち理解できませんが.
(意味のある文字列にはならないような気がします)

> aryStr   : string absolute aryByte; 

が曲者のような気がします.
absolute を使用しない方向で考えてみてはどうでしょうか ?
absolute を使用しなければならない理由があれば別ですが.


S23  2018-09-08 00:31:50  No: 49498

数値データを送る方法が分からなかったので、文字列を再定義して送れるか試してみたところです。
受け取った方でも、同じ方法で数値データを取り出そうとしています。

もっと簡単に数値データを送る方法を教えていただけないでしょうか。
よろしくお願いします。


Mr.XRAY  2018-09-08 02:02:08  No: 49499

考え方はいろいろあると思います.
数値を文字列にして改行文字で区切って,あるいは指定桁数の文字列にして,文字列として送るとか.
以下は数値をバイトデータで送る例です.
バイトデータ (バイト配列) 関係の操作についてはネットで検索してください.

動作確認は 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;


S23  2018-09-08 02:47:04  No: 49500

Mr.XRAYさん、ありがとうございました。

Streamを使うと非常に便利ですね。
おかげさまで無事に数値を送ることができました。

これからも、よろしくお願いします。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加