2

私はC関数を書いているので、呼び出されたときに関数は最初のp個の素数の配列(ベクトル)を返します(pはメインのキーボードから与えられます)。

私の問題は、メインで関数を呼び出そうとするときです。

void vector_prime(int p, int *v[ ],int *total);

これは私の関数ヘッダーがどのように見えるかであり、以下はメインからの呼び出しです。

vector_prime(n,&v,&tot);

さて、問題は、引数 v を関数に与えようとすると、v は既にベクトルの最初の要素へのポインターであるため、&v を記述しようとしてもうまくいかないことです。

[エラー]引数 '2' を 'void vector_prime(int, int* , int )'にするために 'int ( )[100]' を 'int *' に変換できません

これがエラーです。

以下はコード全体です。

あなたが私を助けることができれば、私はとても感謝しています.

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

int prim(int n);
void vector_prime(int p, int *v[],int *total);


int main(void){

    int n,j;
    int v[100], tot;


        puts("Introduceti un numar intreg: ");
        scanf("%d",&n);

        if(prim(n)==1) printf("Numarul %d este prim", n);
                        else printf("Numarul %d nu este prim",n);


        vector_prime(n,&v,&tot);

        for(j=0;  j<tot;   j++) printf("%d ", v[j]);

}



int prim(int n){

    int i,k=0;


    for(i=2;  i<n/2;  i++){
        if(n%i==0)  k++;
    }

    if(k==0) return 1;
        else return 0;


}
//p - primele p numere prime;     
//*v[] - pointer catre vectorul in care va stoca valorile;
///*total - pointer catre locatia la care este stocat numarul de valori prime pana la p;
void vector_prime(int p, int *v[],int *total){

    int i,j=0,d,k;

    for(i=1;   i<p;   i++){
    k=0;
        for(d=2;  d<i/2+1;  d++)

            if(i%d==0) k++;

                if(k==0) {
                    *v[j]=i; (*total)++; j++;
                }

    }
//  for(j=0;  j<*total;  j++) printf("%d  ", *v[j]);


} 

ありがとう!!

4

1 に答える 1

1

これは、vector_prime関数の 2 番目の引数がポインターの配列を取り、配列へのポインターを渡すためです。

ここでは配列へのポインタを渡す必要はなく、配列をそのまま渡し、それvector_primeに応じて関数を変更します。

そう:

void vector_prime(int p, int v[], int *total);

また

void vector_prime(int p, int *v, int *total);

vector_prime(n, v, &tot);

コードにも未定義の動作があることに注意してください。 totinを初期化せず、どちらでもmain初期化しませんvector_prime。つまり、最初は一見ランダムな値が含まれます。

nがより大きくない100か、 より小さくないことを確認する必要があり0ます。v[0]また、関数で値を設定しないことにも注意してくださいvector_prime

于 2014-01-07T15:38:02.107 に答える