【发布时间】:2014-04-07 09:33:58
【问题描述】:
我在结构中使用 malloc,但遇到一些错误,例如
错误 1 错误 C2440: 'initializing' : cannot convert from 'void *' to 'my_vector *' c:\lab3\lab3\linalg.cpp 19 lab3
我正在制作 MPI 应用程序并设置所有需要的设置。 我尝试了一些解决方案,但没有帮助。
linalg.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, %s\n", 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++ 编译器编译 C 代码?
-
@lethal-guitar 他可能是这样。许多 C/C++(统一)编译器根据扩展决定使用哪种语言。所以代码编译为C++
-
这看起来很像 Visual Studio 错误代码。该编译器确实是一个 C++ 编译器,即使我将其设置为编译为 C 代码并且文件具有 .c 扩展名,我似乎仍然会收到该错误。
-
我尝试过像 C 和 C++ 一样,但是当我选择 C 编译器时,我认为我有很多与 c99 相关的错误。
-
是的,Visual Studio(至少在我使用的版本:2010 之前)不支持 C99。