For loop 初学者的基本问题。口腔中的定义有问题。枫树

For loop 初学者的基本问题。口腔中的定义有问题。枫树,for-loop,maple,For Loop,Maple,假设我们在这种情况下(我使用的是Maple) 这个程序给了我一个全局变量错误。我理解为什么会发生这种情况——因为ej没有被定义为本地的——但是如果您定义它,那么程序就什么也不做。)我不知道怎么解决它我的目标(在更大的程序中)是在for循环中调用e1,e2。 也许我没有正确地表达自己,简化了我的问题,这是我的程序,它是用程序间隙制作的,但它的工作原理与Maple类似: G12Decode:=function(c) localx,G,C,sG,sH,a,u,b1,e1,b2,e2,b3,e3,b4,

假设我们在这种情况下(我使用的是Maple)

这个程序给了我一个全局变量错误。我理解为什么会发生这种情况——因为
ej
没有被定义为本地的——但是如果您定义它,那么程序就什么也不做。)我不知道怎么解决它我的目标(在更大的程序中)是在
for
循环中调用
e1,e2

也许我没有正确地表达自己,简化了我的问题,这是我的程序,它是用程序间隙制作的,但它的工作原理与Maple类似:

G12Decode:=function(c)
localx,G,C,sG,sH,a,u,b1,e1,b2,e2,b3,e3,b4,e4,b5,e5,b6,e6,h1,h2,i,j; 
x:=Codeword(c,GF(3));
G:=[[1,0,0,0,0,0,0,1,1,1,1,1],[0,1,0,0,0,0,1,0,1,2,2,1], 
[0,0,1,0,0,0,1,1,0,1,2,2],[0,0,0,1,0,0,1,2,1,0,1,2], 
[0,0,0,0,1,0,1,2,2,1,0,1],[0,0,0,0,0,1,1,1,2,2,1,0]];
C:=GeneratorMatCode(G,GF(3));
sG:=x*TransposedMat(GeneratorMat(C));
sH:=x*TransposedMat(CheckMat(C));
a:=[0,0,0,0,0,0];
b1:=Codeword([0,1,1,1,1,1],GF(3)); 
e1:=Codeword([1,0,0,0,0,0],GF(3));
b2:=Codeword([1,0,1,2,2,1],GF(3)); 
e2:=Codeword([0,1,0,0,0,0],GF(3));
b3:=Codeword([1,1,0,1,2,2],GF(3)); 
e3:=Codeword([0,0,1,0,0,0],GF(3));
b4:=Codeword([1,2,1,0,1,2],GF(3)); 
e4:=Codeword([0,0,0,1,0,0],GF(3));
b5:=Codeword([1,2,2,1,0,1],GF(3)); 
e5:=Codeword([0,0,0,0,1,0],GF(3));
b6:=Codeword([1,1,2,2,1,0],GF(3)); 
e6:=Codeword([0,0,0,0,0,1],GF(3));

if Weight(sH)<=2 then
sH:=ShallowCopy(VectorCodeword(sH));
Append(a,sH);
a:=Codeword(a,GF(3));
u:=x-a;
return u;
elif Weight(sG)<=2 then
sG:=ShallowCopy(VectorCodeword(sG));
Append(sG,a);
sG:=Codeword(sG,GF(3));
u:=x-sG;
return u;
else
for i in [1..6] do
for j in [1..6] do
if sG-bi=ej or sG-bi=2*ej then 
h1:=sG-bi;
h2:=ei;
h1:=ShallowCopy(VectorCodeword(h1));
h2:=ShallowCopy(VectorCodeword(h2));
Append(h1,h2);
h1:=Codeword(h1,GF(3));
u:=x-h1;
return u;
elif sG-2*bi=ej or sG-2*bi=2*ej then
h1:=sG-2*bi;
h2:=ei;
h1:=ShallowCopy(VectorCodeword(h1));
h2:=ShallowCopy(VectorCodeword(h2));
Append(h1,h2);
h1:=Codeword(h1,GF(3));
u:=x-h1;
return u;
fi;
od;
od;
fi;
end;
G12Decode:=函数(c)
localx、G、C、sG、sH、a、u、b1、e1、b2、e2、b3、e3、b4、e4、b5、e5、b6、e6、h1、h2、i、j;
x:=码字(c,GF(3));
G:=[[1,0,0,0,0,0,0,1,1,1,1,1],[0,1,0,0,0,0,1,0,1,2,1],
[0,0,1,0,0,0,1,1,0,1,2,2],[0,0,0,1,0,0,1,2,1,0,1,2], 
[0,0,0,0,1,0,1,2,2,1,0,1],[0,0,0,0,0,1,1,1,2,2,1,0]];
C:=生成器代码(G,GF(3));
sG:=x*TransposedMat(GeneratorMat(C));
sH:=x*TransposedMat(CheckMat(C));
a:=[0,0,0,0,0,0];
b1:=码字([0,1,1,1,1],GF(3));
e1:=码字([1,0,0,0,0],GF(3));
b2:=码字([1,0,1,2,2,1],GF(3));
e2:=码字([0,1,0,0,0,0],GF(3));
b3:=码字([1,1,0,1,2,2],GF(3));
e3:=码字([0,0,1,0,0,0],GF(3));
b4:=码字([1,2,1,0,1,2],GF(3));
e4:=码字([0,0,0,1,0,0],GF(3));
b5:=码字([1,2,2,1,0,1],GF(3));
e5:=码字([0,0,0,0,1,0],GF(3));
b6:=码字([1,1,2,2,1,0],GF(3));
e6:=码字([0,0,0,0,1],GF(3));

如果权重(sH)您的语法无效。它是过程,而不是功能

add已经是一个Maple命令,因此它是一个受保护的名称,无法分配给。你必须用另一个名字

而且do循环的语法可能不是您想要的。您可能希望j从1到2执行

在执行递归赋值之前,您确实应该使用一个值初始化ej

您还可以声明过程的局部变量

就个人而言,我喜欢在现代枫树中使用end do而不是od,以及end proc而不是end。这样可以更容易地说出要终止的内容

比如说,

restart;

my_add:=proc()
  local e1,e2,ej,j;
  e1:=0;
  e2:=1;
  ej:=0;
  for j from 1 to 5 do
    ej:=ej+1
  end do;
  return ej,e1,e2;
end proc:

my_add();

                 5, 0, 1

有一个,你可以在线阅读或在枫树自己的帮助系统中阅读。它有一个漂亮的花园。还有一个更详细的命令帮助页面。

我在问题中添加了一些内容。很抱歉之前没有解释清楚。谢谢你浪费我的时间给这个
maple
贴标签,而事实上这都是关于GAP程序的。不,它们不一样。在语言语法上有一些相似之处,但是没有一个使用Maple的人能够只运行这个。无论如何,在GAP中,如果
i=3
j=4
作为循环索引的值,您真的可以引用
bi
ej
并神奇地获得
b3
e4
的值吗?!?听起来很可疑。也许GAP允许您连接名称。或者您可以将
b
e
声明为数组(类似于上面的
a
),然后在
b[i]
e[j]
等中存储/引用。宏碁对此表示抱歉。但是你关于Maple的回答也是必要的,因为我也在研究它。不管怎样,我试过了你说的话,效果很好,谢谢你。对此再次表示歉意。
restart;

my_add:=proc()
  local e1,e2,ej,j;
  e1:=0;
  e2:=1;
  ej:=0;
  for j from 1 to 5 do
    ej:=ej+1
  end do;
  return ej,e1,e2;
end proc:

my_add();

                 5, 0, 1