2014-04-24 3 views
1

나는 값 (복식을 사용하여 테스트) 임의 템플릿 벡터를 채우기 위해 기능을 사용하고 있습니다 :벡터 첨자가 범위를 벗어남 (하지만 정말)

기능이 벡터에 메인에서 호출
template <typename T> 
    void setList(vector<T> & theList) 
    { 
     srand(time(NULL));   

     int howMany, max, min; 
     cout << "How many items should be generated in the list? "; 
     cin >> howMany; 
     cin.ignore(); 

     cout << "Max value of list? "; 
     cin >> max; 
     cin.ignore(); 

     cout << "Min value of list? "; 
     cin >> min; 
     cin.ignore(); 

     theList.resize(howMany); 

     T randValue; 
     for (int i = 0; i < howMany; ++i) 
     { 
      randValue = (((double) rand()/(double) RAND_MAX) * (max - min)) + min; 
      theList[i] = randValue; 
     } 
    } 

: 내가 첨자 howMany-2에 도달하면

vector<double> listA; 
    setList(listA); 

는 상관없이 어떤 값 "howMany"나는 범위 에러에서 첨자를 받고 없습니다입니다.

디버거를 밟으면 내 색인이 아래 첨자 범위 내에 있습니다. 사용자 howMany, 10 들어가면

예를 들어, 루프 오류가 발생

theList[8] = randValue; 

입력하려고 할 때.

아이디어가 있으십니까?

+2

'list'도 STD 클래스이기 때문에 가능합니까? 그리고 왜 정의 메서드에 의해 벡터가 정수를 보유하고 있기 때문에 Template 메서드를 사용합니까? – NirMH

+0

@NirMH, 그건 내 첫 번째 직관 이었지만, 아무것도 변경되지 않았습니다.리스트는리스트 오브젝트가 아닌 변수 이름으로 정확하게 식별됩니다. 나는 여전히 동일한 오류를 확인하고 코드를 다시 작성했습니다. – tloveless

+0

어떤 오류가 있습니까? 당신은'list'와'i'의 크기를 루프에 기록 할 수 있습니까? –

답변

0

Solaris 환경에서이 코드를 시도했지만 범위 색인 예외를 벗어났습니다.

int main(int argc, char** argv) { 
    std::vector<int> lista; 
    lista.clear(); 
    setList(lista); 
} 

내 출력처럼

template <typename T> 
void setList(std::vector<T> & list) 
{ 
    srand(time(NULL)); 

    int howMany, max, min; 
    std::cout << "How many items should be generated in the list? "; 
    std::cin >> howMany; 
    std::cin.ignore(); 

    std::cout << "Max value of list? "; 
    std::cin >> max; 
    std::cin.ignore(); 

    std::cout << "Min value of list? "; 
    std::cin >> min; 
    std::cin.ignore(); 

    list.resize(howMany); 

    T randValue; 
    for (int i = 0; i < howMany; ++i) 
    { 
     randValue = (((T) rand()/(T) RAND_MAX) * (max - min)) + min; 
    list[i] = randValue; 
    } 
    // I Have added this feature for visualization purposes 
    for (int i = 0; i < list.size(); ++i) 
    { 
     std::cout << "list[" << i << "]=" << list[i] << std::endl; 
    } 
    } 

그리고 (내 주) 같습니다 : 나는 것으로 나타났습니다 그런데

My execution output

내 코드입니다 정수 벡터를 정의하면 벡터의 내용은 항상 최소값입니다. 중간 값을 double 값으로 캐스팅하고 결과를 T 유형으로 최종 변환해야하기 때문입니다 (intege 유형에서 "/"연산자는 정수 나눗셈으로 해석됩니다).

이렇게 할 수 있습니다.

for (int i = 0; i < howMany; ++i) 
{ 
    randValue = static_cast<T>((static_cast<double>((T) rand())/static_cast<double>((T) RAND_MAX)) * (max - min)) + min; 
    list[i] = randValue; 
} 
+0

정수로 버그를 잡아 내지 못했지만, 그것을 지적 해 주셔서 감사합니다! – tloveless

+0

감사합니다. 문안 인사 –

0

내 딜레마에 대한 답은 @SingerOfTheFall에서 제공했습니다.

특히 디버깅 할 때 무의미한 오류가 발생하면 (이 경우 실제로 범위 내에있는 동안 범위를 벗어남) 다른 방법으로 테스트해야합니다.

다른 컴파일러에서로드해도 코드가 제대로 실행되는 것으로 나타나면 문제가 코드와 반드시 일치하지는 않습니다.

처음부터 코드를 다시 컴파일 ("정리")하면 코드가이 상황에서 트릭을 만들었습니다.

관련 문제