type
  TX = array[0..2,0..7] of Boolean;
Var
DX:array[0..4] of SmallInt;
i,k:integer;
X:TX;
begin
fx.ActPortNumber:=1;
fx.Open;
FX.ReadDeviceBlock2('X0',3,DX[0]);
for i:=0 to 2 do
  for k:= 0 to 15 do
  begin
   if DX[i] and Round(Power(2,K))=0  then
   X[i, k Mod 8]:= False
   else
   X[i, k Mod 8]:= True;
  end;
D[i]怎么从 3开始循环的

解决方案 »

  1.   

    for i:=0 to 2 do
      for k:= 0 to 15 do
      begin
       if DX[i] and Round(Power(2,K))=0  then
       X[i, k Mod 8]:= False
       else
       X[i, k Mod 8]:= True;
      end;就是说,I:integer, 按理来说第一次循环的时候应该是 DX[i]=DX[0],然后DX[1],DX[2]这样的顺序循环执行下去,但是调试的时候,居然发现,第一次循环的时候DX[i],I居然等于3,好像把他当位读了
    诡异的事情!
      

  2.   

    还是你啊,
    if DX[i] and Round(Power(2,K))=0  then
       X[i, k Mod 8]:= False
       else
       X[i, k Mod 8]:= True;写成
    X[i, k Mod 8]:= DX[i] and Round(Power(2,K))<>0;
    你还是理解不了么?那k mod 8你怎么理解的?算数表达式最后变成一个数字你能理解,而逻辑表达式最后变成一个逻辑值你怎么就理解不了呢?
      

  3.   

    X[i, k Mod 8]:= DX[i] and Round(Power(2,K))<>0;
    这样写,X的2维数组没有赋到值!
      

  4.   

    你是怎么看出来没附到值的?你没说你到底要达到什么目的,所以我从你的代码分析,猜测你是要测试DX数组的0到2号元素的二进制位是否为1,如果为1则把true赋值到X数组的第二维,X数组的第一维是DX的下标,如果是要达到这个目的,你那个代码本身就有问题for i:=0 to 2 do
      for k:= 0 to 15 do 
      begin
       if DX[i] and Round(Power(2,K))=0  then
         上面那个Power(2,K)不对,应该为Power(2,K mod 8),
          但如果改成k mod 8,那你k循环16次就没意义,直接循环8次即可
         X[i, k Mod 8]:= False
       else
         X[i, k Mod 8]:= True;
      end;下面是修改的代码for i:=0 to 2 do
      for k:= 0 to 7 do
        X[i, k]:= DX[i] and Round(Power(2,K))<>0;
      

  5.   

    还有为什么你看到的i是等于3,我也说过了,这应该是编译器优化的结果,但程序运行不会受到任何影响,最简单的办法,你在循环体里加个断言ASSERT(i<>3),这个断言肯定不会被触发的,这时你再看看i的值。
      

  6.   

    for i:=0 to 2 do
      for k:= 0 to 7 do
        X[i, k]:= DX[i] and Round(Power(2,K))<>0;
    X[0,0-7]取到值了,但是X[1,0-7],X[2,0-7],好像没有取到值
      

  7.   

    D[0]等于 X[0,0-7]
    D[1]等于 X[1,0-7]
    D[2]等于 X[2,0-7]用了
    for i:=0 to 2 do
      for k:= 0 to 7 do
      X[i, k]:= DX[i] and Round(Power(2,K))<>0;X[0,0-7] 取到值了(确定是正确的),但是D[1],[2]好像没有取到!
      

  8.   

    看下面的图吧,这是实际测试结果,由于k是从0到7,所以调试窗口内的值是由低位向高位排列的,结果完全正确,如果把true和false换成1和0的话就是二进制表示
    DX[0]:=1   X[0,..] 的倒排列是 00000001b=1
    DX[1]:=2   X[1,..] 的倒排列是 00000010b=2
    DX[2]:=3   X[2,..] 的倒排列是 00000011b=3