0

プロジェクトで作業するために、32 ビット Ubuntu 仮想マシンで Eclipse を使用しています。構造を実装しようとしているとき、または特定の関数を実行しようとしているときに大きな問題があります。関数は次のとおりです。

int count (matrix m, int v[], int w[], int col) {

    int r=0;
    int j=0;

    while (j < m.length) {
        int k=0;
        bool aux=true;

        while (k < col && aux ){
            if (v[k] == 1) {
                if(m.i[j][k] != w[k])
                    aux=false;
            }
            k++;
        }

        if(aux) r++;
        j++;
    }
    return r;
}

この関数は、行列 (以下で定義)、1 と 0 を含むベクトル (検索する列を学習するため)、それらの列で検索する値を含むベクトル、および列の数 (ベクトルの長さに等しい) を受け取ります。 2番目の「if」に当たると、セグメンテーション違反が発生し(それが何であるか理解できません)、そのように定義するのは正しくないことがわかりますが、試してみましたが、できますベクトル内の値にアクセスする方法が見つからないようです。ここに私の構造体行列を示します。

typedef int *ind; 

struct matrix { 
    ind *i;
    int length;
};
typedef struct matrix matrix;

この構造では、私のマトリックスにはポインターと長さ (行数) があります。ポインターはポインターのベクトル (各行に 1 つのポインター) に移動し、これらのポインターのそれぞれは、実際には行列の私の行であるベクトルに移動します。空の行列を追加して作成する関数を次に示します。

matrix emptyS(int n, int col) {
matrix m;
int d=0;
m.length=0;
m.i=(ind*) malloc(sizeof(int)*n);
int x;
    for (x=0; x < n; x++)
           {
               *m.i = (int*) malloc(sizeof(int)*col);
           }
while (d<n){
    m.i[d]=NULL;
    d++;
}
return m;
} /*Updated*/

matrix add(matrix m,int v[]){
    m.i[m.length+1]=v;
    m.length++;
    return m;
}

これが非常に具体的な質問であることは知っていますが、機能を変更することに夢中になっていて、成功していないようです。

4

3 に答える 3

5

あなたの定義iはこれです:

 ind *i;

の次の定義がありindます。

typedef int* ind;

これは、本当にあなたの定義がこれであることを意味しますi:

int ** i;

これはポインターへのポインターです。これは、メモリを間違って割り当てなければならないことを意味します。

m.i=(ind*) malloc(sizeof(int)*n); 

この割り当ては a のみですがint*、2 番目のポインターはどうでしょうか。メモリを割り当てたことはありません。

次のように、行列の行を割り当てます。

for (int x = 0; x < nofrows; x++)
   { 
       *m.i = (int*)malloc(sizeof(int)); 
   }

編集

マトリックスの割り当てを行った後のコードは、マトリックス内のポインターを に設定しNULL、本質的に、割り当てたばかりのすべてのメモリをぶら下げたままにし、何も指していません!!

while (d<n){
    m.i[d]=NULL; <--- LEAVES YOUR MEMORY JUST ALLOCATED FOR ROW d DANGLING.
    d++;
}

に設定するべきではありませんNULLが、代わりに、メモリを割り当てたばかりのマトリックスに何かを書き込む必要があります。

于 2012-04-22T13:08:41.333 に答える
1

ラインを交換する

m.i=(ind*) malloc(sizeof(int)*n);

m.i=(ind*) malloc(sizeof(ind)*n);

これが役立つことを願っています。

于 2012-04-22T13:21:19.093 に答える
1
#include <stdlib.h>
#include <stdio.h>

typedef enum{false,true}  bool;

typedef struct matrix_ {
    int **rows;
    unsigned size ;
    unsigned used ;
} matrix;

unsigned count (matrix m, int v[], int w[], unsigned ncol) {
    unsigned cnt=0;
    unsigned j=0;

    for (j=0; j < m.used; j++) {
        unsigned k;
        bool aux=true;

        for (k=0;k < ncol && aux; k++ ){
            if (v[k] == 1  && m.rows[j][k] != w[k]) {
                    aux=false;
            }
        }

        if(aux) cnt++;
    }
    return cnt;
}
#define barf(s) do { \
    fprintf (stderr, "%s\n", s); \
    exit (EXIT_FAILURE); \
    } while(0)

matrix emptyS(unsigned siz) {
    matrix m;
    unsigned d;

    m.used=0;
    m.size = siz;
    m.rows = malloc(siz * sizeof *m.rows );

    for (d=0; d<siz; d++){
        m.rows[d]=NULL;
    }
    return m;
}

matrix add(matrix m,int v[]){
    if (m.used >= m.size) barf("Danger, Bill Robinson!" );
    m.rows[m.used++]=v;
    return m;
}
int main(void)
{
int a[] = { 0,1,0};
int b[] = { 0,1,1};
int c[] = { 0,0,0};
int v[] = { 1,0,1};
int w[] = { 0,1,0};
matrix mymatrix;
unsigned zcount;

mymatrix = emptyS(3);
mymatrix = add( mymatrix, a);
mymatrix = add( mymatrix, b);
mymatrix = add( mymatrix, c);

zcount = count(mymatrix, v, w, 3);

printf("Count = %u\n", zcount);

return 0;
}

いくつかの「文体」のヒント:

  • for ループは while() ループよりもエラーが発生しにくく、2 行節約できます。
  • カウントとインデックスの場合、符号なしの型はエラーが発生しにくいです。(コーナーケースは1つしかありません)
  • typedef 内でポインターを非表示にしないでください。それはあなた自身と他の人を混乱させます。
  • malloc() の戻り値をキャストしないでください。これは不要であり、エラー メッセージを抑制する場合があります。
  • ptr = malloc (n * sizeof *ptr)より安定した WRT のタイプミスと将来の編集です。
  • 可変サイズのオブジェクト (マトリックスなど) を割り当てる場合は、そのオブジェクトにサイズ (要素数) を格納します。オブジェクトは「自己完結型」である必要があります。
于 2012-04-22T15:38:51.653 に答える