1

Java と C# から C に戻りました。関数を使用してファイルから 2 つの配列を読み取ろうとしている次の単純なプログラムに行き詰まっています。誰かが私がどこを台無しにしているのか指摘できますか?

コンパイラのメッセージ: エラー: バイナリ * へのオペランドが無効です ('int *' と 'int *' があります)

ファイル形式は

    4
    1   2   3   4
    23  23  14  11

私の関数は、バッファをファイルからReadFromFile埋める必要があります。AB

#include<stdio.h>

void ReadFromFile (const char* file_name, int *A, int *B, int *length)
{
    FILE* file = fopen (file_name, "r");
    fscanf (file, "%d", length);            
    int i;
    for(i = 0; i < length; i++)
    {
        fscanf (file, "%d", A+i); 
    }  
    for(i = 0; i < length; i++)
    {
        fscanf (file, "%d", B+i); 
    }   
    fclose (file);        
}

int main()
{
    int *A; int *B; int length;
    ReadFromFile("input.txt", A, B, &length);

    return 0;
}
4

5 に答える 5

1

関数を呼び出すときは、&A や &B などのアドレス参照を指定する必要があります

そして、これはテキストファイルを適切に読む方法です:)

FILE *file = fopen(file_name, "r");
while(file != EOF){
    fscanf(...)
}

編集

ダブルポインターを使用する必要はありません。main()整数で初期化しInt A,B、メソッドにアドレスを与えるだけです。

于 2012-04-04T07:07:47.660 に答える
1
void ReadFromFile (const char* file_name, int *A, int *B, int *length)
/* ... */
    for(i = 0; i < length; i++)
    {
        fscanf (file, "%d", A+i); 
    }

Aから単一の整数を渡しましたmain()が、ここではまったく無関係なメモリにアクセスしようとしています。についても同様ですBABを配列として割り当てるつもりでしたか?

例:

int *A; int *B; int length;

int A[100], B[100], length;

または似たようなもの。(おそらく、必要な数がわかったら、配列を動的に割り当てるか、必要に応じてそれらを割り当てて拡張しmalloc(3)ますrealloc(3)。)

于 2012-04-04T07:10:46.330 に答える
1
int main()
{
    int A; int B; int length;
    ReadFromFile("input.txt", &A, &B, &length);

    return 0;
}

A と B をポインターではなく変数として使用し、アドレスを指定して関数を呼び出してみてください。

それが問題かどうかはわかりません。しかし、試してみてください。

申し訳ありませんが、int ポインターに混乱していました。int[] Aあなたが望むのは、実際には と同じものだと思いますint* A。ただし、配列にメモリを割り当てるか、特定のサイズで初期化する必要があります。

于 2012-04-04T07:06:43.480 に答える
1

関数では、割り当てられていないメモリ内の場所にアクセスする A+i を使用します。つまり、メモリを取得するには、最初に malloc を呼び出す必要があります。

ここで構造について考えてみましょう。アドレス変数 A と B がありますが、割り当てられたメモリのアドレスを指していません。関数の前にこれを行いたい場合は、配列の長さを知る必要があります。関数内で実行する場合は、A と B のアドレスを渡して割り当てる必要があります。

void ReadFromFile (const char* file_name, int** A, int** B, int* length)
{
  FILE* file = fopen (file_name, "r");
  fscanf (file, "%d", length);
  *A = (int*) malloc(length * sizeof(int))
  // now use (*A)+i

その後、メインを変更します

int* A; int* B; int length;
ReadFromFile("input.txt", &A, &B, &length);
于 2012-04-04T07:07:09.567 に答える
1

まず第一に、ジャンクABのポインタです。実際に何かを保存したい場合 (または、セグメンテーション違反やメモリの破損が予想される場合) は、スペースを割り当てる必要があります。

forループについて不平を言っています。lengthは初期化されないため、ジャンク データへのポインターを送信しています (または、ファイルからの読み取りで読み込まれることはありません)。

i < lengthint値をアドレスまたは(意味をなさない)と比較しているため、(その意味で)有効ではint *ありません。あなたは意味するかもしれませんi < *length; なぜならlength、ポインタであり、その実際の値を逆参照する必要があるからです。

于 2012-04-04T07:07:13.423 に答える