2013-05-23 16 views
5

私のコードに問題があります。 XcodeまたはC++ 11コンパイラでは、このコードはうまくいきます。ただし、このコードをオンラインジャッジに提出すると、判定で「コンパイルエラー」と表示されます。私は、彼らが(Ideoneを使用して)私はそれをコンパイルしようとしたC++ 4.7.1コンパイラを使用すると思いますが、それは言う:"void * 'はvoid *のコードではオブジェクトへのポインタ型ではありませんか?

prog.cpp: In function 'void printArray(int)': 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 
prog.cpp:27: error: 'void*' is not a pointer-to-object type 

で無void*のどこかがあるので、これは意味がありませんこのプログラム。

私は何を変えても何の印象もありません。あなたが私にこれを解決するのを手伝ってくれれば素晴らしいだろう。以下は私のコードです:

#include <iostream> 
#include <math.h> 
#include <cmath> 
#include <tgmath.h> 

int array[10] = {1,2,3,4,5,6,7,8,9}; 
int initial = 1; 
int tmp; 
int total[500]; 

using namespace std; 

void swap(int x, int y){ 
    int temp = array[x]; 
    array[x]=array[y]; 
    array[y]=temp; 

    return; 
} 

void printArray(int size){ 

    int i; 
    for (i=0;i<size;i++){ 
     //cout<<array[i]<<" "; 
     tmp= array[i]; 
     tmp= (tmp* (pow(10.0,(size-i-1)))); // <--- Error here 
     total[initial]=total[initial]+ tmp; 
    } 
    initial++; 
    tmp=0; 
    //cout<<endl; 
} 

void permute(int k,int size){ 
    int i; 
    if (k==0) printArray(size); 
    else{ 
     for (i=k-1;i>=0;i--){ 
      swap(i,k-1); 
      permute(k-1,size); 
      swap(i,k-1); 
     } 
    } 

    return; 
} 

void quickSort(int arr[], int left, int right) { 
    int i = left, j = right; 
    int tmp; 
    int pivot = arr[(left + right)/2]; 

    while (i <= j) { 
     while (arr[i] < pivot) 
      i++; 
     while (arr[j] > pivot) 
      j--; 
     if (i <= j) { 
      tmp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = tmp; 
      i++; 
      j--; 
     } 
    }; 

    if (left < j) 
     quickSort(arr, left, j); 
    if (i < right) 
     quickSort(arr, i, right); 
} 

int main(){ 
    int countertest; 
    cin>>countertest; 
    int ak, asize; 

    for(int a= 0; a<countertest; a++){ 

     initial = 1; 
     std::fill(total, total+500, 0); 
     cin>>asize>>ak; 
     permute(asize,asize); 

     quickSort(total, 1, initial-1); 

     int arraydex [10000], temp = total[ak]; 
     for(int z = asize; z>=0; z--){ 
      arraydex[z] = temp % 10; 
      temp /= 10; 
     } 

     for(int bc = 1; bc<=asize; bc++){ 
      cout<<arraydex[bc]<<" "; 
     } 
     cout<<endl; 
    } 

    return 0; 
} 
+1

待機。元のコードを投稿してもよろしいですか?私はここに 'void * 'を見ない。 –

+0

(私は、OPが "printArray"の中で 'tmp'を宣言していると訴えましたが、それはグローバルです)また、' math.h'と 'cmath'の両方を含めないでください。 –

+0

@EricJablowそれはグローバル変数です –

答えて

8

私の知る限り#include <tgmath.h>が問題であり、あなたにも#include <math.h>を削除することができ、#include <cmath>は十分なものでなければならない言うことができるように。

適切なC++ヘッダーファイル#include <ctgmath>を含めると、OKであるように見えます。

+0

Shafikに感謝します!私はそれが問題だと思う! – Joshua

+0

本当に助けてくれてありがとう! – Joshua

+0

なぜそれが問題であったのだろう... – 0x499602D2

11

ここでの問題は、<tgmath.h><cmath>/<math.h>の間の競合です。

