【问题标题】:matrix rotation segmentation fault矩阵旋转分割错误
【发布时间】:2016-01-17 22:28:20
【问题描述】:

为hackerrank中的矩阵旋转问题编写代码。我遇到分段错误。代码不完整。我已经评论了我认为造成问题但无法识别错误的陈述。请帮忙。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct coord
    {
    int i,j;
    } starting, current;

struct reference
    {
    float i,j;
    } center;

int **a,m,n,t1,t2;    
int goup()
    {
    float dist,dist2;
    dist=sqrt((center.i-current.i)*(center.i-current.i)+(center.j-current.j)*(center.j-current.j));
    do
        {
        t1=a[current.i-1][current.j];
        a[current.i-1][current.j]=t2;//segmentation fault at this statement
        t2=t1;
        current.i--;
        dist=sqrt((center.i-current.i)*(center.i-current.i)+(center.j-current.j)*(center.j-current.j));

        } while(dist2!=dist);
    return 0;
    }

int main()
    {
    int t;
    cin>>m>>n>>t;
    a=new int*[m];
    for(int i=0;i<m;i++)
        a[i]=new int[n];

    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            cin>>a[i][j];

    center.i=(float)(m-1)/2.0;
    center.j=(float)(n-1)/2.0;
    starting.i = center.i + (0.5)*(m%2+1);
    starting.j = center.j + (0.5)*(n%2+1);
    current.i=starting.i;
    current.j=starting.j;
    t2=a[starting.i][starting.j];
    t1=a[starting.i-1][starting.j];

    while(current.i!=m)
        {
        for(int i=0;i<t;i++)
            {
            goup();
            // goleft();
            // godowm();
            // goright();
            }
        starting.i++;
        starting.j++;
        current.i=starting.i;
        current.j=starting.j;
        }

    return 0;
    }

【问题讨论】:

  • 变量'dist2'代表什么?你没有初始化它(公平地说,你永远不会改变它的值,所以循环运行的时间比预期的要长,并且崩溃),所以它会有一个随机值。您是否尝试过在附加调试器的情况下运行代码?

标签: c++ pointers segmentation-fault


【解决方案1】:

由于 dist2 从未初始化,dist2!=dist 很少为真,并且您将 current.i 递减很多次,以至于您最终访问数组外部并取消引用可能存在的任何随机数。

不可能说出如何修复它,因为您没有留下任何关于该功能应该完成什么的线索。
使用您希望它具有的任何值初始化dist2 将是一个好的开始,但条件仍然不太可能为真。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多