2016-12-11 3 views
-4

In dieser Funktion möchte ich gerade Zahlen in Matrix bekommen. Meine Parameter sind ein zweidimensionaler Zeiger und die Dimensionen der Matrix. Kann mir jemand helfen? Wo ich falsch ...Zählen Sie gerade Zahlen in Matrix

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 

Meine Implementierung in C:

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

Wie wird die Matrix deklariert? –

+1

Sie haben nicht die vollständige Assemblersprache-Funktion angezeigt, und Sie halten die Aufrufkonvention nicht ein (Sie speichern oder stellen keine gespeicherten Register wieder her oder richten% ebp richtig ein) - damit ich nicht mit Ihrem Code experimentieren kann Ich bin nicht motiviert, dir dabei zu helfen. – zwol

+1

Ich habe jedoch einen Ratschlag: Vergleichen Sie Ihren Assembly-Code _line by line_ mit dem Ergebnis der Ausführung Ihres C-Codes durch 'gcc -m32 -march = native -fomit-frame-pointer -fno-schedule-insns -fno- Zeitplan-insns2 -O2 -S'. Wo sie sich unterscheiden, nehmen Sie an, dass der Compiler etwas weiß, was Sie nicht tun, und erforschen Sie etwas. (Sie können alle Zeilen ignorieren, die '.cfi_etwas blah bla bla 'lesen.) – zwol

Antwort

0

Ändern Sie den if mit

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

i ist Ihre Matrixzeilen-Index und j die Spalten-Index. Die beiden for inkrementieren sie bereits.

0

Ich bin nur ein Anfänger in C, aber wenn Sie den Array-Namen Ihres zweidimensionalen Arrays an Ihre Funktion übergeben, übergeben Sie tatsächlich einen Zeiger auf das erste Element des Arrays, was in diesem Fall ist ein dreidimensionales eindimensionales Array. Also ich glaube, dass Ihr Zeiger als int (* m) [3] deklariert werden sollte.

Verwandte Themen