0

我想将此 C++ 代码转换为 ocaml,但出现语法错误

C++ 代码

int** matrix(int n,int **a,int**b)
{
t=n/2;
a11=new int*[t];
for(i=0;i<t;i++)
    a11[i]=new int [t];
for(i=0;i<t;i++)
    for(j=0;j<t;j++)
        a11[i][j]=a[i][j];

a12=new int*[t];
for(i=0;i<t;i++)
    a12[i]=new int [t];
for(i=0;i<t;i++)
    for(j=0;j<t;j++)
        a12[i][j]=a[i][j+t];

a21=new int*[t];
for(i=0;i<t;i++)
    a21[i]=new int [t];
for(i=0;i<t;i++)
    for(j=0;j<t;j++)
        a21[i][j]=a[i+t][j];
}

Ocaml代码

let matrix n x y =
let t = n/2 in
        let a11 = Array.make_matrix t t 0 in
        for i = 0 to t-1 do
            for j = 0 to t-1 do
            a11.(i).(j) <- x.(i).(j)
            done
        done            
        and
        a12 = Array.make_matrix t t 0 in
        for i = 0 to t-1 do
            for j = 0 to t-1 do
            a12.(i).(j) <- x.(i).(j+t)
            done
        done        
        and
        a21 = Array.make_matrix t t 0 in
        for i = 0 to t-1 do
            for j = 0 to t-1 do
            a21.(i).(j) <- x.(i+t).(j)
            done
        done
;;

问题是 t 的值没有在 a12 和 a21 数组中传递,并且它变得无界。

4

2 回答 2

2

andfor alet不能出现在 let 的主体中。相反,使用多个让:

let matrix n x y =
  let t = n/2 in
  let a11 = Array.make_matrix t t 0 in
  for i = 0 to t-1 do
    for j = 0 to t-1 do
      a11.(i).(j) <- x.(i).(j)
    done
  done;
  let a12 = Array.make_matrix t t 0 in
  for i = 0 to t-1 do
    for j = 0 to t-1 do
      a12.(i).(j) <- x.(i).(j+t)
    done
  done;
  let a21 = Array.make_matrix t t 0 in
  for i = 0 to t-1 do
    for j = 0 to t-1 do
      a21.(i).(j) <- x.(i+t).(j)
    done
  done
于 2015-04-25T15:35:19.747 回答
0

只是为了澄清,以下与您的原始代码有相同的问题:

# let x = 4 in () and y = 7 in ();;                
Error: Syntax error

由于let定义了一个表达式,这相当于写作() and (),这确实是不合法的 OCaml。

正确使用let ... and看起来是这样的:

# let x = 4 and y = 7 in ();;
Warning 26: unused variable x.
Warning 26: unused variable y.
- : unit = ()

有几个let ... and let ...,但只有一个 in

于 2015-04-25T16:38:48.967 回答