Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-使用结构指针作为参数在函数中分配结构_C_Arrays_Pointers_Struct_Ruby C Extension - Fatal编程技术网

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

C-使用结构指针作为参数在函数中分配结构,c,arrays,pointers,struct,ruby-c-extension,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 *

我正在使用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);
}
您可以使用

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
时,代码给出了分段错误。这是我的理解:

  • 我首先创建一个指向结构矩阵的指针
  • 然后,我将此指针作为参数传递给
    createMatrix
  • 我分配一个指向2D数组的指针
  • 创建二维阵列
  • 我将指针指定给矩阵->nmatrix

  • 有什么想法吗?这是正确的方法吗?

    鉴于定义
    void createMatrix(值xxx,Matrix*mat)
    以及在函数内部使用
    mat->nrows=…
    等,在
    matmul\u mul()
    中调用
    createMatrix()
    是错误的

    你有:

    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()
    函数,然后该函数为您填写详细信息

    VALUE matmat_mul(VALUE self, VALUE matrixA, VALUE matrixB)
    {
        int i,j;
    
        Matrix matA;
        createMatrix(matrixA, &matA);
    
        Matrix matB;
        createMatrix(matrixB, &matB);