2014-09-04 3 views
1


Я хочу знать, почему передача v.size() аргументу макроса дает мне ошибку, но если я храню значение во временной переменной и передаю, что вместо этого он работает;Макро для аргумента петли

Вот мой код:

#include <stdio.h> 
#include <vector> 

using namespace std; 

#define FOR(i,a,b) for(int i=a;i<=b;++i) 
#define REP(i,n) FOR(i,0,n-1) 

int main(){ 

    int n,x; 
    vector<int> v; 
    scanf("%d", &n); 
    REP(i, n){ 
     scanf("%d", &x); 
     printf("Size of Vector = %d\n", v.size()); 
     int exists = 0; 
     REP(j, v.size()){ 
      // Loop executes even when size = 0 
      if (v[j] == x){ 
       exists = 1; 
       break; 
      } 
     } 
     if (!exists) 
      v.push_back(x); 
    } 
    return 0; 
} 

Однако это работает:

int size = v.size(); 
REP(j, size){ 
    if (v[j] == x){ 
     exists = 1; 
     break; 
    } 
} 

ответ

3

Проблема заключается в том, что ваш макрос FOR делает B - 1. Таким образом, если б равно 0, а unsigned (как мне кажется v.size()) вы получите очень большое число вместо -1. Вы должны использовать следующие макросы:

#define FOR(i,a,b) for(int i=a;i<b;++i) 
#define REP(i,n) FOR(i,0,n) 
+0

Хорошая работа! Теперь это кажется таким очевидным. Действительно хороший вопрос, он будет идеально подходит для интервью. – yasen

+0

Спасибо. Вместо этого я просто набираю текст на ** int ** '#define REP (i, n) FOR (i, 0, (int) n-1)' –

0

Тип v.size() не имеет знака. Если вы продлеваете линию REP(j, v.size()){, вы получите for(int j=0;j<=v.size()-1;++j). Если v пуст, результат v.size()-1 - это максимальное значение, которое может содержать unsigned var типа v.size(). В j<=v.size()-1 переменная j продвигается к неподписанному типу. Это приводит к отсутствию границы для j, и становится легко понять, почему вы получаете ошибку vector subscript out of range.

1

Ваш код

REP(j, v.size()){ 

будет интерпретироваться как

for(int j=0;j<=v.size()-1;++j) { 

вектор :: размер() возвращает беззнаковое целое значение. Если размер равен нулю, значение v.size()-1 составляет максимальное значение интеграла, то есть j<=v.size()-1 всегда верно.

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