-1

こんにちは、引数として 7 要素の配列を受け取り、その配列の 3 番目から 5 番目の要素をより小さい配列に返すプログラムを作成しようとしていますが、現在このエラーが発生しています。

assign8p7.c: In function 'main':
assign8p7.c:18:2: warning: passing argument 1 of 'copysect' makes pointer from 
integer without a cast [enabled by default]
assign8p7.c:3:6: note: expected 'int *' but argument is of type 'int'

私が言えることから、警告には引数に配列を渡すことに問題があることがわかります。これを修正する方法を知っている人はいますか? また、私のコードに関するその他のアドバイスも大歓迎です。

#include <stdio.h>  

int *copysect(int ar[],int start,int end)
{
int i;
static int retar[3];
for(i = 0; i<3;i++)
{
    retar[i+start]=ar[i+start];
}
return retar;
}

int main(int argc, char const *argv[])
{
int arry[7] = {1,2,3,4,5,6,7};
int miniarry[3];
miniarry[0] = *copysect(arry[0],3,5);
return 0;
}
4

2 に答える 2

5
int *copysect(int ar[],int start,int end)

さて、copysect最初のパラメータとして整数の配列を取ります。

miniarry[0] = *copysect(arry[0],3,5);

おっと、配列ではなく単一の整数を渡しました。

于 2013-03-11T14:08:32.547 に答える
0
  1. copysect配列へのポインターではなく、配列の最初の要素を使用して関数を呼び出しています。正しい呼び出しは次のとおりです。

    copysect(arry,3,5);
    
  2. 配列の差を動的に計算できます。copysect 関数の呼び出し元は、start と end の差が 2 であることを認識している必要があります。

    int retar[end - start + 1]
    
  3. for ループの代入が間違っています。retar 配列の範囲外の値を逆参照しています

    retar[i]=ar[i+start];
    
  4. 関数を呼び出すときは、配列全体ではなく、関数が返す配列を逆参照するcopysectことで、最初の要素のみを割り当てています。miniarry

  5. 関数に静的配列を含めることは最善の方法ではありません (関数を複数回呼び出した場合などに問題が発生します)。代わりに、小さい方の配列を他の場所で宣言し、それをパラメーターとして関数に渡すことができます。

    void copysect(int ar[], int retar[], int start,int end, )
    
于 2013-03-11T14:27:44.287 に答える