我正在使用带有结构的malloc,但得到一些错误,例如
错误1 错误 C2440:"正在初始化":无法从"void *"转换为"my_vector *" c:\lab3\lab3\linalg.cpp 19 lab3
我正在制作MPI应用程序并设置所有需要的设置。我尝试了一些解决方案,但没有帮助。
利纳尔格.cpp
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <mpi.h>
#include "linalg.h"
void fatal_error(const char *message, int errorcode)
{
printf("fatal error: code %d, %sn", errorcode, message);
fflush(stdout);
MPI_Abort(MPI_COMM_WORLD, errorcode);
}
struct my_vector *vector_alloc(int size, double initial)
{
struct my_vector *result = malloc(sizeof(struct my_vector) +
(size-1) * sizeof(double));
result->size = size;
for(int i = 0; i < size; i++)
{
result->data[i] = initial;
}
return result;
}
void vector_print(FILE *f, struct my_vector *vec)
{
for(int i = 0; i < vec->size; i++)
{
fprintf(f, "%.15lf ", vec->data[i]);
}
fprintf(f, "n");
}
struct my_matrix *matrix_alloc(int rows, int cols, double initial)
{
struct my_matrix *result = malloc(sizeof(struct my_matrix) +
(rows * cols - 1) * sizeof(double));
result->rows = rows;
result->cols = cols;
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
result->data[i * cols + j] = initial;
}
}
return result;
}
void matrix_print(FILE *f, struct my_matrix *mat)
{
for(int i = 0; i < mat->rows; i++)
{
for(int j = 0; j < mat->cols; j++)
{
fprintf(f, "%lf ", mat->data[i * mat->cols + j]);
}
fprintf(f, "n");
}
}
struct my_matrix *read_matrix(const char *filename)
{
FILE *mat_file = fopen(filename, "r");
if(mat_file == NULL)
{
fatal_error("can't open matrix file", 1);
}
int rows;
int cols;
fscanf(mat_file, "%d %d", &rows, &cols);
struct my_matrix *result = matrix_alloc(rows, cols, 0.0);
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
fscanf(mat_file, "%lf", &result->data[i * cols + j]);
}
}
fclose(mat_file);
return result;
}
struct my_vector *read_vector(const char *filename)
{
FILE *vec_file = fopen(filename, "r");
if(vec_file == NULL)
{
fatal_error("can't open vector file", 1);
}
int size;
fscanf(vec_file, "%d", &size);
struct my_vector *result = vector_alloc(size, 0.0);
for(int i = 0; i < size; i++)
{
fscanf(vec_file, "%lf", &result->data[i]);
}
fclose(vec_file);
return result;
}
void write_vector(const char *filename, struct my_vector *vec)
{
FILE *vec_file = fopen(filename, "w");
if(vec_file == NULL)
{
fatal_error("can't open vector file", 1);
}
vector_print(vec_file, vec);
fclose(vec_file);
}
我在这个地方有问题
struct my_vector *result = malloc(sizeof(struct my_vector) +
(size-1) * sizeof(double));
您的代码可能正在使用C++编译器进行编译。您的代码被命名为".cpp"这一事实也很能说明问题,这是C++的典型扩展。
在C++中,如果没有强制转换,则无法从void *
转换为其他指针:
my_vector *result = (my_vector *) malloc(...);
但是您可以删除struct
,因为这隐含在C++中。另外,在C++中,您应该使用new
:
my_vector *result = new my_vector[...];
这消除了投掷的需要。
如您所见,C 和 C++ 并不相同。如果你想用C编程,你需要一个C编译器。
malloc
返回void *
。在C++中,必须将其强制转换为适当的指针类型:
struct my_vector *result = (struct my_vector *)malloc(...)
struct my_matrix *result = malloc(sizeof(struct my_matrix) +
(rows * cols - 1) * sizeof(double));
在C++中,没有从 void *
到其他指针类型的隐式转换,因此您必须强制转换 malloc
返回的值。 请注意,您可能应该改用new[]
。
此行表明您打算在 struct my_matrix
内超出数组的边界写入。这将导致未定义的行为。 可以将 MPI 结构设计为不使用这种所谓的"结构黑客"。 有关可以从中对设计进行建模的一些示例,请查看开源 MPI 库的标头。
铌。我看到您将这篇文章标记为"C"和"C++"。请决定您使用哪种语言。尝试编写两种不同语言之间源代码兼容的代码是一个糟糕的主意。标头,是的,函数实现,否。
代码看起来像一个合法的C,所以它将使用C编译器进行编译。但是,它不会在C++。C++具有更强的类型检查规则。但是,将 malloc 的结果(void*
)转换为适当的指针类型应该有效。
您正在将 C 代码编译为C++代码。在C++中,你需要一个针对你的具体情况的强制转换(参见其他答案的例子),而在 C 中你不需要它。
重命名您的文件,使它们具有*.c
扩展名,并且应该可以工作。