我正在解決SPOJ上一個簡單的問題,叫做FASHION ...它很簡單。我只想得到迭代器的竅門。但後來我遇到了一個奇怪的問題。SIGILL在ideone上,但在代碼塊上運行時發出警告
這是我的代碼,
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
int hotMax(vector<int> &, vector<int> &);
int main()
{
int iter,m_f;
scanf("%d", &iter);
vector<int> a,b;
while(iter--){
scanf("%d", &m_f);
a.resize(m_f);
b.resize(m_f);
vector<int>::iterator it;
for(it = a.begin(); it != a.end(); it++){
scanf("%d", it);
}
for(it = b.begin(); it != b.end(); it++){
scanf("%d", it);
}
printf("%d\n", hotMax(a,b));
}
return 0;
}
int hotMax(vector<int> &a, vector<int> &b){
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
int result = 0;
vector<int>::iterator it1,it2;
for(it1 = a.begin(),it2 = b.begin(); it1 != a.end(); it1++,it2++){
result+= (*it1) * (*it2);
}
return result;
}
我得到的代碼塊這樣的警告,
/home/harshal/c++ tutorial/SAMER08F/main.cpp|22|warning: format ‘%d’ expects argument of type ‘int*’, but argument 2 has type ‘std::vector::iterator {aka __gnu_cxx::__normal_iterator >} /home/harshal/c++ tutorial/SAMER08F/main.cpp|25|warning: format ‘%d’ expects argument of type ‘int*’, but argument 2 has type ‘std::vector::iterator {aka __gnu_cxx::__normal_iterator >}’ [-Wformat=]|
這些對應 scanf("%d", it);
但隨後在代碼塊完美運行,
它在ideone和SPOJ中給出了一個SIGILL。
當我用cin>> *it
替換scanf時,它在SPOJ和ideone上運行完美。
如果你能給我一個見解,我將非常感激。我試圖只將它放在scanf中,因爲它是一種通用指針,指向矢量。
在此先感謝。
謝謝,但你能給我提供SIGILL的理由嗎? – harpribot
編譯器可能爲那個'scanf'調用產生一些系統調用,當它碰到實現定義的那個迭代器時,它就會到處噴出。很難說。 – TartanLlama
是否能夠在您的最終重現相同的錯誤?這不好。我知道迭代器不是簡單的'T *',而是'cin >> * it'工作。 – harpribot