| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 756 人关注过本帖
标题:BCB中关于二进制加法的程序运行后发现的问题
只看楼主 加入收藏
lxqlyld
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:116
专家分:125
注 册:2012-6-18
结帖率:85.29%
收藏
已结贴  问题点数:15 回复次数:3 
BCB中关于二进制加法的程序运行后发现的问题
我用BCB写了一个计算器程序,其他进制运算都没有问题,唯独二进制加法运算,编译没有错误,但运行后使用二进制加法进行运算时,出现了这个错误:First chance exception at $5000D5E8. Exception class $C0000005 with message 'access violation at 0x5000d5e8: read of address 0xe5582603'. Process 计算器.exe (5428)。
出现这个错误时,同时弹出一个对话框“Debugger Exception Notification”,关掉对话框后,光标停留在,红色字体行:
 char& __fastcall operator [](const int idx)
    {
      ThrowIfOutOfRange(idx);   // Should Range-checking be optional to avoid overhead ??
      Unique();                 // Ensure we're not ref-counted (and Ansi)
      return Data[idx-1];
    }
以上函数不是我编写的,是自动弹出的dstring.h中的一个函数。
我写的二进制加法代码是:
int a1=0,a2,b1=0,b2,c1;
      char c[256];
      
      int n=a.Length();//a 是计算器中按加号时Edit1->Text的内容,也就是被加数,例如一个运算,111+101,a为“111”
      int m=Edit1->Text.Length();//Edit1->Text为按加号后的输入的内容,也就是加数,为“101”
      for(int i=0;i<n;i++)
      {
          a2=pow(2,i);//a2等于2的i次方
          a1=a1+int(a[n-1-i])*a2;//将输入二进制数转换为十进制数,赋值给a1
      }
      for(int i=0;i<m;i++)
      {
          b2=pow(2,i);//b2等于2的i次方
          b1=b1+int(Edit1->Text[m-1-i])*b2;//将输入二进制数转换为十进制数,赋值给b1
      }
      c1=a1+b1;
      itoa(c1,c,2);//将c1转换成二进制数,保存在c中
      Edit1->Text=c;//将c赋值给Edit1->Text,显示运算结果
请问各位高手,这个问题怎么解决啊?我就15分了,请各位别嫌少啊
搜索更多相关主题的帖子: 计算器 message address 二进制 
2012-12-17 09:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
从 char& __fastcall operator [](const int idx) 函数来看,应该是数组下标越界引发的错误
但看你的代码,虽然烂得可以,但并没有下标越界的情况,所以我也不知道
我只说说你的代码吧
对于整数运行,为什么用浮点数的pow(2,i),改为1<<i吧
如果将数字字符转化为数字,应当还要减去'0'
根本没有必要转化为十进制,直接用二进制一样运算
下午帮你写一个
</i吧
2012-12-17 10:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
随手瞎写的,参考一下
程序代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <cassert>

inline char c2i( char c )
{
    if( c>='0' && c<='9' )
        return c-'0';
    if( c>='A' && c<='Z' )
        return c-'A'+10;
    if( c>='a' && c<='z' )
        return c-'a'+10;

    assert( false );
    return -1;
}
inline char i2c( char c )
{
    assert( c>=0 );

    if( c<=9 )
        return c+'0';
    if( c<=36 )
        return c-10+'A';

    assert( false );
    return -1;
}
template<size_t N> std::string str_add( const char* stra, const char* strb )
{
    std::string a = stra;
    std::string b = strb;
    std::reverse( a.begin(), a.end() );
    std::reverse( b.begin(), b.end() );
    size_t m = std::max(a.size(),b.size());
    a.resize( m, '0' );
    b.resize( m, '0' );
    std::transform( a.begin(), a.end(), a.begin(), &c2i );
    std::transform( b.begin(), b.end(), b.begin(), &c2i );

    std::string rt;
    unsigned c = 0; // 进位
    for( size_t i=0; i<m; ++i )
    {
        assert( a[i]!=-1 && b[i]!=-1 && a[i]<N && b[i]<N );
        c += a[i] + b[i];

        rt.push_back( i2c(c%N) );
        c /= N;
    }
    if( c )
        rt.push_back( i2c(c) );
    std::reverse( rt.begin(), rt.end() );

    return rt;
}

using namespace std;

int main()
{
    cout << str_add<2>("111","101") << endl; // 1100
    cout << str_add<2>("1100","111") << endl; // 10011
    cout << str_add<2>("1100","11") << endl; // 1111

    cout << str_add<10>("456","654") << endl; // 1110
    cout << str_add<10>("9456","654") << endl; // 10110

    cout << str_add<36>("AZ","B") << endl; // BA

    return 0;
}

2012-12-17 12:14
lxqlyld
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:116
专家分:125
注 册:2012-6-18
收藏
得分:0 
回复 3楼 rjsp
非常感谢,问题解决
2012-12-18 11:09
快速回复:BCB中关于二进制加法的程序运行后发现的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028973 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved