如何解决Erlang badarg的问题?

8xiog9wr  于 2023-10-14  发布在  Erlang
关注(0)|答案(2)|浏览(330)

我在Eclipse中运行了下面的代码。编译代码,并在Eclipse工作区的scr文件夹中创建.txt文件,并将数据的头传递给第一个io:format,但second io:format抛出错误参数,我不知道如何解决它。

  1. %% @author PC
  2. %% @doc @todo Add description to pingping.
  3. -module(pingping).
  4. -export([run/2, run/3]).
  5. -include("conf.hrl").
  6. run(DataSize, R) ->
  7. OutFileLocation = "out_cerl_pingping.txt",
  8. case file:open(OutFileLocation, [append]) of
  9. {error, Why} ->
  10. ?ERR_REPORT("L'archivio non esiste!", Why);
  11. {ok, OutFile} ->
  12. run(DataSize, R, OutFile)
  13. end.
  14. run(DataSize, R, OutFile) ->
  15. Data = generate_data(DataSize),
  16. Self = self(),
  17. SpawnStart = time_microseg(),
  18. P1 = spawn(fun() -> pingping(Data, Self, R) end),
  19. P2 = spawn(fun() -> pingping(Data, Self, R) end),
  20. SpawnEnd = time_microseg(),
  21. TimeStart = time_microseg(),
  22. P1 ! {init, self(), P2},
  23. P2 ! {init, self(), P1},
  24. finalize(P1),
  25. finalize(P2),
  26. TimeEnd = time_microseg(),
  27. TotalTime = TimeEnd - TimeStart,
  28. SpawnTime = SpawnEnd - SpawnStart,
  29. printResult(Data, R, TotalTime, SpawnTime, OutFile).
  30. pingping(_, Parent, 0) ->
  31. Parent ! {finish, self()};
  32. pingping(Data, Parent, R) ->
  33. receive
  34. {init, Parent, Peer} ->
  35. Peer ! {self(), Data},
  36. pingping(Data, Parent, R-1);
  37. {Peer, _} ->
  38. Peer ! {self(), Data},
  39. pingping(Data, Parent, R-1)
  40. end.
  41. finalize(Pid) ->
  42. receive
  43. {finish, Pid} -> ok
  44. end.
  45. printResult(Data, R, Time_exec, Time_spawn, OutFile) ->
  46. FormatH = "~-9s\t ~-13s\t ~-22s\t ~-11s\t ~-10s~n",
  47. Header = ["#bytes", "#repetitions", "exec_time[microsec]", "MBytes/sec", "spawn_time"],
  48. io:format(OutFile, FormatH, Header),
  49. MBps = bandwidth_calc(Data, Time_exec),
  50. FormatD = "~-9w\t ~-13w\t ~-22f\t ~-11f\t ~-3f~n",
  51. io:format(OutFile,FormatD, [size(Data), R, Time_exec, MBps, Time_spawn ]).
  52. bandwidth_calc(Data, Time) ->
  53. Megabytes = (size(Data) / math:pow(2, 20)),
  54. Seconds = (Time * 1.0e-6),
  55. Megabytes / Seconds.
  56. generate_data(Size) -> generate_data(Size, []).
  57. generate_data(0, Bytes) ->
  58. list_to_binary(Bytes);
  59. generate_data(Size, Bytes) ->
  60. generate_data(Size - 1, [1 | Bytes]).
  61. time_microseg() ->
  62. {MS, S, US} = now(),
  63. (MS * trunc(1.0e+12)) + (S * trunc(1.0e+6)) + US.
  64. %-define(OUT_FILE, "erl_out.txt").
  65. -define(ERR_REPORT(Msg, Reason), io:format("%%%%%%%%%%%%%% ERROR %%%%%%%%%%%%%%\n" ++
  66. "Msg: ~s\n" ++
  67. "Reason: ~s\n\n", [Msg, Reason])).
eagi6jfj

eagi6jfj1#

您的代码无法编译,因为conf.hrl包含文件没有显示,所以我猜它提供了底部提供的ERR_REPORT宏。您没有包含如何运行代码的说明,所以我猜测并调用了pingping:run(3, 3).,这导致了Erlang/OTP 26.1下的错误:

  1. ** exception error: bad argument
  2. in function io:format/3
  3. called as io:format(<0.95.0>,"~-9w\t ~-13w\t ~-22f\t ~-11f\t ~-3f~n",
  4. [3,3,23,0.12439230213994565,6])
  5. *** argument 3: element 3 must be of type float
  6. element 5 must be of type float

错误消息给了我们答案:你想把整数打印成浮点数。更改此行:

  1. FormatD = "~-9w\t ~-13w\t ~-22f\t ~-11f\t ~-3f~n",

为了纠正要素3和要素5的格式,

  1. FormatD = "~-9w\t ~-13w\t ~-22w\t ~-11f\t ~-3w~n",

导致pingping:run(3, 3)返回ok和包含以下内容的out_cerl_pingping.txt文件:

  1. #bytes #repetitions exec_time[microsec] MBytes/sec spawn_time
  2. 3 3 15 0.190735 5
展开查看全部
bz4sfanl

bz4sfanl2#

调试的一种方法是将所有格式说明符设置为~p,因为它将接受所有Erlang术语,因此至少不会再有badarg错误,同时我们可以看到打印的实际值。

  1. FormatD = "~p\t ~p\t ~p\t ~p\t ~p~n",

从那里你可以开始改变5个参数中的每一个,以找出哪些参数的数据类型不匹配。
最终答案已经由@steve提供

相关问题