【问题标题】:Can't find possible run time error using maps使用地图找不到可能的运行时错误
【发布时间】:2013-11-06 16:37:51
【问题描述】:

我在某处遇到了分段错误,但由于 我无法访问案例测试(这是由编程竞赛网站上的自动评委判断的)我找不到在哪里

#include <iostream>
#include <stdio.h>
#include <map>
#include <algorithm>

using namespace std;

typedef pair<unsigned short int, unsigned short int> par;

int main(){
    int x, y, p, q, a1, b1, a2, b2, val;
    int cont, lin_min, lin_max, col_min, col_max;
    char cmd;
    while((cin >> x >> y >> p) && !(x==0 && y==0 && p==0)){
        cin >> q;
        //Using "getchar ()" to avoid reading line end, because below I'm reading a character
        getchar();
        map<par, int> matriz;
        map<par, int>::iterator it;
        for(int i=0;i<q;i++){
            cin >> cmd;
            //if command 'A' insert in matriz or incremente if already exists
            if(cmd=='A'){
                cin >> val >> a1 >> b1;
                //insert into map (my implementation for sparse matrix)
                matriz[par(a1, b1)]+=val;
            }else 
            //if command 'P' performs a search in the rectangle (a1, b1 to a2, b2)
            if(cmd=='P'){
                cont=0;
                cin >> a1 >> b1 >> a2 >> b2;
                lin_min = min(a1,a2);
                lin_max = max(a1,a2);
                col_min = min(b1,b2);
                col_max = max(b1,b2);
                //traverses the sparse matrix by summing the values that belong to the rectangle
                //I STRONGLY believe that the error is somewhere around here
                for(it=matriz.begin(); it!=matriz.end(); ++it){
                    if((it->first.first>=lin_min && it->first.first<=lin_max)&&
                        (it->first.second>=col_min && it->first.second<=col_max)){
                        cont+=it->second;
                    }
                    if (it->first.first>lin_max && it->first.second>col_max) break;
                }
                cout << cont*p << "\n";
            }
        }
    }
    return 0;
}

输入示例:

2 2 10
7
A 11 1 1
A 4 1 0
A 20 0 0
P 1 0 1 1
A 1 0 1
A 6 1 0
P 0 1 1 0
0 0 0

两天来,我一直在寻找可能存在无效内存访问的地方,但我找不到或想不到任何地方。

此代码中可能导致运行时错误的行有哪些?

【问题讨论】:

  • 看在上帝的份上使用 typedefs
  • if (it->first.first>lin_max && it->first.second>col_max) 中断; //取消引用结束迭代器可能
  • 程序要计算什么?
  • 您确定遇到了段错误吗?我用你提供的输入测试了你的程序,我得到了这个:i.imgur.com/jLKskd2.png。在带有 gcc/g++ 4.8.1 的 ubuntu 12.04 lts 上运行。

标签: c++ dictionary runtime-error std-pair


【解决方案1】:

我看到您的代码有很多可能的改进,但没有出现运行时错误的原因。但是,在许多判断系统上,我看到内存限制显示为运行时错误,我相信您的代码也是如此。

提示:尝试使用谷歌搜索二叉索引树和嵌套二叉索引树。谷歌翻译在翻译声明时并不完美,但我相信这可能会引导您找到一个渐近更好的解决方案。

【讨论】:

  • 我测试了他的代码,没有遇到运行时错误。 i.imgur.com/jLKskd2.png。 150 和 420 的输出是否正确,我不知道,但仍然没有运行时错误。
【解决方案2】:

首先,请尽量在你的代码中使用typedef,以便于阅读。 其次,我在您的代码中没有看到任何错误,并且运行良好,根据给定输入输出 150,420。我在许多在线法官测试平台上运行它,并且没有运行时错误。 在 www.ideone.com 上试用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2018-11-08
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多