使用malloc结构

时间:2014-03-05 11:02:00

标签: c++ c struct malloc mpi

我正在使用带结构的malloc,但是会出现一些错误,比如

  

错误1错误C2440:'初始化':无法从'void *'转换为'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));

5 个答案:

答案 0 :(得分:6)

您的代码可能正在使用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编译器。

答案 1 :(得分:4)

malloc返回void *。在C ++中,您必须将其强制转换为适当的指针类型:

struct my_vector *result = (struct my_vector *)malloc(...)

答案 2 :(得分:1)

struct my_matrix *result = malloc(sizeof(struct my_matrix) + 
                                (rows * cols - 1) * sizeof(double));

在C ++中,没有从void *到其他指针类型的隐式转换,因此您必须转换malloc返回的值。请注意,您可能应该使用new[]

这一行表明您打算在struct my_matrix内写出超出数组范围的内容。这会导致未定义的行为。可以将MPI结构设计为不使用这种所谓的“struct hack”。有关可以对设计进行建模的一些示例,请查看开源MPI库的标题。

NB。我看到你把这篇文章标记为“C”和“C ++”。请确定您使用的语言。尝试编写两种不同语言之间源代码兼容的代码是一个糟糕的主意。标题,是的,功能实现,没有。

答案 3 :(得分:0)

代码看起来像一个合法的C,因此它将使用C编译器进行编译。但是,它不会在C ++中。 C ++有一个更强大的类型检查规则。然而,将malloc的结果(void*)转换为适当的指针类型应该可行。

答案 4 :(得分:0)

您正在将C代码编译为C ++代码。在C ++中,您需要针对您的特定情况进行演员表(请参阅示例的其他答案),而您在C中不需要它。

重命名您的文件,使其具有*.c个扩展名,并且应该可以正常使用。