如何调试为什么编译器在我的C ++程序上崩溃?

时间:2018-11-26 23:11:59

标签: c++ arrays

代码1:应该采用一个矩阵(m×n)的大小,然后在每一行中找到最小值。不显示任何错误,可以运行,但是编译器的黑屏(devc ++)根本不执行任何操作而崩溃,并且返回值高得离谱(准确地说是3221225725)。

我不确定如何修复或改进它,当矩阵的大小恒定时它也可以工作,比如用cin代替cin来获得大小,那么简单的数字就可以使它工作。我不知道为什么;我是编程新手。

#include <iostream>

#include <stdlib.h>

using namespace std;

int main()

{
    int m,n;

    int B[m][n];

    int A[m+1][n+1] = {0};

    cin>>m;

    cin>>n;

    for (int x = 0; x < m; ++x)
    {
        for (int y = 0; y < n; ++y)
        {
        cout<< "Enter in value for row " << x << ", column " << y << ".\n";

        cin>>  A[x][y];
        }
    }

    cout << "Input:" <<endl;

    for (int x = 0; x < m; ++x)
    {
        for (int y = 0; y < n; ++y)
        {
        cout<< A[x][y] << "\t";
        }
        cout << "\n";
    }

    for (int x = 0; x < m; ++x)
    {
        for (int y = 0; y < n; ++y)
        {
            A[x][4] = A[x][1];

            if (A[x][4] > A[x][y])

                A[x][4] = A[x][y];
        }
    }

    cout <<"Output:"<<endl;

    for (int x = 0; x < m+1; ++x)
    {
        for (int y = 0; y < n+1; ++y)
        {
        cout << A[x][y] << "\t";
        }
        cout<<"\n";
    }

    getchar ();

    return 0;
}

这是代码2:

#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
    int i,j,R,C,Too;
    double a[i][j];
    float f;
    Too=0;
    cin>>R;
    cin>>C;
    for (int i=0; i<R; i++)
        for (int j=0; j<C; j++)
        {
            f=i+j/2;
            a[i][j]=sin(f);
            if (a[i][j]>0)
            {
                Too=Too+1;

            }
        cout << "a[" << i << "][" << j << "]: ";
        cout << a[i][j]<< endl;
        }
    cout<<Too<<" Shirheg eyreg element bn"<<endl;

}

该矩阵中的元素由公式f = i + j / 2生成; a [i] [j] = sin(f); 并简单地输出其中有多少个积极因素。由于某些奇怪的原因,元素总是两倍,就像输出是这样的: 0 0 0.841471 0.841471 然后另一个数字加倍,然后一个数字再加倍。 如何解决?

1 个答案:

答案 0 :(得分:0)

奇怪的返回值和在C ++中工作时崩溃通常是未初始化值的标志。例如,考虑以下内容:

int main() {
 int m,n; // <-- declare 'm' and 'n', but we don't initialize them to have a value
 int B[m][n]; // <-- use the values in 'm' and 'n' to allocate memory for 'B'
 ...
 cin >> m; // <-- only now are you setting m to a value, but you already used it.
 cin >> n; // <-- same thing with n.
 ...
}

上面的代码是错误的,因为它使用由'm'和'n'标识的变量,然后才将它们设置为具有特定值,因此,在您使用cin设置它们的值之前,它们恰好具有任何值在创建它们时坐在内存中。

为它们分配值称为“初始化”或在您初次执行时对其进行初始化。在此之前,他们只是从内存中保存该值。

最终,每一行代码都使用一些变量,并且可能正在分配其他变量。因此,在到达该行代码之前,请确保已使用的每个变量都已初始化。

您必须调试自己的代码才能有效学习,以上示例不是此处的唯一错误或问题,而是一些可以帮助您的基本技巧:

  • 总是注意使用未初始化的值(例如m和n)
  • 如果有意义,请在创建值后立即对其进行初始化
  • 将i和j和k作为变量名通常仅在循环中声明,因为您通常只需要它们在循环中存在。
  • 如果在函数中声明int i,则不应在该函数的循环中声明int i。我现在两个人的意思不同,这令人困惑。
  • <<>>运算符周围放置空格。它将使代码更易于阅读。
  • 如果遇到问题,请尝试使用cout打印出变量的值,看是否有意义。如果没有,那么程序中的那一点之前就存在问题。
  • 如果遇到问题,请尝试一次处理代码的一部分,直到其行为符合您的期望为止。