5

コードに問題があります。XcodeまたはC++11コンパイラを使用すると、このコードはうまく機能します。しかし、このコードをオンライン審査員に提出すると、判定に「コンパイル エラー」が表示されます。彼らはC++4.7.1コンパイラを使用していると思います。これを (Ideone を使用して) コンパイルしようとすると、次のように表示されます。

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*このプログラムのどこにも 'sがないため、これは意味がありません。

とはいえ、何を変えるべきかはまったくわかりません。皆さんがこれを解決するのを手伝ってくれたら素晴らしいです。以下は私のコードです:

#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;
}
4

2 に答える 2

12

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

<tgmath.h>私のLinuxシステムでソースファイルを開いたときに見つけたものは次のとおりです。

#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))))

うーん...ここで何を言えばいいのかわからない。これは残酷で異常です。

ここで何が起こっているのですか?さて、私はドキュメントをtgmath.hpow見て、このヘッダーが引数の型が 、 などであるかどうかを判断し、適切な関数への呼び出しをディスパッチするなどdoublefloat基本的な関数の型認識マクロの束を定義していることを発見しました。これは、C がオーバーロードをサポートしていないため (C++ はサポートしていますが)、マジック ヘッダー ファイルで提供する必要があるためです。ここでの重要な詳細は、関数はdoublefloat、またはこれらの型の複雑なバージョンの引数でのみ呼び出す必要があり、int. マクロ置換がここで行われているため、コンパイラはcmath関数を確認することさえせず、代わりに型をイントロスペクトしようとする C Macro From Hell にジャンプするだけです。

つまり、このヘッダー ファイルを C++ に含めないでください。 オーバーロードされた関数は既にサポートされており、complex複素数を処理するためのテンプレートがあるため、C++ ではまったく不要です。

お役に立てれば!

于 2013-05-23T03:21:44.337 に答える
8

私が知る限り、これ#include <tgmath.h>は問題であり、削除することもできます#include <math.h>#include <cmath>十分なはずです。

適切な C++ ヘッダー ファイルをインクルードすれば、問題#include <ctgmath>ないように見えます。

于 2013-05-23T03:16:57.880 に答える