は、ここに私のLinuxシステム上<tgmath.h>にソースファイルを開くときに私が見つけたものです:

#define pow(Val1, Val2) __TGMATH_BINARY_REAL_IMAG (Val1, Val2, pow, cpow) 

これは重要である - それは、この他のマクロを使用するpowを再定義しています。これはです。すぐにという問題があります。なぜなら、それは#defineですから、通常のpow機能です。

この機能は何をしていますか?さて、__TGMATH_BINARY_REAL_IMAGを見てみましょう:

# define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \ 
(__extension__ (((sizeof (__real__ (Val1)) > sizeof (double)  \ 
     || sizeof (__real__ (Val2)) > sizeof (double))  \ 
     && __builtin_classify_type (__real__ (Val1)  \ 
      + __real__ (Val2)) == 8) \ 
    ? ((sizeof (__real__ (Val1)) == sizeof (Val1)  \ 
    && sizeof (__real__ (Val2)) == sizeof (Val2))  \ 
    ? (__typeof ((__tgmath_real_type (Val1)) 0  \ 
     + (__tgmath_real_type (Val2)) 0))  \ 
    __tgml(Fct) (Val1, Val2)   \ 
    : (__typeof ((__tgmath_real_type (Val1)) 0  \ 
     + (__tgmath_real_type (Val2)) 0))  \ 
    __tgml(Cfct) (Val1, Val2))   \ 
    : (sizeof (__real__ (Val1)) == sizeof (double)  \ 
    || sizeof (__real__ (Val2)) == sizeof (double)  \ 
    || __builtin_classify_type (__real__ (Val1)) != 8  \ 
    || __builtin_classify_type (__real__ (Val2)) != 8) \ 
    ? ((sizeof (__real__ (Val1)) == sizeof (Val1)  \ 
    && sizeof (__real__ (Val2)) == sizeof (Val2))  \ 
    ? (__typeof ((__tgmath_real_type (Val1)) 0  \ 
     + (__tgmath_real_type (Val2)) 0))  \ 
    Fct (Val1, Val2)    \ 
    : (__typeof ((__tgmath_real_type (Val1)) 0  \ 
     + (__tgmath_real_type (Val2)) 0))  \ 
    Cfct (Val1, Val2))    \ 
    : ((sizeof (__real__ (Val1)) == sizeof (Val1)  \ 
    && sizeof (__real__ (Val2)) == sizeof (Val2))  \ 
    ? (__typeof ((__tgmath_real_type (Val1)) 0  \ 
     + (__tgmath_real_type (Val2)) 0))  \ 
    Fct##f (Val1, Val2)    \ 
    : (__typeof ((__tgmath_real_type (Val1)) 0  \ 
     + (__tgmath_real_type (Val2)) 0))  \ 
    Cfct##f (Val1, Val2)))) 

あの...私はここに言うことを知りません。これは残酷で珍しいです。

ここには何が起こっていますか?さて、私はthe docs for tgmath.hを見て、このヘッダが、powなどのような基本的な機能のための型認識マクロの束を定義しており、引数の型がdoublefloatなどであるかどうかを判断し、適切な関数。これは、Cはオーバーロードをサポートしていない(C++ではあるが)ので、マジックヘッダファイルによって提供されなければならないからである。ここで重要な点は、関数がdoublefloat、またはこれらの型の複合バージョンの引数でのみ呼び出され、intが渡されていることです。ここではマクロ置換が行われているので、コンパイラはcmath関数を調べていないだけでなく、その型についてイントロスペクトしようとしているCマクロから地獄にジャンプします。

要するに、は、このヘッダーファイルをC++に含めません。既にC++では、オーバーロードされた関数をサポートしているので、複素数を扱うためにはcomplexというテンプレートがあるので、全く必要ありません。

希望すると便利です。

+1

+1これをすばやく説明するために足踏みをするために、私はまだそれをやっていて、まだ近くにはなかったでしょう。 –

+0

本当に助けてくれてありがとう! – Joshua

関連する問題