2013-11-25 5 views
0

Этот код действительно проверяет границы массива?Проверка за пределами C

Пределы в данном случае равно 0 - 20 в 2d-массив

int noOfNeighbors(game *g, int row, int column){              
    int aliveCounter = 0; 

    for(int rows=-1; rows<=1; rows++) { 
     for(int cols=-1; cols<=1; cols++) { 

      if((rows || cols)) { 
       if(row+rows < (*g).rows && row+rows >= 0){ 
        if(column+cols < (*g).columns && column+cols >= 0){ 
         if(isAlive(g,row+rows,column+cols)){ 
          aliveCounter++; 
         } 
        } 
       } 
      } 
     } //end cols 
    }//end rows 
    return aliveCounter; 
}//end noOfNeighbors 

Где

typedef struct { 
    char current; 
    char next; 
} cell; 


typedef struct { 
    cell field[MAX_ROWS][MAX_COLUMNS]; 
    int rows; 
    int columns; 
    char aliveChar; 
    char deadChar; 
} game; 

и строки и столбцы установлены на 20

обновленный код и теперь его чеки 0-19

+2

Нам нужна декларация типа 'игры' –

+1

Похож на' (* g) .rows' и '(* g) .columns' (кто-то боится оператора' -> '?) Будут вашими верхними пределами (20). –

+0

По-прежнему нет доступа к массиву в этом коде ... – gongzhitaao

ответ

2

Этот код действителен ли проверка границ на массиве?

Да. Можете ли вы рассказать нам, что вы не понимаете, поэтому мы можем быть более конкретными?

Кроме того, вы можете изменить:

(*g).rows 

в

g->rows 

Это более легко читать.

Редактировать: Я только что заметил, что код в вопросе был отредактирован и исправлен. Поэтому, я думаю, вы сами нашли проблему: в исходном вопросе была проблема сравнения (<= вместо <).

+0

Есть ли разница между (* g) .rows и g-> строками, кроме того, что упрощает чтение? – uzr

+0

№ '->' предназначен для упрощения чтения. –

0

Это не ответ, но слишком долго для комментария:

код вы представляете имеет много проблем: я буду только решать эти:

В других уже отмечались в комментариях и в другом ответе: используйте g-> строки вместо (* g) .rows

В секции кода:

int noOfNeighbors(game *g, int row, int column){              
    int aliveCounter = 0; 

    for(int rows=-1; rows<=1; rows++) { 
     for(int cols=-1; cols<=1; cols++) { 

      if((rows || cols)) { 
       if(row+rows < (*g).rows && row+rows >= 0){ 

Путь написано, результаты последней строки являются неопределенными. То есть внутренний цикл, первый для достижения 1 - cols (строки все еще -1), а в сравнении (*g).rows && row+rows >= 0) `(* g) .rows еще не инициализирован.

Затем в строке следующее:

    if(column+cols < (*g).columns && column+cols >= 0){ 

По той же причине будет иметь неопределенные результаты.

На основании того, что представлено, нет никакого способа, чтобы знать наверняка, когда поток выполнения, наконец, добраться до сути цикла:

     if(isAlive(g,row+rows,column+cols)){ 
         aliveCounter++; 
        } 

Предложит первый, что вы предоставляете сегмент кода, который соответствует SSCCE, и, возможно, объяснение того, что является точным намерением, и где оно не соответствует ожиданиям.

+0

Я не понимаю, почему это были бы неопределенные результаты. (также строки равны -1 в первом цикле, а не 0). –

+0

'(* g) .rows', вероятно, инициализируется где-то еще, перед вызовом этой функции. –

+0

@Maxime согласился на оба, исправит ошибку -1. в отношении _why неопределенного? _, я не вижу кода, где он был инициализирован, или где OP так заявлял. Это фактор, один из многих, почему этот вопрос трудно ответить. Мой ответ, между прочим, говорит, что «это не ответ», просто словесный комментарий – ryyker

Смежные вопросы