Основной вопрос от новичка.Проблема с определениями в букле.кленовый - PullRequest
0 голосов
/ 22 ноября 2018

Давайте предположим, что мы в этом случае (я использую Maple)

add:=function()
e1:=0;
e2:=1;
for j in [1..2]do
ej:=ej+1
od;
return e1,e2;
end;

Эта программа выдает ошибку глобальной переменной.Я понимаю, почему это происходит - потому что ej не определен как локальный - но если вы определите это, то программа просто ничего не делает.) Я не знаю, как это решить. Моя цель (в более крупной программе) состоит в том, чтобы вызвать e1,e2 в цикле for.

Возможно, я не выразил себя правильно, упрощая мою проблему, есть моя Программа, это сделано с помощью программы GAP , но работает аналогично 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;

Программа не отправляет мне ошибку, но я знаю, что она не работает из-за ej, bi ие.Я хочу сделать то, что он говорит после последнего «другого», но я не знаю, как решить это, чтобы заставить его работать.

1 Ответ

0 голосов
/ 23 ноября 2018

Ваш синтаксис неверен.Это proc , а не function .

И add - это уже команда Maple, поэтому это защищенное имя, которому нельзя присвоить.Вы должны использовать другое имя.

И ваш синтаксис для цикла do, вероятно, не тот, который вы хотите.Вы, вероятно, хотите для j от 1 до 2 сделать .

И вам действительно следует инициализировать ej значением перед выполнением рекурсивного присваивания ej: = ej+ 1 .

И вы можете также объявить локальные переменные процедуры.

Лично я предпочитаю использовать end do вместо od и end proc вместо просто end в современном 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

Существует Руководство по программированию Maple , которое вы можете прочитать онлайн или внутри собственного Maple.Справочная система.Он имеет хорошее введение в процедуры написания .И есть более подробная страница справки для команды proc .

...