Orz_TanLaLa 2021-10-09 20:05 采纳率: 66.7%
浏览 626
已结题

报错:0x7BE9FC66 (ucrtbased.dll) (HANum.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。

img


img

问:为什么报错?
做一个高精度算法的类,有三个文件:

  • main.cpp
  • HANum.h
  • HANum.cpp
    完整代码如下(错误在HANum.cpp第61行):

HANum.h

#pragma once

#include <iostream>
#include <deque>
#include <string>

class HANum {
public:
    HANum();
    HANum(std::string);
    ~HANum();

    HANum operator=(unsigned int);
    HANum operator+(HANum);
    HANum operator-(HANum);
    //HANum operator*(HANum);//提交时注:注释因为还没实现,下同(包括HANum.cpp)
    //HANum operator/(HANum);
    //HANum operator>(HANum);

    std::string toString();

    static HANum fromString(std::string);

private:
    //下标从低到高对应数位从高到低
    std::deque<unsigned int> num;
    //小数点在deque第几个元素前
    unsigned int dot;
    bool pos;

    void cleanZeros();
};

std::istream &operator>>(std::istream &, HANum &);
std::ostream &operator<<(std::ostream &, HANum);

HANum.cpp

#include "HANum.h"

using namespace std;

typedef unsigned int UINT;

HANum::HANum() { pos = false; dot = 0; }
HANum::HANum(string s) { 
    pos = false; 
    dot = 0;
    *this = HANum::fromString(s);
}
HANum::~HANum() {}

HANum HANum::operator=(UINT x) {
    while (x) {
        num.push_back(x % 10);
        x /= 10;
    }
    return *this;
}

HANum HANum::operator+(HANum x) {

    HANum self = *this;

    //加负数
/*    if (!x.pos) {
        x.pos = true;
        return self - x;
    }
    if (!pos) {
        self.pos = true;
        return x - self;
    }
*/
    //对齐小数点
    while (self.dot > x.dot) {
        self.dot--;
        self.num.push_back(0);
    }
    while (self.dot < x.dot) {
        x.dot--;
        x.num.push_back(0);
    }

    deque<UINT> v[2] = { num, x.num };
    deque<UINT> r;

    deque<UINT> *shorter, *longer;
    if (v[0].size() > v[1].size()) {
        longer = &v[0];
        shorter = &v[1];
    }
    else {
        longer = &v[1];
        shorter = &v[0];
    }

    r.push_front(0);
    for (int i = longer->size(); i >= shorter->size() + 1; i--) {
        UINT t = v[0][i - 1] + v[1][i - 1] + r[0];
        r.push_front(t / 10);
        r[1] = t - r[0];
    }
    for (UINT i = longer->size() - shorter->size(); i > 0; i--) {
        UINT t = (*longer)[i - 1] + r[0];
        r.push_front(t / 10);
        r[1] = t - r[0];
    }
    UINT t = (*longer)[0] + r[0];
    r.push_front(t / 10);
    r[1] += t - r[0];

    HANum n;
    n.num = r;
    n.dot = x.dot;
    n.cleanZeros();
    return n;
}
/*
HANum HANum::operator-(HANum x) {
    if (!x.pos) {
        x.pos = true;
        return *this + x;
    }
    if (!pos) {
        HANum t = *this;
        t.pos = true;
        return x - t;
    }

    deque<UINT> v[2] = { num, x.num };
    deque<UINT> r;

    UINT shorter, longer;
    if (v[0].size() > v[1].size()) {
        longer = 0;
        shorter = 1;
    }
    else {
        longer = 1;
        shorter = 0;
    }

    r.push_back(0);
    for (int i = 0; i < v[shorter].size(); i++) {
        UINT t = v[0][i] + v[1][i] + r[i];
        r.push_back(t / 10);
        r[i] = t - r[i + 1];
    }
    for (UINT i = v[shorter].size(); i < v[longer].size(); i++) {
        UINT t = v[longer][i] + r[i];
        r.push_back(t / 10);
        r[i] = t - r[i + 1];
    }

    HANum n;
    n.num = r;
    return n;
}
*/
string HANum::toString() {
    string r;
    deque<UINT> t = num;
    UINT d = dot;
    bool isInt = !dot;
    while (!t.empty()) {
        if (!isInt && d == 1) {
            r += '.';
            t.pop_front();
        }
        r += t.front() + '0';
        t.pop_front();
        d--;
    }
    return r;
}

HANum HANum::fromString(string s) {
    HANum r;
    UINT d = 0;
    for (auto i : s) {
        d++;
        if (i == '.') r.dot = d;
        else r.num.push_front(i - '0');
    }
    return r;
}

void HANum::cleanZeros() {
    while (num.size() > 1) {
        if (num.front() == '0') num.pop_front();
        else break;
    }
    while (num.size() > 1 && dot > 0) {
        if (num.back() == '0') {
            num.pop_back();
            dot--;
        }
        else break;
    }
}

//**************************************************

istream &operator>>(istream& is, HANum &n) {
    string t;
    is >> t;
    n = HANum::fromString(t);
    return is;
}

ostream &operator<<(ostream &os, HANum n) {
    string t = n.toString();
    os << t;
    return os;
}

main.cpp

#include "HANum.h"
using namespace std;
int main() {
    HANum x, y;
    cin >> x >> y;
    cout << x + y;
}

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-10-09 20:37
    关注

    for (int i = longer->size(); i >= shorter->size() + 1; i--) {
    UINT t = v[0][i - 1] + v[1][i - 1] + r[0];
    r.push_front(t / 10);
    r[1] = t - r[0];
    这段代码是有问题的,如果shorter->size()比longer->size()小2或以上,那么v[1][i-1]不行了,i-1下标超出数组大小范围了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月24日
  • 已采纳回答 10月16日
  • 创建了问题 10月9日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度