2012-02-23 7 views
0

非常に裸のC++プログラムの実行に問題があります。文字列を入力として受け取り、個々の数値を動的配列に設定するBigIntクラスです。私がこれまでにやろうとしているのは、BigIntを入力して出力するだけです...非常に簡単です。私のプログラムはうまくコンパイルされて実行されますが、最初の入力を入力すると私にはこの奇妙なエラーが発生します... "このアプリケーションは、ランタイムを異常な方法で終了するように要求しています 詳細についてはアプリケーションのサポートチームにお問い合わせください。奇妙なランタイムエラー

私のコードに何らかの欠陥が見つからないことがわかっているこの問題について、どうすればよいか分かりません。

誰もが考えている?

HERESに私のコード:

ヘッダファイル:

#ifndef BIGINT_H 
#define BIGINT_H 

#include <iostream> 

namespace JHall{ 
class BigInt { 
public: 
    BigInt(std::string s = ""); 
    BigInt(const BigInt& b); 
    ~BigInt(); 
    void operator =(const BigInt& b); 
    friend std::istream& operator >>(std::istream& in, BigInt& b); 
    friend std::ostream& operator <<(std::ostream& out, const BigInt& b); 

private: 
    short* num; 
    int cap; 
    int size; 

}; 
} 
#endif /* BIGINT_H */ 

実装ファイル:

#include "BigInt.h" 
#include <cstdlib> 

namespace JHall{ 
BigInt::BigInt(std::string s) 
{ 
    size = s.length(); 
    cap = 100; 
    num = new short[cap]; 
    int place = 0; 
    for(int i = size-1; i >= 0; i--) 
     num[place++] = strtol(s.substr(i-1,1).c_str(), NULL, 10); 
} 

BigInt::BigInt(const BigInt& b) 
{ 
    size = b.size; 
    cap = b.cap; 
    for(int i = 0; i < size; i++) 
     num[i] = b.num[i]; 
} 

BigInt::~BigInt() 
{ 
    delete [] num; 
} 

void BigInt::operator =(const BigInt& b) 
{ 
    if(cap != b.cap) 
    { 
     short* temp = new short[b.cap]; 
     for(int i = 0; i < b.cap; i++) 
      temp[i] = b.num[i]; 
     delete [] num; 
     num = temp; 
    } 

    for(int i = 0; i < cap; i++) 
     num[i] = b.num[i]; 

    size = b.size; 
    cap = b.cap; 
} 

std::istream& operator>>(std::istream& in, BigInt& b) 
{ 
    std::string s; 
    in>>s; 
    b.size = s.length(); 
    int count = 0; 
    for(int i = b.size-1; i >= 0; i--) 
     b.num[count++] = strtol(s.substr(i-1,1).c_str(),NULL,10); 
    return in; 
} 

std::ostream& operator<<(std::ostream& out, const BigInt& b) 
{ 
    for(int i = b.size-1; i >= 0; i--) 
     out<<b.num[i]; 
    return out; 
} 

} 

MAIN FILE:

#include <cstdlib> 
#include "BigInt.h" 

using namespace std; 
using namespace JHall; 

/* 
* 
*/ 
int main(int argc, char** argv) 
{ 
    BigInt b1, b2; 
    cout<<"Enter a large integer"<<endl; 
    cin>>b1; 
    cout<<"Enter another large integer"<<endl; 
    cin>>b2; 

    cout<<b1; 
    cout<<b2; 


    return 0; 
} 
+2

うん、デバッガ内で実行し、それが壊れる場所を確認。 –

+0

最初のcin >> b1に当たったときに壊れます。私はBigIntを読み込むために>>演算子を適切にオーバーロードしたので、なぜそれほど確かではありません – user1227202

答えて

3

この行が間違っている:

for(int i = b.size-1; i >= 0; i--) 
    b.num[count++] = strtol(s.substr(i-1,1).c_str(),NULL,10); 

iが0の場合、-1から始まる部分文字列を要求します。

+0

ああ、私はそれを見ていないのは馬鹿です!本当にありがとう! – user1227202

+0

良い点(2本の線を実際に引用しましたが); –

0

明白なエラーは、コピーコンストラクタにメモリを割り当てないことです。これがすべて使用されていると、クラッシュする可能性が非常に高くなります。もう1つ、比較的明白なエラーは、100桁以下の数字が不必要な制限のように見えることを前提としています。代入演算子は、通常値を2回コピーする際に不必要な作業を行うように見えます。また、charからサブストリングとstrtol()を使用してshortに個々の桁を変換するのはちょっと残念です。適切な方法は、使用することです

int value = s[i] - '0'; 

また、コンストラクタでメンバ初期化子リストを使用することを検討する必要があります。あなたが作業コピーコンストラクタを持っている場合はもちろん、あなたもswap()メソッドを実装してから代入演算子でこれを使用することがあります:

BigInt& BigInt::operetor= (BigInt const& other) { 
    BigInt(other).swap(*this); 
    return *this; 
} 
+0

これらの有益な観測をありがとう。私は確かにあなたが言ったことに基づいて自分のコードを修正します。私は文字にその整数値をどのように割り当てたかに非常に興味があります。私はこれを見たことがないし、これも可能だったことを認識していない、ありがとう! – user1227202

+0

私はそれがどのように正確に働くのか聞いてもよろしいですか? (文字を整数に代入する) – user1227202

+0

'char'は単なる整数です。 '' 0 ''は数字のシーケンスの基本値です。つまり、他の数字は '' 0 ''で始まる順番に値を持つことが保証されています。つまり、 '' 1 == '0' + 1'、 '' 2 '==' 0 '+ 2'などです。明示的な変換によってそれを利用することができます: '1 ==' 1 ' - '0''など –