0

Я пытаюсь подсчитать количество подключенных 1 в матрице, используя рекурсивную функцию. Передача размера (max_sz) референтной репутацией дает мне проблемы, но я не понимаю, почему он говорит, что мне не хватает скобок.Ошибка ожидается ')' пытается пройти по ссылке

Я смотрю на это в течение 30 минут и понятия не имею, почему я получаю эту ошибку. Синтаксис выглядит правильно для меня, но я начинающий C, поэтому я предполагаю, что столкнулся с тем, чего я раньше не видел (или я просто слепой).

Вот мой код:

#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) 
*/ 

Вот генерируемые ошибки:

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. 

Я знаю, StackOverflow не отладчик, но я полностью потерял, как к тому, что здесь происходит. Любые советы или предложения приветствуются, спасибо.

ответ

1

Проблема здесь:

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

Вы пытаетесь объявить параметр в качестве эталона, который является C++ только функция.

Измените его на *max_sz и разыщите его соответствующим образом.

В findMaxBlock:

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

В main:

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

Ого я не могу поверить, что я никогда не понимал, что был C++ только функция. Благодарю. – Austin

1

C не имеет понятия ссылок. Вам нужно передать указатель на переменную, если вы хотите изменить переменную в функции и хотите, чтобы изменения были видимыми в вызывающей функции.

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

и использовать его как:

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