0

私の個人的な娯楽のために、私は C を学んでいます。行列計算ヘッダーを書こうとしています。マトリックス全体を表示する関数 rmat_show(rmatrix *r) があります。しかし、私のデータ型 rmatrix がこの関数にうまく渡されていないようです。

rmat.h:

// Matrix struct, m x n matrix. Pointer *value points to the contents.
struct srmatrix {
    int m,n;
    float *value;
};

typedef struct srmatrix rmatrix;

// Show the matrix
void rmat_show(rmatrix* r) {
    int i, j;
    printf("\nshow\n");
    printf("[%dx%d]\n",r->m,r->n);
    for (i = 0; i < r->m; i++) {
        for (j = 0; j < r->m; j++) {
            printf("%d\t",value[(j-1)*r->m+i-1]);
        }
        printf("\n");
    }
}

そして、これをメインファイルとして持っています:

#include "rmat.h"

int main(int argc, char **argv){
    float val[] = {0.1};
    rmatrix *r = malloc(sizeof(rmatrix));
    r->n = 1;
    r->m = 1;
    r->value = val;
    rmat_show(r);

    return 0;
}

rmat_show の後、別の関数で te マトリックスを強制終了しようとしました。'rmat_show' の引数 1 の互換性のない型は 'rmatrix' を予期していましたが、引数の型は 'struct rmatrix *'' でした。「typedef へのポインター」などの用語を検索してみましたが、結果はありませんでした。typedef 宣言が関数定義に引き継がれていないと思います。Windows 7でmsysとmingwを使用しています。

助けてくれてありがとう。

編集:ミスコピーしたtypedef行を追加しました。

4

2 に答える 2

1

同じループ変数を 2 回使用しているようです

 for (i = 0; i < r->m; i++) {
    for (i = 0; i < r->m; i++)

あなたはおそらく意味した

for (i = 0; i < r->m; i++) {
    for (j = 0; j < r->n; j++)

編集:

構造体の正しい名前も使用したい場合があります

構造体 smatrix

いいえ

rmatrix *r = malloc(sizeof(rmatrix));

しかし

struct srmatrix *r = malloc(sizeof(struct srmatrix)); 

struct を含めるかどうかは、コンパイラのバージョン C/C++ によって異なります。

于 2013-11-11T07:16:54.607 に答える
0

これ

struct srmatrix {
  int m,n;
  float *value;
};

... 

void rmat_show(rmatrix* r) 
{ 
  ...

  for (i = 0; i < r->m; i++) 
  {
    for (i = 0; i < r->m; i++) 
    {
      printf("%d\t", value[(n-1)*r->m+m-1]);
    }

    printf("\n");
  }

  ...

これであるべき

rmat.h:

#ifndef RMAT_H
#define RMAT_H

typedef struct rmatrix_s {
  size_t m, n; /* There is no need to define dimension as signed. */
  float * value;
} rmatrix_t;

void rmat_show(rmatrix_t * r);

#endif

rmat.c:

...
#include "rmat.h"

void rmat_show(rmatrix_t * r) 
{ 
  ...

  for (size_t j = 0; j < r->n; j++) 
  {
    for (size_t i = 0; i < r->m; i++) 
    {
      printf("%d\t", value[j*r->m + i]);
    }

    printf("\n");
  }

メインは次のようになります。

...
#include "rmat.h"

int main(int argc, char **argv)
{
  ...
  rmatrix_t * r = malloc(sizeof(*r));
  ...

これをコンパイルするには、次のようにします。

gcc -g -Wall -Wextra -o main main.c rmat.c
于 2013-11-11T07:19:04.913 に答える