1

まず第一に、私はネットワークに関する情報を探していて、gdb のデバッグでテストを行っていると言いますが...何もありません...私はまだエラーを理解していません。「getline」命令から来ている可能性があると思います、 確信はないけど...

コードの主なアイデアは、行ごとに読み取り、chars 文字列を float に変換し、呼び出された配列に float を保存してからnfloat、関数 *create_table* を呼び出して vector 型のポインターの配列を作成することです。

入力はこれ.txtを含む です: n = 文字列の数、この場合はn = 3

3
[9.3,1.2,87.9]
[1.0,1.0]
[0.0,0.0,1.0]

最初の数値3は、画像でわかるようにベクトルの数ですが、その数値は静的ではなく、入力は の代わりに5またはなどにすることができます。73

これまでのところ、次のことを始めましたが、コードにはいくつかのメモリエラーがあると思います:

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


typedef struct {
    float* data;
    int size;
} vector;




vector *create_vector(int n, float* comps){
    vector newvect;
    newvect.data = (float *) malloc(n*sizeof(float));
    int i;
    for(i = 0; i < n; i++) {
        newvect.data[i] = comps[i];
        printf("Newvec.data[%d] = %.1f\n", i, newvect.data[i]);
    }
    newvect.size = n;
    vector *pointvector;
    pointvector = &newvect;
    return(pointvector);
}


int NumsVector(char *linea, ssize_t size){
    int numsvector = 1; 
    int n;
    for(n = 2; n<= size; n++){ 
        if (linea[n] != '[' && linea[n] != ']'){
            if(linea[n] == 44){
                numsvector = numsvector + 1;
            }
        }
    }
    return numsvector;
}

int main(){
    int n, i;
    scanf("%d\n", &n);
    vector *v[n];
    for(i = 0; i<n; ++i) { 
        char *line = NULL; 
        size_t len = 0;
        ssize_t read; 
        read = getline(&line,&len,stdin);
        int numsvector = NumsVector(line, read);
        float nfloat[numsvector];
        int j = 0;
        /* Replaces the end ] with a , */
        line[strlen(line) - 1] = ',';

        /* creates a new pointer, pointing after the first [ in the original string */
        char *p = line + 1;
        do
        {
            /* grabs up to the next comma as a float */
            sscanf(p, "%f,", &nfloat[j]);
            /* moves pointer forward to next comma */
            while (*(p++) != ',');
        }
        while (++j < numsvector); /* stops when you've got the expected number */
        v[i] = create_vector(numsvector, nfloat);
        printf("%f\n", v[i]->data[1]); //prints ok :)!
        free(line);
    }
    printf("%f\n", v[i]->data[1]); //segmentation fault:11 :(!! }

さて、問題はprintf命令に付属していると思います。ループ内で印刷するとすべて正常に動作しますが、forループから同じことを実行しようとすると、セグメンテーション違反エラーが出力されます...メモリリークの可能性があります?

*v[n] 情報に基づいて関数を作成し続けるために、*v[n] が適切に実装され、情報が適切に保存されているかどうかを知ることが重要です。

ループを印刷するときに問題がどこにあるかを理解するのを手伝ってくれませんか?

4

2 に答える 2

3
vector *pointvector;
pointvector = &newvect;
return(pointvector);

ローカル変数へのポインタを返しています。これは正しくなく、動的メモリを割り当てるか、関数内で変数newvectを使用してstaticからデータをコピーすることによって変更する必要があります (データは 2 つの呼び出し間で保持されません)。

編集:要求に応じて、動的割り当ての例:

vector *create_vector(int n, float* comps){
    vector *newvect = malloc(sizeof(*newvect));
    newvect->data = malloc(n*sizeof(float));
    memcpy(newvect->data, comps, sizeof(float) * n);
    newvect->size = n;
    return newvector;
}

もちろん、ある時点で、データとベクトル自体の両方を解放する必要があります。

于 2013-10-14T11:17:16.953 に答える