Использование файлов библиотеки разреженных матриц в C - PullRequest
1 голос
/ 15 июня 2011

Я работаю над масштабным проектом, в котором я разрабатываю векторное приложение с разреженной матрицей, но все еще работаю над пониманием кода. Я начинаю с создания основы для приложения, но столкнулся с ошибкой сегментации при выполнении программы. Я отследил проблему с этим циклом в функции MatrixRead и прилагаю приведенный ниже код. Когда программа выполняется, я пытался запрограммировать несколько тестовых сообщений, и программа, кажется, выполняет все циклы, но в конце возвращает ошибку сегментации. Конечно, это всего лишь домыслы. Любая помощь будет потрясающей. Спасибо!

    while (ret != EOF && row <= mat->rows) 
       {    
          if (row != curr_row) // Won't execute for first iteration
              {

                  /* store this row */

                 MatrixSetRow(mat, curr_row, len, ind, val);

                     /* check if the previous row is zero  */

                     i = 1;
                     while(row != curr_row + i)
                     { 
                         mat->lens[curr_row+i-1] = 0;
                         mat->inds[curr_row+i-1] = 0;
                         mat->vals[curr_row+i-1] = 0;  
                         i++;
                     }
                     curr_row = row;

                     /* reset row pointer */

                     len = 0;
               }

         ind[len] = col;
         val[len] = value;
         len++;

         ret = fscanf(file, "%lf %lf %lf", &r1, &c1, &value);

         col = (int) (c1);
         row = (int) (r1);
      }

/* Store the final row */
    if (ret == EOF || row > mat->rows)
    MatrixSetRow(mat, mat->rows, len, ind, val);

Вот код для функции MatrixSetRow:

    /*--------------------------------------------------------------------------
     * MatrixSetRow - Set a row in a matrix.  Only local rows can be set.
     * Once a row has been set, it should not be set again, or else the 
     * memory used by the existing row will not be recovered until 
     * the matrix is destroyed.  "row" is in global coordinate numbering.
     *--------------------------------------------------------------------------*/

    void MatrixSetRow(Matrix *mat, int row, int len, int *ind, double *val)
    {
        row -= 1;

        mat->lens[row] = len;
        mat->inds[row] = (int *) MemAlloc(mat->mem, len*sizeof(int));
        mat->vals[row] = (double *) MemAlloc(mat->mem, len*sizeof(double));

        if (ind != NULL)
            memcpy(mat->inds[row], ind, len*sizeof(int));

        if (val != NULL)
            memcpy(mat->vals[row], val, len*sizeof(double));
    }

Я также включил код для файла Matrix.h, который шел вместе с ним, где определены члены Matrix:

    #include <stdio.h>
    #include "Common.h"
    #include "Mem.h"

    #ifndef _MATRIX_H
    #define _MATRIX_H

    typedef struct
    {

        int      rows;
        int      columns;

        Mem     *mem;

        int     *lens;
        int    **inds;
        double **vals;

    }
    Matrix;
...