c语言 - 为什么我不能将函数返回分配给矩阵元素?



好的,所以我需要输入一个由n个元素组成的矩阵,并用最接近的素数替换每个复数。我制作了一些函数来读取矩阵,显示矩阵,判断一个数字是否为素数,以及找到与一个数字最接近的素数,这些函数都有效。

这是我所做的,问题是更换不起作用,我得到了错误:Process terminated with status -1073741510 (0 minute(s), 18 second(s))

#include <stdio.h>
#include <stdlib.h>
int n;
int readMatrix(int **matrix)
{
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("matrix[%d][%d]=", i, j);
scanf("%d", &matrix[i][j]);
}
}
return matrix;
}
void showMatrix(int **matrix)
{
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("%d ", matrix[i][j]);
}
printf("n");
}
}
int prime(int a)
{
int c = 0;
for (int i=1; i<a; i++) {
if (a % i == 0) {
c++;
}
}
if (c == 1) {
return 1;
} else return 0;
}
int nearPrime(int b)
{
int lp, bp, ok = 0, p;
lp = b - 1;
bp = b + 1;
while (ok != 1) {
if (prime(lp) == 1) {
ok = 1; break;
}
lp--;
}
ok = 0;
while (ok != 1) {
if (prime(bp) == 1) {
ok = 1; break;
}
bp++;
}
if ((b-lp) < (bp-b)) {
p = lp;
} else p = bp;
return p;
}
int main()
{
int **matrix, aux;
printf("n=");
scanf("%d", &n);
matrix = malloc(n*sizeof(int *));
if (matrix == NULL) exit(1);
for (int i=0; i<n; i++) {
matrix[i] = malloc(n*sizeof(int));
if (matrix[i] == NULL) exit(1);
}
readMatrix(matrix);
showMatrix(matrix);
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
if (prime(matrix[i][j]) == 0 && matrix[i][j] != 1) {
matrix[i][j] = nearPrime(matrix[i][j]);
}
}
}
showMatrix(matrix);
for (int i=0; i<n; i++) free(matrix[i]);
free(matrix);
return 0;
}

你能告诉我为什么它不起作用吗?

更新

我想我已经解决了。在检查矩阵数是否为素数时,我还添加了一个条件,即它需要与1不同,因为程序在检查1是否为素数的时候会return 0,而它需要return 1,因为1实际上是素数。

感谢所有的提示!

我想我可能在您的代码中发现了这个问题。问题出在nearPrime函数上。它将适用于作为参数的大多数数字,但如果您为此函数输入数字1,则情况并非如此。想想如果它真的接受了数字1会发生什么。

那么,你的变量lp=(1-1)=0。当您进一步将其输入到素数函数中时,由于它的实现方式,它不会返回1。然后,如果没有找到素数,你就继续减少这个数字,因为这个数字现在是负数,它甚至永远不会进入素数函数的for循环,然后素数函数总是返回0。因此,您将在while(ok!=1)循环中停留很长一段时间,这就是流程终止的原因。要解决此问题,请确保检查lp!=0,然后继续进入循环。由于您也在检查最近的素数,因此在返回值之前还需要检查lp是否为0。简而言之,对代码进行以下更改。

int nearPrime(int b)
{
int lp, bp, ok = 0, p;
lp = b - 1;
bp = b + 1;
if (lp != 0)
{
while (ok != 1) {
if (prime(lp) == 1) {
ok = 1; break;
}
lp--;
}
}
ok = 0;
while (ok != 1) {
if (prime(bp) == 1) {
ok = 1; break;
}
bp++;
}
if (((b - lp) < (bp - b)) && lp != 0) {
p = lp;
}
else p = bp;
return p;
}

还有一件事:您的readMatrix函数似乎期望返回类型为int,但您正在返回类型为int**的参数矩阵。此外,在您的主代码中,您实际上并没有对返回值执行任何操作,因此可能会将readMatrix函数的返回类型更改为void(当然也不要返回matrix)。

最新更新