0

ポインタで困っています。オフィスアワーに行くべきだったのはわかっていますが、どうしても助けが必要です。現在の最大の問題は、このプログラムをデバッグしようとすることです。私の理解では、void 関数でアドレスを宣言することになっています。その後、readfile(%testarray) に & を使用する必要があります。私は何を間違っていますか?私のプログラムの目的は、数値のファイルを読み取り、それらを配列に格納することです。次に、配列内のすべての数値を出力します。どんな助けでも大歓迎です。

sort.c:11:3: warning: passing argument 1 of 'read_file' makes pointer from integer without a cast [enabled by default]
sort.c:3:6: note: expected 'int **' but argument is of type 'int'
sort.c: In function 'read_file':
sort.c:27:3: warning: format '%d' expects argument of type 'int *', but argument 3 has type 'int' [-Wformat]

コード:

    #include <stdio.h>
    #include <stdlib.h>
    void read_file(int* myList[]);

    int main()
    {
      int testarray[20];
      read_file(&testarray[20]);
      return 0;
    }

    void read_file(int* myList[])
    {
      FILE* inFile;
      int i;
      inFile = fopen("data.txt","r");
      if (inFile == NULL)
      {
        printf("Unable to open file");
        exit(1);
      }
        i = 0;
        while (fscanf(inFile,"%d", *myList[i]) != EOF)
      {
        printf("%d ", *myList[i]);
        i = i+1;
      }
      printf("\n");
      printf("%d\n", i );
     } //void
4

5 に答える 5

1

関数ヘッダーの名前の後に角括弧を使用する[]と、配列を渡すことをコンパイラに伝えます。

  • int testarray[]整数の配列を意味します
  • int *testarray[]整数ポインタの配列を意味します

整数の配列を渡すため、関数のシグネチャは次のいずれかである必要があります

void read_file(int myList[]);

または同等の

void read_file(int *myList);

呼び出しは次のようになります。

read_file(testarray);

次に&vs.についてです*が、アンパサンドはアドレスを持つ値式からポインタを作り、アスタリスクはポインタ式から値を作ります。scanfはポインタを取るので、どちらかで呼び出す必要があります

fscanf(inFile,"%d", &myList[i])

または同等のもの

fscanf(inFile,"%d", myList+i)
于 2013-02-13T12:16:49.950 に答える
0

式は、配列の最後のエントリを超え&testarray[20]たものへのポインタです(つまり、と同じです)。これは、配列へのポインタとは異なります。さらに、引数を配列へのポインターではなく、ポインターの配列として宣言します。(との違い)。int *int *arr[]int (*arr)[]

また、配列へのポインターを関数に渡す必要はありません。代わりに、関数に通常の配列(またはポインター)引数を持たせ、配列をそのまま渡します。

void read_file(int myList[]);

int main(void)
{
    int testarray[20];
    read_file(testarray);
    /* .... */
}

内部では、配列を使用するときread_fileに間接参照演算子は必要ありません。*通常の配列として使用できます。

于 2013-02-13T12:12:20.363 に答える
0

これがあなたの固定コードです。

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


void read_file(int myList[20]);

int main()
{
    int testarray[20];
    read_file(testarray);
    return 0;
}

void read_file(int myList[20])
{
    FILE* inFile;
    int i;
    inFile = fopen("data.txt","r");
    if (inFile == NULL)
    {
        printf("Unable to open file");
        exit(1);
    }
    i = 0;
    while (fscanf(inFile,"%d", &myList[i]) != EOF)
    {
        printf("%d ", myList[i]);
        i = i+1;
    }
    printf("\n");
    printf("%d\n", i );
} 
于 2013-02-13T12:14:23.707 に答える
0

以下を使用する必要があります。

read_file(&testarray);

配列全体へのポインターを渡そうとすると。あなたが行ったことは、配列内の20番目の要素のアドレスを取得するだけです(これは範囲外です)。

于 2013-02-13T12:11:03.957 に答える
0

テキスト ファイルに 10 個の数字があると仮定して、次のコードを参照してください。

    #include <stdio.h>
    #include <stdlib.h>
    void read_file(int *);

    int main()
    {
     int *List=(int *)malloc(10*sizeof(int));// Allocate memory for 10 integers
     read_file(List); 
     return 0;
    }

/* Passing a pointer to the contiguous locations, just the starting location is enough*/
    void read_file(int *ptr)
    {
     FILE *inFile;
     inFile=fopen("Numbers.txt","r");
     int i=0;
     if(inFile!=NULL)
      while(fscanf(inFile,"%d",ptr)!=EOF)
      {    
       printf("%d ",*(ptr));
       i++;
      }
      free(ptr);// Free the memory Locations
     } 
于 2013-02-13T12:53:15.753 に答える