对于我的作业,我必须使用MPI的共轭梯度程序测试几个大型矩阵(参见下面的代码)。我从我的书中复制了程序,它应该编译,但我得到了错误:
在功能'main'中:
37:警告:传递read_replicated_vector的参数1使得指针来自整数而没有强制转换
37:警告:传递read_replicated_vector的参数2使得整数指针没有强制转换
37:警告:传递read_replicated_vector的参数3使得没有强制转换的指针产生整数
37:警告:从不兼容的指针类型
传递read_replicated_vector的参数437:错误:无法忽略空值,因为它应该是
44:警告:传递print_replicated_vector的参数1使得整数指针没有强制转换
44:警告:传递print_replicated_vector的参数3使得没有强制转换的指针产生整数
44:错误:函数print_replicated_vector
的参数太多
#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
#include "MyMPI.h"
main (int argc, char *argv[])
{
double **a; /* Solving Ax = b for x */
double *astorage; /* Holds elements of A */
double *b; /* Constant vector */
double *x; /* Solution vector */
int p; /* MPI Processes */
int id; /* Process rank */
int m; /* Rows in A */
int n; /* Columns in A */
int n1; /* Elements in b */
/* Initialize a and b so that solution is x[i] = i */
MPI_Init (&argc, &argv);
MPI_Comm_size (MPI_COMM_WORLD, &p);
MPI_Comm_rank (MPI_COMM_WORLD, &id);
read_block_row_matrix (id, p, argv[1], (void *) &a,
(void *) &astorage, MPI_DOUBLE, &m, &n);
n1 = read_replicated_vector (id, p, argv[2], (void **) &b, MPI_DOUBLE);
if ((m != n) || (n != n1))
{
if (!id)
printf ("Incompatible dimensions (%d x %d) x (%d)\n", m, n, n1);
}
else {
x = (double *) malloc (n * sizeof(double));
cg (p, id, a, b, x, n);
print_replicated_vector (id, p, x, MPI_DOUBLE, n); // here
}
MPI_Finalize();
}
id
和p
不是指针,所以我认为我需要在调用MPI_Comm_size
和MPI_Comm_rank
时通过引用传递它们,尽管我尝试过这样做。
修改
//输入函数
void read_replicated_vector (
char *s, /* IN - File name */
void **v, /* OUT - Vector */
MPI_Datatype dtype, /* IN - Vector type */
int *n, /* OUT - Vector length */
MPI_Comm comm) /* IN - Communicator */
{
int datum_size; /* Bytes per vector element */
int i;
int id; /* Process rank */
FILE *infileptr; /* Input file pointer */
int p; /* Number of processes */
MPI_Comm_rank (comm, &id);
MPI_Comm_size (comm, &p);
datum_size = get_size (dtype);
if (id == (p-1))
{
infileptr = fopen (s, "r");
if (infileptr == NULL) *n = 0;
else fread (n, sizeof(int), 1, infileptr);
}
MPI_Bcast (n, 1, MPI_INT, p-1, MPI_COMM_WORLD);
if (! *n) terminate (id, "Cannot open vector file");
*v = my_malloc (id, *n * datum_size);
if (id == (p-1))
{
fread (*v, datum_size, *n, infileptr);
fclose (infileptr);
}
MPI_Bcast (*v, *n, dtype, p-1, MPI_COMM_WORLD);
}
//输出函数
void print_replicated_vector (
void *v, /* IN - Address of vector */
MPI_Datatype dtype, /* IN - Vector element type */
int n, /* IN - Elements in vector */
MPI_Comm comm) /* IN - Communicator */
{
int id; /* Process rank */
MPI_Comm_rank (comm, &id);
if (!id)
{
print_subvector (v, dtype, n);
printf ("\n\n");
}
}
答案 0 :(得分:1)
您的警告是因为您正在调用该功能
void print_replicated_vector (void *, MPI_Datatype, int, MPI_Comm);
第一个参数类型为int
:
print_replicated_vector (id, p, x, MPI_DOUBLE, n); // here
C代码有时会在int
中存储一个指针,这就是编译器假设你要做的事情,它正在进行适当的类型转换(但警告你)。但为了使代码更正,你必须使类型匹配。即使用&id
传递指向id的指针或任何适当的参数(我不知道print_replicated_vector
做了什么或者你想要它做什么)。