我有这段代码:
int * generate_code(int *bits, int Fs, int size, int *signal_size, float frameRate)
{
int sign_prev, i;
int bit, t, j=0;
int *x;
float F0, N, t0, prev_i, F1;
int temp = 0, temp1, temp2;
F0 = frameRate * BITS_PER_FRAME; // Frequency of a train of '0's = 2.4kHz
F1 = 2*F0; // Frequency of a train of '1's = 4.8kHz
N = 2*(float)Fs/F1; // number of samples in one bit
sign_prev = -1;
prev_i = 0;
x = (int *)malloc(sizeof(int));
for( i = 0 ; i < size ; i++)
{
t0 = (i + 1)*N;
bit = bits[i];
if( bit == 1 )
{
temp1 = (int)round(t0-N/2)-(int)round(prev_i+1)+1;
temp2 = (int)round(t0)-(int)round(t0-N/2+1)+1;
temp =j + temp1 + temp2;
//printf("%d\n", (int)temp);
x = realloc(x, sizeof(int)*temp); // 1
for(t=(int)round(prev_i+1); t<=(int)round(t0-N/2); t++)
{
*(x + j) = -sign_prev;
j++;
}
prev_i = t0-N/2;
for(t=(int)round(prev_i+1); t <= (int)round(t0); t++)
{
*(x + j) = sign_prev;
j++;
}
}
else
{
// '0' has single transition and changes sign
temp =j + (int)round(t0)-(int)round(prev_i);
//printf("%d\n",(int)temp);
x = realloc(x, sizeof(int)*(int)temp); // 2
for(t=(int)round(prev_i); t < (int)round(t0); t++)
{
*(x + j) = -sign_prev;
j++;
}
sign_prev = -sign_prev;
}
prev_i = t0;
}
*signal_size = j;
return x;
}
前面代码中标有realloc
和//1
的{{1}}行都给出了以下错误消息:
从不兼容的类型void *
分配给int *
因为我不希望这段代码表现得格外奇怪或者让我崩溃,显然,我会问:如果我只是通过
将其转换为//2
,我将来会遇到一些问题。
int *
由于
答案 0 :(得分:7)
在C中,类型void*
的值(例如realloc
返回的值)可以分配给类型为int*
的变量,或任何其他对象指针类型。该值是隐式转换的。
错误消息最可能的解释是您将代码编译为C ++而不是C。确保源文件名以.c
结尾,而不是.C
或{ {1}},并确保您的编译器配置为C编译而不是C ++。
(转换.cpp
或realloc
的结果在C中被视为不良风格。在C ++中,强制转换是必要的,但您通常不会使用malloc
或{首先在C ++中{1}}。)
答案 1 :(得分:1)
这应该在C中工作。您是否可能使用C ++编译器来编译它?例如,一些位于雷德蒙德的大公司拒绝正确支持当代的C实现。他们的编译器默认是C ++,需要一些选项才能将它打入C编译器。
您是否包含stdlib.h
?那你就不需要演员了。实际上,最佳做法是不转换malloc返回。
答案 2 :(得分:1)
C中的所有WHERE
- 样式函数返回具有最严格对齐的内存地址,因此强制转换不能给出一个不是有效SELECT * FROM ObjectToPerson
LEFT JOIN Objects O ON O.Id = ObjectToPerson.ObjectId
WHERE ObjectToPerson.ObjectTypeId IN(1,2)
指针的指针。