将malloc与结构一起使用

安德烈·塞尔迪克(Andrey Serdyuk)

我正在将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));
放松

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将malloc与函数中的结构一起使用

MATLAB:如何将cellfun与结构一起使用?

将bsearch与结构内的数组一起使用

将.NET结构与WINAPI函数一起使用

在c中,将if语句与结构项一起使用

将QDeclarativeContext层次结构与QDeclarativeView一起使用

将Spark UDF与结构序列一起使用

如何将XCTAssertNil与可选结构一起使用?

如何将结构与堆栈一起使用?

将STL函数与结构一起使用?

将结构体(字节)与SWIFT一起使用-结构体为NSData,而NSData为结构

如何将Pin结构与自引用结构一起使用?

如何将 atoi 与 int 和 malloc 一起使用?

我可以将malloc与引用一起使用而不是指针吗?

在C语言中将malloc与struct一起使用

为什么将Dagger与Android体系结构组件一起使用

将结构化数组转换为numpy数组以与Scikit-Learn一起使用

将std :: atomic与具有POD的结构一起使用是可以的吗?

这是将MVVM结构与ViewModel和RecyclerView一起使用的正确方法吗?

将jquery-ui与具有特定文件结构的webpack一起使用

我可以将QAbstractListModel与QTreeView(层次结构)一起使用吗?

如何将枚举与分组和子分组层次结构/嵌套一起使用

可以将offsetof与从decltype获得的结构类型一起使用吗?

将ROW()与结构化引用一起使用,以按条件返回所选记录的列表

将 OpenGL VBO 与自定义类/数据结构一起使用

如何将numpy.savetxt与包含数组的结构化数组一起使用

如何将Numba“ @vectorize” ufunc与结构化的Numpy数组一起使用?

如何将unordered_set与自定义结构一起使用?

如何将完整的SQL与Spark结构化流一起使用