0

私は C の初心者です。練習用に非常に基本的な行列プログラムを作成しようとしていました。

マトリックスが機能する方法は、指定された数の行と列で作成され、十分なスロット (行 * 列スロット...) を持つ単一の 1 次元配列を呼び出します。次に、スロットにアクセスするmatrix_getcellには、セルを含むマトリックスで a を呼び出し、セルへのポインターを返します。

ここにmatrix.hがあります:

#ifndef MATRIX_H
#define MATRIX_H

#include <stdlib.h>
#include <stdio.h>

typedef unsigned int uint;

typedef struct matrix matrix;
struct matrix {
    uint rows;
    uint cols;
    double *data;
};

matrix *matrix_new(uint rows, uint cols) {
    matrix *n = malloc(sizeof(matrix));
    if (n == NULL) exit(1);

    n->data = calloc(rows * cols, sizeof(*(n->data)));
    if (n->data == NULL) exit(1);

    n->rows = rows;
    n->cols = cols;

    return n;
}

void matrix_del(matrix *m) {
    if (m == NULL) return;

    free(m->data);
    free(m);
}

double *matrix_getcell(matrix *m, uint row, uint col) {
    if (row >= m->rows) {
        fprintf(stderr, "Invalid row: %d\n", row);
        exit(1);
    }

    if (col >= m->cols) {
        fprintf(stderr, "Invalid col: %d\n", col);
        exit(1);
    }

    uint pos = (m->rows * row) + col;

    return &(m->data[pos]);
}

#endif

ここにmain.cがあります:

#include <stdio.h>

#include "matrix.h"

int main(int argc, char **argv) {
    matrix *m = matrix_new(3, 3);

            /* I know that a 3x3 will have 9 cells, so
             * fill them up with successive numbers
             */
    for (int i = 0; i < 9; i++) {
        m->data[i] = i;
    }

            /* Now, run through each cell, row by column
             * and print out the coords and the contents.
             */
    for (uint r = 0; r < 3; r++) {
        for (uint c = 0; c < 3; c++) {
            double *cur = matrix_getcell(m, r, c);
            printf("(%d, %d): %.3d\n", r, c, *cur);
        }
    }

    matrix_del(m);

    return 0;
}

私がこれでやろうとしたことは、各個別のセルを連続した数値に初期化することでした。これにより、2 回目に for ループを実行したときに、うまくいけば出力されます。

(0, 0): 0
(0, 1): 1
(0, 2): 2
(1, 0): 3
(1, 1): 4
(1, 2): 5
(2, 0): 6
(2, 1): 7
(2, 2): 8

しかし、代わりに、それは出力します

(0, 0): 0
(0, 1): 0
(0, 2): 0
(1, 0): 1
(1, 1): 1
(1, 2): 1
(2, 0): 2
(2, 1): 2
(2, 2): 2

間違った結果を返すかどうかをテストするコードを追加 (および削除) しましたmatric_getcell(そうではないようです)。データ型を変更し、キャストを試みました...他に何を試すべきかわかりません。

各列を同じ数値に設定しているように見えるのはなぜですか?

4

2 に答える 2

1

matrix_getcellセルの位置を計算するときに、メソッドにバグがあります。

double *matrix_getcell(matrix *m, uint row, uint col) {
    ...
    // Should be (m_cols * row) + col.
    uint pos = (m->rows * row) + col;

    return &(m->data[pos]);
}

double を印刷するときに別のバグがあります。double を印刷する%f代わりに使用する必要があります。%d

//                   v--- "%d" is the problem here
printf("(%d, %d): %.3d\n", r, c, *cur);
于 2013-09-01T05:12:45.980 に答える
0

あなたが必要

double **data;//data二次元行列として扱う

以下matrix_newを使用して行列を割り当てます

n->data = calloc(rows, sizeof(double*));
if (n->data == NULL) exit(1);    
for(int i = 0;i<rows;i++) {
    n->data[i] = calloc(cols, sizeof(double));
}

そして、メモリリークを避けるために、次を使用して解放します

void matrix_del(matrix *m) {
  if (m == NULL) return;

  uint r=m->rows;
  uint c=m->cols;

  for(int i = 0; i <r ; i++)
    free(m->data[i]);

   free(m);
}
于 2013-09-01T05:10:29.967 に答える