我正在使用makefile,在编译以下代码时,随机选项可以完美运行,但是在使用键盘输入矩阵的选项中Segmentation fault (core dumped)
会显示这个,你能告诉我为什么会显示这个或者代码有什么问题吗?
输入数组 ( user(b, N, P);
) 后出现错误。我认为错误出在函数中printm(b, N, P);
。
函数.h
#ifndef function_H
#define function_H
int user(int **m, int N, int P);
void printm(int **m, int N, int P);
int generator(int **m, int N, int P);
void lmax(int **m, int N, int P);
#endif
函数.cc
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "function.h"
using namespace std;
int user(int **m, int N, int P)
{
for (int i=0; i<N; i++)
{
for (int j=0; j<P; j++)
{
cin >> m[i][j];
}
}
return 0;
}
void printm(int **m, int N, int P)
{
int i;
for (i=0; i<N; i++);
{
for (int j=0; j<P; j++)
{
cout << " " << m[i][j] << " ";
}
cout << endl;
}
}
int generator(int **m, int N, int P)
{
srand(time(NULL));
for (int i=0; i<N; i++)
{
for (int j=0; j<P; j++)
{
m[i][j] = rand()%50-0;
cout << " " << m[i][j] << "\t";
}
cout << endl;
}
cout << endl;
return 0;
}
void lmax(int **m, int N, int P)
{
int j_max;
for (int i=0; i<N; i++)
{
j_max = 0;
for (int j=1; j<P; j++)
if (m[i][j_max] < m[i][j])
{
j_max = j;
}
m[i][j_max] = 0;
}
for (int i=0; i<N; i++) {
for (int j=0; j<P; j++) {
cout << " " << m[i][j] << "\t"; }
cout << endl; }
cout << endl;
bool kl = true;
for (int i=1; i<N; i++)
{
for (int j=0; j<i; j++)
{
if (m[i][j] != m[j][i])
kl = false;
}
}
if (kl)
{
cout << " Symetric matrix." << endl;
}
else
{
cout << " Not symetric matrix." << endl;
}
cout << endl;
}
测试.cc
#include <stdio.h>
#include <iostream>
#include "function.h"
using namespace std;
int main()
{
int N, P, **a, **b;
char ch;
cout << "\n 1 - Initialize matrix by using a random number generator." << endl;
cout << " 2 - Initialize matrix via user input." << endl;
cout << " 0 - Exit." << endl;
cout << "\n Your choice: ";
do {
ch = getchar();
switch(ch)
{
case '1':
cout << "\n Rows: ";
cin >> N;
cout << " Columns: ";
cin >> P; cout << endl;
a = new int *[N];
for (int i=0; i<N; i++)
{
a[i] = new int [P];
}
generator(a, N, P);
lmax(a, N, P);
return 0;
case '2':
cout << "\n Rows: ";
cin >> N;
cout << " Columns: ";
cin >> P; cout << endl;
b = new int *[N];
for (int i=0; i<N; i++)
{
b[i] = new int [P];
}
user(b, N, P);
printm(b, N, P);
lmax(b, N, P);
return 0;
}
}
while(ch != '0');
return 0;
}
在这个答案中,我将假设实际要求是使用动态内存。如果没有,您应该考虑使用数组重写程序或将动态内存使用情况封装在一个类中(如果您不违反任何经验法则)。
重复代码通常是错误的好朋友,因为当您需要进行更改时,要么在重复的所有地方进行完全相同的更改,否则程序将开始导致问题。
让我们进行一些重构,看看是否能得到更易读的代码。
您的程序处理数组。除非它是实践的明确要求,否则理想的情况是所有关于矩阵的信息总是一起传播:
现在我们不打算使用构造函数使示例复杂化。
问题是,在您的练习中,您在两个不同的地方创建数组。因此,拥有允许创建矩阵的机制的想法很有趣。一个功能完全符合我们的需求
当然,我们不能考虑在程序中保留内存而不稍后清理它......我们必须创建另一个函数来释放保留的内存:
您复制的另一个元素是填充数组的函数。在您的特定情况下,您可以使用单个函数来执行此操作,因为唯一的区别在于数据源(标准输入或随机生成器)。
您的错误就在这部分代码中。仔细比较这两个函数:
尽管做了完全相同的事情,但它们看起来完全不同......最重要的是,在第一个循环内
return
的函数中找到 a 是惊人的(你的错误)。user
如何简化?有多种选择。这里有一些想法:
一种选择是,由于在您的练习中循环遍历数组通常是一个重复的事情,您可以将该循环封装在一个函数中并在每次迭代时执行“某事”:
它们还可用于
lambdas
使代码更具可读性:好吧,现在只需要打印矩阵:
另一种选择,使用更简单、更谦虚但也更严格的代码,可能是拥有一个
RellenarMatriz
接收 a的函数(如果你想更灵活,bool
甚至可以接收 a )。enum
根据该变量的值,它将采用一个数据输入或另一个:以类似的方式,您可以在输入值之前采取行动,如果您看到自己充满活力
fila
,columna
我将其留给您练习。你提到的分段错误
lmax
我没有看到任何痕迹,但......一切顺利。
这些是有错误的功能。他们已经被纠正了。
您在函数中有一个错误的返回,
user
并且在函数;
的第一个循环中有一个错误的返回printm