2016-06-30 16 views
0

Ich versuche, die Anzahl der verbundenen 1 in einer Matrix mit einer rekursiven Funktion zu zählen. Die Größe (max_sz) durch Verweis rekursiv zu übergeben, gibt mir Probleme, aber ich verstehe nicht, warum es heißt, dass mir eine Klammer fehlt.Fehler erwartet ')' versuchen, durch Verweis zu übergeben

Ich habe das seit 30 Minuten und habe keine Ahnung, warum ich diesen Fehler bekomme. Die Syntax sieht für mich richtig aus, aber ich bin ein C-Anfänger, also schätze ich, dass ich auf etwas gestoßen bin, das ich vorher nicht gesehen habe (oder ich bin nur blind).

Hier ist mein Code:

#include <stdio.h> 
#include <stdlib.h> 


int getval(int (*A)[5], int i, int j, int L, int H) { 
    if(i<0 || i>=L || j<0 || j>=H) 
     return 0; 
    else { 
     return A[i][j]; 
    } 
} 


void findMaxBlock(int (*A)[5], int r, int c, int L, int H, int size, int **cntarr, int &max_sz){ 
    if(r>=L || c >=H) 
     return; 
    cntarr[r][c]=1; 
    size++; 
    if(size>max_sz) 
     max_sz = size; 
    //search in eight directions 
    int direction[][2]={{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1}}; 
    for(int i=0; i<8; i++) { 
     int newi = r+direction[i][0]; 
     int newj = c+direction[i][1]; 
     int val = getval(A, newi, newj, L, H); 
     if(val>0 && (cntarr[newi][newj]==0)){ 
      findMaxBlock(A, newi, newj, L, H, size, cntarr, max_sz); 
     } 
    } 
    cntarr[r][c]=0; 
} 


int** create2darr(int rmax, int colmax) { // In C99, you can use variable-length arrays:   
     int **mat = (int**)malloc(rmax*sizeof(int*)); 
     for(int i = 0; i < rmax; i++) mat[i] = (int*)malloc(colmax * sizeof(int)); 
     return mat; 
} 


int getMaxOnes(int (*A)[5], int rmax, int colmax) { 
    int max_sz = 0; 
    int size = 0; 
    int **cntarr = create2darr(rmax, colmax); 
    for(int i=0; i<rmax; i++){ 
     for(int j=0; j<colmax; j++){ 
      if(A[i][j] == 1){ 
       findMaxBlock(A, i, j, rmax, colmax, 0, cntarr, max_sz); 
      } 
     } 
    } 
    return max_sz; 
} 


int main(int argc, char *argv[]) { 
    int zarr[][5] = {{1,1,0,0,0},{0,1,1,0,0},{0,0,1,0,1},{1,0,0,0,1},{0,1,1,1,1}}; 
    printf("Number of maximum 1s are %d\n", getMaxOnes(zarr, 5, 5)); 
} 

/* 
11000 
01100 
00101 
10001 
01111 

ans: 7 (diagonals count too) 
*/ 

Hier sind die Fehler generiert:

connected1sInMatrix.c:14:88: error: expected ')' 
void findMaxBlock(int (*A)[5], int r, int c, int L, int H, int size, int **cntarr, int &max_sz){ 
                        ^
connected1sInMatrix.c:14:18: note: to match this '(' 
void findMaxBlock(int (*A)[5], int r, int c, int L, int H, int size, int **cntarr, int &max_sz){ 
       ^
connected1sInMatrix.c:14:88: error: parameter name omitted 
void findMaxBlock(int (*A)[5], int r, int c, int L, int H, int size, int **cntarr, int &max_sz){ 
                        ^
connected1sInMatrix.c:19:10: error: use of undeclared identifier 'max_sz' 
     if(size>max_sz) 
       ^
connected1sInMatrix.c:20:3: error: use of undeclared identifier 'max_sz' 
       max_sz = size; 
       ^
connected1sInMatrix.c:28:52: error: use of undeclared identifier 'max_sz' 
         findMaxBlock(A, newi, newj, L, H, size, cntarr, max_sz); 
                     ^
5 errors generated. 

Ich weiß Stackoverflow kein Debugger ist, aber ich bin völlig verloren, was hier vor sich geht. Jeder Rat oder Vorschläge wird sehr geschätzt, danke.

Antwort

1

Das Problem ist hier:

void findMaxBlock(int (*A)[5], int r, int c, int L, 
        int H, int size, int **cntarr, int &max_sz){ 
               // ^----- here 

Sie versuchen, einen Parameter als Referenz zu erklären, die eine C++ nur Funktion.

Ändern Sie es in *max_sz und dereferenzieren Sie es entsprechend.

In findMaxBlock:

... 
if(size>*max_sz) 
    *max_sz = size; 
... 
    findMaxBlock(A, newi, newj, L, H, size, cntarr, max_sz); 

In main:

findMaxBlock(A, i, j, rmax, colmax, 0, cntarr, &max_sz); 
+0

Oh wow ich kann nicht glauben, ich hätte nie gedacht, das war ein C++ nur Funktion. Vielen Dank. – Austin

1

C hat nicht den Begriff der Referenzen. Sie müssen den Zeiger an eine Variable übergeben, wenn Sie die Variable in einer Funktion ändern möchten und die Änderung in der aufrufenden Funktion sichtbar sein soll.

void findMaxBlock(int (*A)[5], int r, int c, int L, int H, 
        int size, int **cntarr, int* max_sz){ 
              ^^ 

und verwenden Sie es als:

findMaxBlock(A, i, j, rmax, colmax, 0, cntarr, &max_sz); 
Verwandte Themen