C - 使用结构指针作为参数在函数内分配结构

标签 c arrays pointers struct ruby-c-extension

我正在使用 Ruby C API。我需要从一个函数中创建一个结构,但我认为我犯了一些分配错误。这是我的代码

#include <stdio.h>
#include <ruby.h>
#include <ruby/thread.h>

typedef struct {
    double *matrix;
    int nrows;
    int ncols;
}Matrix;


void createMatrix(VALUE matrix, Matrix *mat) {
    printf("In\n");
    mat->nrows = RARRAY_LEN(matrix);
    VALUE firstElement = rb_ary_entry(matrix, 0);
    mat->ncols = RARRAY_LEN(firstElement);
    printf("Matrix shape: (%d,%d)\n", mat->nrows, mat->ncols);
    int i,j;

    double *tempMat = (double *)malloc(mat->nrows * mat->ncols * sizeof(double));

    printf("Allocated\n");
    VALUE row;
    for (i=0; i<mat->nrows; i++)
    {
        row = rb_ary_entry(matrix, i);
        for (j=0; j<mat->ncols; j++)
        {
            tempMat[i * mat->ncols + j] = NUM2DBL(rb_ary_entry(row, j));
//          printf("Matrix A Element(%d,%d)=%f\n", i, j, matA[i * colsA + j]);
        }
    }
    mat->matrix = tempMat;
    for (i=0; i<mat->nrows; i++)
        {
            for (j=0; j<mat->ncols; j++)
            {
                printf("Matrix temp Element(%d,%d)=%f\n", i, j, mat->matrix[i * mat->ncols + j]);
            }
        }

    printf("Assigned\n");
    return;
}


VALUE matmat_mul(VALUE self, VALUE matrixA, VALUE matrixB)
{
    int i,j;

    Matrix *matA;
    createMatrix(matrixA, matA);

    Matrix *matB;
    createMatrix(matrixB, matB);

    return Qnil;
}

void Init_la_ruby_ext()
{
    VALUE rg = rb_define_module("RG");
    VALUE linalg = rb_define_module_under(rg, "LinearAlgebra");
    VALUE operation = rb_define_class_under(linalg, "Operation", rb_cObject);
    rb_define_method(operation, "matmat_mul", matmat_mul, 2);
}

extconf.rb 文件是

require 'mkmf'
extension_name = 'la_ruby_ext'
create_makefile(extension_name)

你可以运行测试

require './la_ruby_ext'
rows = 3
cols = 3
mat = Array.new(rows){Array.new(cols)}
mat[0] = [0.0, 1.0, 2.0]
mat[1] = [3.0, 4.0, 5.0]
mat[2] = [6.0, 7.0, 8.0]
operation = RG::LinearAlgebra::Operation.new 
matC = operation.matmat_mul(mat, mat.transpose)

正如您从运行测试中看到的那样,代码在我第二次调用函数 createMatrix 时给出了段错误。这是我的理解:

  1. 我首先创建一个指向 struct Matrix 的指针>
  2. 然后我将这个指针作为参数传递给 createMatrix
  3. 我分配一个指向二维数组的指针
  4. 创建二维数组
  5. 我将指针分配给 matrix-> nmatrix

有什么想法吗?这是执行此操作的正确方法吗?

最佳答案

给定定义void createMatrix(VALUE xxx, Matrix *mat)和使用mat->nrows = …等函数内部,调用createMatrix()matmul_mul()是错误的。

你有:

VALUE matmat_mul(VALUE self, VALUE matrixA, VALUE matrixB)
{
    int i,j;

    Matrix *matA;
    createMatrix(matrixA, matA);

    Matrix *matB;
    createMatrix(matrixB, matB);

你需要:

VALUE matmat_mul(VALUE self, VALUE matrixA, VALUE matrixB)
{
    int i,j;

    Matrix matA;
    createMatrix(matrixA, &matA);

    Matrix matB;
    createMatrix(matrixB, &matB);

在当前代码中,您将未初始化的指针传递给 createMatrix()然后分配给指针指向的“随机”内存。这很少会带来幸福。在修改后的代码中,你有一对 Matrix值,然后将指向这些值的指针传递给 createMatrix()函数,然后为您填写详细信息。

关于C - 使用结构指针作为参数在函数内分配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37153255/

相关文章:

c - 如何找到错误所在

ios - 无法将数组名称传递到 Swift 3 中的 TableView

javascript - 从数组中删除最小值,但如果重复只删除一次

c - 在 C 中获取未定义或实现定义行为的无效指针的值?

c - in_addr_t inet_ntoa 等类型的地址是什么

c - 高效的 SSE FP `floor()`/`ceil()`/`round()` 没有 SSE4.1 的舍入函数?

c - 为什么在将 calloc 与 unsigned int 一起使用时 coverity 会提示

c++ - 类递归数组

C语言逐字节复制指针的内容无限循环

c++ - 为什么不能 static_cast 双空指针?