2012-04-25 11 views
1

これはプリミティブなルートを見つけるためにコンパイルしようとしていたコードです...しかし、それは私にエラーを与えます。数字の基本的なルーツを見つける方法

倍増するvoid *型からライン double *factors=malloc(sizeof(double)*q-2); //エラー、無効な変換では、ここで
int isPrimitive (int q, int a) { 
int i,z; 
double k,s; 

s=1; 
i=0; 

double *factors=malloc(sizeof(double)*q-2);  

while (s>0 && i<q-2) { 
    k=pow(a,i); 
    s=k-(q*floor(k/q)); 
    for (z=0;z<(sizeof(*factors)/sizeof(factors[0]));z++) { 
     if (factors[z]==s) { 
      return 0; 
     } 
    } 
    factors[i]=s; 
    i++; 
} 

*付属しています。

+2

どのコンパイラを使用していますか? (sizeof(double)* q-2'とはsizeof(double)*(q-2)の意味ですか? – huon

+0

CまたはC++コンパイラでコンパイルしますか?エラーメッセージは後者を示します。 – jpalecek

+1

'double * factors =(double *)malloc(...);' ...のように、 'malloc()'が返す 'void *'をキャストする必要があります。 – hroptatyr

答えて

3

問題はほぼ確実にCコードでC++コンパイラを使用しています。 C void*では、キャストのない任意のポインタ型に変換できますが、これはC++では正しくないため、エラーメッセージです。基本的には、2つの解決策があります:Cコンパイラを使用するか(例えば、g++ではなくgcc)、mallocの結果をキャストします。

後者はして行うことができます。

double *factors = static_cast<double*> (malloc(sizeof(double)*(q-2))); 

しかし、あなたが実際にC++を書いている場合は、new []構文を使用すると良いです:

double *factors = new double [q-2]; 

(これはdelete[] factorsを使用しての代わりに、必要なことに注意してくださいfree(factors)

関連する問題