2016-12-09 1 views
0

STOI関数がエラーメッセージのインスタンス投げた後に呼び出さTERMINATE「のstd ::の例外Invalid_argument」何を():STOIは

"****@****:~> g++ -std=c++0x m1.cpp stimulation.h stims.h Task.h exoskeleton.h ARAIG_Sensors.h Profile.h 

ARAIG_Sensors.h:1:9: warning: #pragma once in main file [enabled by default] 

Profile.h:1:9: warning: #pragma once in main file [enabled by default] 

*****@****:~> a.out StimulationConfig.csv TaskConfiguration.csv SampleProfileConfig.csv SampleOutput.txt 

First : a.out 
Second : StimulationConfig.csv 
terminate called after throwing an instance of 'std::invalid_argument' 
    what(): stoi 
Aborted 

でプログラムがクラッシュし、私はその理由を理解することはできません、というインスタンスがあります関数に渡されましたが、引き続きエラーを返します。誰かが解決策で私を助けてくれますか?

#pragma once 
#include <string> 
#include <vector> 
#include "Task.h" 
#include <ostream> 
#include "ARAIG_Sensors.h" 
namespace m1 
{ 
    class Profile 
    { 
     ARAIG_Sensors araig; 
     std::vector<Task> ToRun; 
     std::vector<Task> Completed; 
     std::string studentFN; 
     std::string studentLN; 
     std::string studentSN; 
     std::string flightFN; 
     std::string flightLN; 
     std::string flightEN; 
     std::ostream& os; 

     struct calibration { 
      int Max; 
      int Min; 
     }; 

     calibration cal; 

    public: 
     Profile(std::string fn, std::ostream& o, ARAIG_Sensors& a) : os(o) 
     { 
      araig = a; 

      //parsing student 
      std::ifstream infile(fn); 
      std::string line; 
      std::getline(infile, line); 
      int f = line.find_first_of(","); 
      studentFN = line.substr(0, f); 
      line = line.substr(f + 1); 
      f = line.find_first_of(","); 
      studentLN = line.substr(0, f); 
      studentSN = line.substr(f + 1); 

      //parsing flight 
      std::getline(infile, line); 
      f = line.find_first_of(","); 
      flightFN = line.substr(0, f); 
      line = line.substr(f + 1); 
      f = line.find_first_of(","); 
      flightLN = line.substr(0, f); 
      flightEN = line.substr(f + 1); 

      //parsing calibration 
      std::getline(infile, line); 
      f = line.find_first_of(","); 
      cal.Min = stoi(line.substr(0, f)); 
      std::cout << cal.Min << std::endl; 
      line = line.substr(f + 1); 
      cal.Max = stoi(line); 



      std::list<Task> temp = araig.gettasks(); 
      while (std::getline(infile, line)) 
      { 
       for (std::list<Task>::iterator i = temp.begin(); i != temp.end(); i++) 
       { 
        if ((*i).getName() == line) 
        { 
         ToRun.push_back(*i); 
         break; 
        } 



       } 

      } 

     } 
     void displayToRun() 
     { 
      for (std::vector<Task>::iterator i = ToRun.begin(); i != ToRun.end(); i++) 
      { 
       (*i).execute(os); 
      } 
     } 
     void displayCompleted() 
     { 
      for (std::vector<Task>::iterator i = Completed.begin(); i != Completed.end(); i++) 
      { 
       (*i).execute(os); 
      } 
     } 
     void displayNext() 
     { 
      std::vector<Task>::iterator i = ToRun.begin(); 
      (*i).execute(os); 
     } 
     void displayLast() 
     { 
      std::vector<Task>::iterator i = Completed.end(); 
      (*i).execute(os); 
     } 
     void Run() 
     { 
      //excute next Task and move Task to Completed 
      std::vector<Task>::iterator i = ToRun.begin(); 
      Task t = *i; 
      t.execute(os); 
      ToRun.erase(i); 
      Completed.push_back(t); 
     } 
    }; 

} 
+1

ここでは、デバッガの使い方を学ぶのに最適な時間です。 'cal.Min = stoi(line.substr(0、f));'と 'cal.Max = stoi(line);を考えてみよう。 – AndyG

+0

http://stackoverflow.com/help/mcveをお読みください。 – Stargateur

答えて

1

それはあなたがstd::stoi()不正な入力を与えているので、それはあなたがキャッチされていないstd::invalid_argument例外をスローされることを意味します。

std::stoi, std::stol, std::stoll

例外

  • std::invalid_argument変換された値は、結果の型の範囲から外れるならば変換は

  • std::out_of_rangeを行うことができなかった場合又は基礎となる関数(std::strtolまたはstd::strtoll)は、errnoERANGEと設定します。

std::terminate

のstd ::終了()が例外処理は、次のいずれかの理由で失敗したときにC++ランタイムによって呼び出されます。

1)例外がスローされますキャッチされない(この場合、スタックの巻き戻しが行われるかどうかは実装定義です)

整数に変換しようとしている入力文字列の値を再確認する必要があります。それらは整数を表すものではありません。

+0

またはtry/catchを使用してこのエラーを検出してください – pm100

関連する問題