Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing Erlang位语法模式匹配在shell中工作,但不是作为传递参数_Parsing_Syntax_Erlang_Udp_Bit - Fatal编程技术网

Parsing Erlang位语法模式匹配在shell中工作,但不是作为传递参数

Parsing Erlang位语法模式匹配在shell中工作,但不是作为传递参数,parsing,syntax,erlang,udp,bit,Parsing,Syntax,Erlang,Udp,Bit,我正在尝试制作一个简单的UDP数据包解码器 packet_decoder(Packet)-> <<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet, io:format("Options:~p~n",Opts), io:format("MobIdLength:~p~n",MobIdLength), io:format("MobId:~p~n",Mo

我正在尝试制作一个简单的UDP数据包解码器

packet_decoder(Packet)->
<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet,
io:format("Options:~p~n",Opts),
io:format("MobIdLength:~p~n",MobIdLength),
io:format("MobId:~p~n",MobId),
io:format("MobIdType:~p~n",MobIdType),
io:format("MgeType:~p~n",MgeType),
io:format("SeqNum:~p~n",SeqNum).
我不断得到(以下错误编辑于美国东部时间9/7/12 9:30):

**异常错误:右侧值不匹配
功能内udp_服务器:数据包_解码器/1
称为udp_服务器:数据包_解码器()
来自udp_服务器的in调用:rcv_循环/1
来自udp_服务器的in调用:init/0
如果我在Erlangshell中创建与二进制相同的变量,即

Packet = <<131,8,53,134,150,4,149,0,80,15,1,2,1,2,0,16,80,71,115,52,80,71,115,53,24,63,227,197,211,228,89,72,0,0,0,0,0,0,0,16,0,5,5,32,1,4,255,159,15,18,28,0,34,62,2,0,0,0,0,0,0,0,47,67>>.

<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet.
Packet=。
=数据包。
它很好用。将其传递给我缺少的函数是否有一些微妙之处?我已经尝试了我认为是一切(除了正确的方式)。我试着设置类型和尺寸。我也试过了

<<Rest/binary>> = Packet.  
=数据包。

无济于事。非常感谢您的帮助

编辑:我的答案的第一部分完全错了,所以为了不误导,我删除了它。

与Alexey Kachayev类似,io:format将列表作为第二个参数,因此:

packet_decoder(Packet)->
<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet,
io:format("Options:~p~n",[Opts]),
io:format("MobIdLength:~p~n",[MobIdLength]),
io:format("MobId:~p~n",[MobId]),
io:format("MobIdType:~p~n",[MobIdType]),
io:format("MgeType:~p~n",[MgeType]),
io:format("SeqNum:~p~n",[SeqNum]).
packet\u解码器(packet)->
=数据包,
io:格式(“选项:~p~n,[Opts]),
io:格式(“MobIdLength:~p~n”,[MobIdLength]),
io:格式(“MobId:~p~n,[MobId]),
io:格式(“MobIdType:~p~n”,[MobIdType]),
io:格式(“MgeType:~p~n”,[MgeType]),
io:格式(“SeqNum:~p~n,[SeqNum])。

运行代码时出现的错误与代码不匹配。您得到的错误是:

** exception error: no match of right hand side value ...
是一个
badmatch
错误,来自模式与RHS值不匹配的显式
=
匹配。
rcv\u循环/1
的代码中没有
=
。这意味着您正在运行的循环不是此代码。因此,有一些问题需要问:

  • 当您重新编译包含
    rcv\u loop/1
    的模块时,是否重新启动了循环以便运行新代码?这不是自动完成的
  • 您确定正在加载/运行您认为正确的代码吗?我知道这个问题听起来很愚蠢,但在一个版本的代码上工作并加载另一个版本的代码是非常容易的,这并不少见。你需要找到正确的路径

代码中提到的其他内容不会导致此错误。对
io:format/2
的调用是错误的,但在实际调用
io:format/2
时会导致错误。使用变量
Socket
并不是一个错误,它只是表示您只想从该套接字接收UDP数据包

我算出来了(有点)。我一直在eclipse的erlide中进行这方面的工作,它对整个系统的其他部分都很好。我试着从erl shell编译它,结果很好。eclipse表示源代码的方式或调用erlang编译器和shell的方式肯定有一些细微的区别。我将与erlide.org进行讨论。谢谢你的帮助

虽然我不确定,但我猜这个错误意味着你不能第二次给变量赋值。这是你代码的实际变体吗?我问,因为这个变量永远不会工作(
io:format
只接受
list
作为第二个参数)。我知道这不会帮助您解决主要问题,但放置真正的代码会提供更多信息。啊,您是对的,Alexey。它编译得很好,但代码从未到达那里。我改变了它,所以当它真的(希望)打印一些东西时。奇怪的是,编译器没有抛出错误甚至警告。halfelf,所有变量都未绑定。我试图更改它们,以防使用一些保留字。与此讨论完全无关的是,将
活动设置为
一次
意味着只有第一个数据包将作为消息接收。您必须在每条消息后将
active
重置为
一次
,或者对后续数据包使用
gen_udp:recv
。如果是
rcv_循环(套接字)->。。。接收{udp,套接字,主机,端口,Bin}->…
将进行模式匹配:只接收来自函数头中定义的
Socket
的消息。所以这没关系。错误被抛出到第一块代码(packet_解码器)的第二行。rcv_循环将Bin传递给数据包_解码器,在那里尝试进行位语法模式匹配。在分组解码器中,变量为分组。我在其中添加了一些io:format/1来测试这是正在运行的代码。我厌倦了在vim中这样做,所以我切换到erlide+eclipse。我担心我没有运行我认为太多的代码。我还修复了io:format/2,将列表作为第二个属性传递。代码从未出现。@tktak啊,好吧,这不是您显示的错误消息所指示的。您是对的。抱歉,我在做测试时贴了这个。我试图将代码放入rcv_循环中,看看它是否与我传递代码的方式有关。我将发布上面的相关错误。很抱歉造成误解。@tktak我的建议是在尝试匹配包之前,先在
Packet\u解码器/1
中打印出
Packet
。否则一切看起来都很好。
packet_decoder(Packet)->
<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet,
io:format("Options:~p~n",[Opts]),
io:format("MobIdLength:~p~n",[MobIdLength]),
io:format("MobId:~p~n",[MobId]),
io:format("MobIdType:~p~n",[MobIdType]),
io:format("MgeType:~p~n",[MgeType]),
io:format("SeqNum:~p~n",[SeqNum]).
** exception error: no match of right hand side value ...