1

私は現在、以下のCコードに取り組んでいます。whileの後に、ループの外で配列にアクセスする必要がありますfcloseblackfin ADSPカーネルは、実行するたびにクラッシュするようです。FFTを実行するにはさらに必要になります。助けてください!

#include <stdlib.h>
#include <stdio.h>
#include <flt2fr.h>
#include <fract_math.h>
#include <math_bf.h>
#include <complex.h>
#include <filter.h>

int main() 
{
    int n = 1024;
    long int dat1[n];
    FILE *file1;
    fract16 *m;
    int i;

    // file1 open and read the values
    file1 = fopen("0.dat", "r");
    if (file1 == NULL) {
       printf("I couldn't open 0.dat for reading.\n");
       exit(0);
    }

    while (!feof(file1)) {
        fgets(dat1, n, file1);
        m = malloc(sizeof(fract16) * n);
        for (i = 0; i < n; i++) {
            sscanf(dat1, "%f", &m[i]); //getting error here
        }
    }

    fclose(file1);
    printf("%lf\n", m);
    return 0;
}

わかりました、私の間違いを修正していただきありがとうございますが、問題はまだ解決されていません。内部のすべての値を出力できますが、ループの外部ではデータ セットの最後の値のみを出力します。これに対する正確な解決策はありますか? 私は何時間もグーグルで検索しましたが、まだ成功していません。コードは次のとおりです >

#include <stdlib.h>
#include <stdio.h>
#include <flt2fr.h>
#include<fract_math.h>
#include <math_bf.h>
#include <complex.h>
#include <filter.h>
int main()
{
    int n = 1024;
    long int dat1[n];
    FILE *file1;
    fract16 *m;

    file1 = fopen("0.dat", "r");
      if (file1 == NULL) {
         printf("I couldn't open 0.dat for reading.\n");
         exit(0);
      }

    while( !feof(file1))
    {

       fgets(dat1,n,file1);
       sscanf(dat1, "%f", &m);
       printf("%f\n",m); //Prints all elements in the 1st column of the  array, 0.dat is a nx2 matrix
    }
    fclose(file1);
}
4

2 に答える 2

0

変数mは、へのポインタおよび配列として定義されます。fract16

問題を解決するには、次のことをお勧めします。

if( 1 != sscanf(dat1, "%f", m+(sizeof(fract16)*i) )
{
    perror( "sscanf failed" );
    exit( EXIT_FAILURE );
}

mはすでにポインターであり、ポインターであり続けたいため、エラーが発生しています

余談として。コードは、呼び出しで実際に読み取られたデータの量をチェックしていないfgets()ためfor()、実際のデータの末尾から読み取っている可能性があります。そして、ループを通過するたびにwhile()、前の呼び出しから取得されたポインターが破棄/オーバーレイされますmalloc()

その後、コードの後半に次のステートメントがあります。

printf("%lf\n", m);

しかしm、`fract16 オブジェクトの配列へのポインタです。

これらのfract16オブジェクトは値である可能性がありdoubleますが、その詳細は明確ではありません。いずれにせよ、この への呼び出しprintf()は、せいぜい、入力ファイルの最後の行の先頭から単一の double 値を出力するだけです。それはあなたが本当にやりたいことですか?

注: dat1[]は の配列として宣言されてlong intいますが、 への呼び出しは値sscanf()を抽出しようとしているようfloatです。

つまり、コードはデータ型、個々の値の抽出、印刷について一貫していません。

注意すべき点: 現在のコードでは、ポインタが への呼び出しによって繰り返し上書きされるため、大規模なメモリ リークが発生mmalloc() ます。バイトfeof()fgets()dat1[]

fractl16オブジェクトへのポインターの配列の割り当てを提案する

次に、読み取られた行ごとに、を使用malloc()してポインターの配列に次のポインターを設定します...

于 2016-12-04T07:47:33.947 に答える