我的代码中存在问题。在 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*
。
虽然我没有任何改变。如果你们帮我解决这个问题会很棒。以下是我的代码:
#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;
}
答案 0 :(得分:12)
此处的问题是<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
等,它们将确定参数类型是否为double
,{ {1}}等,然后将调用分派给适当的函数。这是因为C不支持重载(尽管C ++有),因此它必须由魔术头文件提供。这里重要的细节是,只应在float
,double
类型的参数或这些类型的复杂版本上调用该函数,并且您传入float
。由于宏替换发生在这里,编译器甚至没有查看int
函数,而只是跳转到Cell From Hell,它试图对类型进行内省。
简而言之,不要在C ++中包含此头文件!在C ++中完全没有必要,因为已经支持重载函数,并且有一个cmath
模板来处理复数
希望这有帮助!
答案 1 :(得分:8)
据我所知#include <tgmath.h>
是问题所在,您也可以删除#include <math.h>
,#include <cmath>
就足够了。
如果你包含正确的C ++头文件#include <ctgmath>
,它看起来也没问题。