2016-12-11 5 views
-4

この関数では、行列内の偶数を取得したいと考えています。私のパラメータは、二次元のポインタと行列の次元です。 誰も私を助けることができますか? Cで、私が間違ってました...行列内の偶数を数える

subl $12, %esp     # 12 bytes to local variables 

    movl $0, -12(%ebp)    # counter = 0 
    movl 8(%ebp), %esi    # **m 
    movl $0, %ebx      # i = 0 
it_rows: 
    cmpl 12(%ebp), %ebx    # while(i != y) 
    jz  end       # if not equal jump 
    leal (%esi, %ebx, 4), %edi  # m+i 
    movl $0, %ecx      # j = 0 
it_col: 
    cmpl 16(%ebp), %ecx    # while(j != k) 
    jz  next_row 
    movl (%edi, %ecx, 4), %eax  # *(*(m+i)+j) 
    andl $0x1, %eax    # LSB 
    cmpl $0, %eax      # LSB == 0 
    jnz  not_even 
    movl -12(%ebp), %eax    # counter 
    incl %eax      # counter++ 
    movl %eax, -12(%ebp)    # update local variable 
not_even: 
    incl %ecx      # j++ 
    jmp  it_col 
next_row: 
    incl %ebx      # i++ 
    jmp  it_rows 

私の実装:

int count_even_matrix(int **m, int y, int k) { 
    int i, j; 
    int c = 0; 
    for(i = 0; i < y; i++) { 
     for(j = 0; j < k; j++) { 
      if(*(*(m+i)+j)%2 == 0) { 
       c++; 
      } 
     } 
    } 
    return c; 
} 
+0

マトリックスはどのように宣言されていますか? –

+1

アセンブリ言語の完全な機能が表示されておらず、呼び出し規約を尊重していない(呼び出し先保存レジスタを保存または復元したり、%ebpを正しく設定しない) - コードを試すことができない私はあなたにそれを手伝ってくれるのではない。 – zwol

+1

私は、あなたのアセンブリコードをline_と 'gcc -m32 -march = native -fomit-frame-pointer -fno-schedule-insns -fno-スケジュール-insns2 -O2 -S'。それらが異なるところでは、コンパイラはあなたが何かを知っていて何かを研究していると仮定します。 ( '.cfi_something blah blah blah'という行を無視しても問題ありません) – zwol

答えて

0

変更

if ((m[i][j] % 2) == 0) {  
    c++; 
} 

iifは、あなたの行列の行インデックス、およびj列のインデックスです。 2つのforは既にそれらを増分します。

0

私はちょうどCの初心者ですが、2次元配列の配列名を関数に渡すと、実際には配列の最初の要素にポインタを渡しています。 3要素1次元配列です。だからあなたのポインタはint(* m)[3]として宣言されるべきだと思います。

関連する問題