2016-04-03 100 views
-1

我想通過使用(max_element-min_element)從一個向量來設置一個浮點值。我正在循環其中幾個,因此矢量和矢量的矢量。向量迭代器不可忽略C++

,我發現了以下錯誤:

Expression: Vector iterator not dereferencable

vector<float> amplitudeStorage; 
vector<vector<float>> vectorStorage;  


int main(){ 

     for (int i = 0; i < amplitudeStorage.size(); i++) 
     { 
     AssignWaveAmplitude(amplitudeStorage[i], vectorStorage[i]); 
     } 
    } 

它發生在函數調用。功能看起來像這樣:

void AssignWaveAmplitude(float amplitudeVariable, vector<float> dataVectorr) 
{ 
    amplitudeVariable = (*max_element(begin(dataVectorr), end(dataVectorr))) - (*min_element(begin(dataVectorr), end(dataVectorr))); 
} 

有誰知道如何解決這個問題?

非常感謝。

編輯1:解決這個問題是對這個問題的第一個評論。我使用的一些向量是空的,導致了錯誤。

EDIT2:

@WhozCraig所以現在我已經做到了這一點:

for (int i = 0; i < amplitudeStorage.size(); i++) { 
    amplitudeStorage[i] =AssignWaveAmplitude(vectorStorage[i]);         
    } 

這:

float AssignWaveAmplitude(vector<float> dataVectorr) { 

    return (*max_element(begin(dataVectorr), end(dataVectorr))) - (*min_element(begin(dataVectorr), end(dataVectorr))); 
} 

但花車都還站出來爲同一個號碼。任何想法爲什麼?

編輯3:原來,爲什麼浮動錯誤是因爲我錯誤地輸出它們。

我做: cout << lowerBackYAmplitude<< endl (這是amplitudeStorage的一個值)

我應該做的事情:

for (int i = 0; i < amplitudeStorage.size(); i++) 
       { 
        cout << amplitudeStorage[i] << endl; 
       } 
+1

這是一個想法。將其他過高的單行分解成幾部分,並查看哪些行程中的哪一行導航引用了最終迭代器。我猜,'dataVector'是空的。當然,如果沒有MCVE,那麼你會得到很多。 – WhozCraig

+0

@WhozCraig yep只是檢查了代碼,一些存儲在vectorStorage中的向量是空的。現在沒有錯誤,但'amplitudeVariable'現在總是以'-1.07374e + 08'出現。任何想法爲什麼? –

+0

大聲笑。不是線索,未初始化某些東西?但至少你知道爲什麼這個無效的引用是浮出水面的。很高興你找到*那*。順便說一句,也許給你的鑽機上的複製緩衝區休息一下,並通過'const'引用傳遞該矢量,而不是通過值複製。只是說... = P祝你好運。 – WhozCraig

回答

0

我使用的一些向量是空的,導致了錯誤。

-1

查看完整的工作的例子。我嘗試合編,沒有任何問題。

#include <vector> 
#include <algorithm> 

using namespace std; 

vector<float> amplitudeStorage; 
vector< vector<float> > vectorStorage; 

void AssignWaveAmplitude(float& amplitudeVariable, const vector<float>& dataVectorr) { 
    if(dataVectorr.size()) { 
     amplitudeVariable = 0; 
     return; 
    } 
    amplitudeVariable = (*max_element(dataVectorr.begin(), dataVectorr.end())) - 
     (*min_element(dataVectorr.begin(), dataVectorr.end())); 
} 

main(){ 

    for (int i = 0; i < amplitudeStorage.size(); i++) { 
     AssignWaveAmplitude(amplitudeStorage[i], vectorStorage[i]); 
    } 

} 
+1

其實我認爲你會發現std :: begin是完全有效的:http://en.cppreference.com/w/cpp/iterator/begin也適用於數組! – Goz

+0

是的,我發現,但不是解決的問題 –

+0

@ fl-web與您的答案我仍然得到同樣的錯誤。 –

0

你的編譯器可能正試圖警告你,你不能正確指amplitudeStorage [I]對我的任何值,當amplitudeStorage矢量簡直是空的。調整amplitudeStorage的大小以匹配vectorStorage的大小,或使用push_back。我更喜歡push_back。下面是一個完整的例子(它也避免了按值傳遞向量,並糾正了使用int來索引一個數據結構的問題,該數據結構的大小本身可以增長到大於最大值的一個數據結構)。

請注意,此代碼使用C++ 11,因爲它使用基於範圍的for循環。您可能需要告訴編譯器打開對C++ 11的支持。在C++ 11中有很多很好的方便。

#include <vector> 
#include <algorithm> 

using namespace std; 

float WaveAmplitude(const vector<float>& dataVectorr) { 
    return (*max_element(begin(dataVectorr), end(dataVectorr))) 
    - (*min_element(begin(dataVectorr), end(dataVectorr))); 
} 

vector<float> amplitudeStorage; 
vector<vector<float>> vectorStorage;  

int main(void) { 
    // Populate vectorStorage somehow here, replacing this comment. 
    amplitudeStorage.clear(); 
    for (const auto& wave : vectorStorage) 
    { 
     amplitudeStorage.push_back(WaveAmplitude(wave)); 
    } 
    return 0; 
}