'char' 之前的预期不合格 ID
Expected unqualified-id before 'char'
我对整个编程社区还比较陌生,并且一直在玩 Arduino Duemilanove 和 LOL 盾牌。我有一个很棒的想法,可以将它变成一个视觉均衡器,你瞧,已经有人在这么做了 here。
Arduino 工作正常,我可以在上面获取代码 运行。简单的代码,但还是代码。
我遵循了所有关于如何让它工作的说明,并且非常接近。然而,每当我尝试编译 .ino 文件以上传到电路板时,它都会给我 2 个错误:
错误 #1:
C:\Users\Jacob\Documents\Arduino\libraries\FFT\fix_fft.cpp:130:13: error:
expected unqualified-id before 'char'
int fix_fft(char fr[], char fi[], int m, int inverse)
^
错误#2:
C:\Users\Jacob\Documents\Arduino\libraries\FFT\fix_fft.cpp:130:13: error:
expected ')' before 'char'
Error compiling.
这是源代码(删除了大量非物质代码):
#define fix_fft
#define __PROG_TYPES_COMPAT__
#include <avr/pgmspace.h>
#include "fix_fft.h"
/* fix_fft.c - Fixed-point in-place Fast Fourier Transform */
#define N_WAVE 256 /* full length of Sinewave[] */
#define LOG2_N_WAVE 8 /* log2(N_WAVE) */
const prog_int8_t Sinewave[N_WAVE-N_WAVE/4] PROGMEM = {
0, 3, 6, 9, 12, 15, 18, 21,
…
};
inline char FIX_MPY(char a, char b)
{
…
}
/*
fix_fft() - perform forward/inverse fast Fourier transform.
fr[n],fi[n] are real and imaginary arrays, both INPUT AND
RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
0 for forward transform (FFT), or 1 for iFFT.
*/
int fix_fft(char fr[], char fi[], int m, int inverse)
{
int mr, nn, i, j, l, k, istep, n, scale, shift;
char qr, qi, tr, ti, wr, wi;
n = 1 << m;
/* max FFT size = N_WAVE */
if (n > N_WAVE)
return -1;
mr = 0;
nn = n - 1;
scale = 0;
/* decimation in time - re-order data */
for (m=1; m<=nn; ++m) {
l = n;
do {
l >>= 1;
} while (mr+l > nn);
mr = (mr & (l-1)) + l;
if (mr <= m)
continue;
tr = fr[m];
fr[m] = fr[mr];
fr[mr] = tr;
ti = fi[m];
fi[m] = fi[mr];
fi[mr] = ti;
}
l = 1;
k = LOG2_N_WAVE-1;
while (l < n) {
if (inverse) {
/* variable scaling, depending upon data */
shift = 0;
for (i=0; i<n; ++i) {
j = fr[i];
if (j < 0)
j = -j;
m = fi[i];
if (m < 0)
m = -m;
if (j > 16383 || m > 16383) {
shift = 1;
break;
}
}
if (shift)
++scale;
} else {
/*
fixed scaling, for proper normalization --
there will be log2(n) passes, so this results
in an overall factor of 1/n, distributed to
maximize arithmetic accuracy.
*/
shift = 1;
}
/*
it may not be obvious, but the shift will be
performed on each data point exactly once,
during this pass.
*/
istep = l << 1;
for (m=0; m<l; ++m) {
j = m << k;
/* 0 <= j < N_WAVE/2 */
wr = pgm_read_word_near(Sinewave + j+N_WAVE/4);
/*Serial.println("asdfasdf");
Serial.println(wr);
Serial.println(j+N_WAVE/4);
Serial.println(Sinewave[256]);
Serial.println("");*/
wi = -pgm_read_word_near(Sinewave + j);
if (inverse)
wi = -wi;
if (shift) {
wr >>= 1;
wi >>= 1;
}
for (i=m; i<n; i+=istep) {
j = i + l;
tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);
ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);
qr = fr[i];
qi = fi[i];
if (shift) {
qr >>= 1;
qi >>= 1;
}
fr[j] = qr - tr;
fi[j] = qi - ti;
fr[i] = qr + tr;
fi[i] = qi + ti;
}
}
--k;
l = istep;
}
return scale;
}
…
音频转换中还有其他文件。
你认为这条线有什么作用?为什么您认为您的代码中需要它?
#define fix_fft
当预处理器看到行时:
int fix_fft(char fr[], char fi[], int m, int inverse)
它被迫将其翻译成:
int (char fr[], char fi[], int m, int inverse)
现在您可以明白为什么编译器会报错了。
我的首选修复方法是完全删除 #define fix_fft
行。如果您出于某种原因需要它,您可以重命名定义的宏(#define fix_fft_c
表明它是 fix_fft.c
文件)或重命名定义的函数(不要忘记编辑 header 也声明了这个函数——你确实有一个 header 来声明这个函数,不是吗?),或者(真的很反常),使用 #define fix_fft fix_fft
。参见 C 标准,ISO/IEC 9899:2011 — §6.10.3.4 重新扫描和进一步替换:
If the name of the macro being replaced is found during this scan of the replacement list (not including the rest of the source file’s preprocessing tokens), it is not replaced. Furthermore, if any nested replacements encounter the name of the macro being replaced, it is not replaced. These nonreplaced macro name preprocessing tokens are no longer available for further replacement even if they are later (re)examined in contexts in which that macro name preprocessing token would otherwise have been replaced.
问题似乎在这里,
#define fix_fft
此宏会将您代码中具有相同名称的函数名称替换为空 space,这就是您出现错误的原因。 请将宏的名称更改为其他名称,例如 fix_fft_
。
我对整个编程社区还比较陌生,并且一直在玩 Arduino Duemilanove 和 LOL 盾牌。我有一个很棒的想法,可以将它变成一个视觉均衡器,你瞧,已经有人在这么做了 here。
Arduino 工作正常,我可以在上面获取代码 运行。简单的代码,但还是代码。
我遵循了所有关于如何让它工作的说明,并且非常接近。然而,每当我尝试编译 .ino 文件以上传到电路板时,它都会给我 2 个错误:
错误 #1:
C:\Users\Jacob\Documents\Arduino\libraries\FFT\fix_fft.cpp:130:13: error:
expected unqualified-id before 'char'
int fix_fft(char fr[], char fi[], int m, int inverse)
^
错误#2:
C:\Users\Jacob\Documents\Arduino\libraries\FFT\fix_fft.cpp:130:13: error:
expected ')' before 'char'
Error compiling.
这是源代码(删除了大量非物质代码):
#define fix_fft
#define __PROG_TYPES_COMPAT__
#include <avr/pgmspace.h>
#include "fix_fft.h"
/* fix_fft.c - Fixed-point in-place Fast Fourier Transform */
#define N_WAVE 256 /* full length of Sinewave[] */
#define LOG2_N_WAVE 8 /* log2(N_WAVE) */
const prog_int8_t Sinewave[N_WAVE-N_WAVE/4] PROGMEM = {
0, 3, 6, 9, 12, 15, 18, 21,
…
};
inline char FIX_MPY(char a, char b)
{
…
}
/*
fix_fft() - perform forward/inverse fast Fourier transform.
fr[n],fi[n] are real and imaginary arrays, both INPUT AND
RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
0 for forward transform (FFT), or 1 for iFFT.
*/
int fix_fft(char fr[], char fi[], int m, int inverse)
{
int mr, nn, i, j, l, k, istep, n, scale, shift;
char qr, qi, tr, ti, wr, wi;
n = 1 << m;
/* max FFT size = N_WAVE */
if (n > N_WAVE)
return -1;
mr = 0;
nn = n - 1;
scale = 0;
/* decimation in time - re-order data */
for (m=1; m<=nn; ++m) {
l = n;
do {
l >>= 1;
} while (mr+l > nn);
mr = (mr & (l-1)) + l;
if (mr <= m)
continue;
tr = fr[m];
fr[m] = fr[mr];
fr[mr] = tr;
ti = fi[m];
fi[m] = fi[mr];
fi[mr] = ti;
}
l = 1;
k = LOG2_N_WAVE-1;
while (l < n) {
if (inverse) {
/* variable scaling, depending upon data */
shift = 0;
for (i=0; i<n; ++i) {
j = fr[i];
if (j < 0)
j = -j;
m = fi[i];
if (m < 0)
m = -m;
if (j > 16383 || m > 16383) {
shift = 1;
break;
}
}
if (shift)
++scale;
} else {
/*
fixed scaling, for proper normalization --
there will be log2(n) passes, so this results
in an overall factor of 1/n, distributed to
maximize arithmetic accuracy.
*/
shift = 1;
}
/*
it may not be obvious, but the shift will be
performed on each data point exactly once,
during this pass.
*/
istep = l << 1;
for (m=0; m<l; ++m) {
j = m << k;
/* 0 <= j < N_WAVE/2 */
wr = pgm_read_word_near(Sinewave + j+N_WAVE/4);
/*Serial.println("asdfasdf");
Serial.println(wr);
Serial.println(j+N_WAVE/4);
Serial.println(Sinewave[256]);
Serial.println("");*/
wi = -pgm_read_word_near(Sinewave + j);
if (inverse)
wi = -wi;
if (shift) {
wr >>= 1;
wi >>= 1;
}
for (i=m; i<n; i+=istep) {
j = i + l;
tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);
ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);
qr = fr[i];
qi = fi[i];
if (shift) {
qr >>= 1;
qi >>= 1;
}
fr[j] = qr - tr;
fi[j] = qi - ti;
fr[i] = qr + tr;
fi[i] = qi + ti;
}
}
--k;
l = istep;
}
return scale;
}
…
音频转换中还有其他文件。
你认为这条线有什么作用?为什么您认为您的代码中需要它?
#define fix_fft
当预处理器看到行时:
int fix_fft(char fr[], char fi[], int m, int inverse)
它被迫将其翻译成:
int (char fr[], char fi[], int m, int inverse)
现在您可以明白为什么编译器会报错了。
我的首选修复方法是完全删除 #define fix_fft
行。如果您出于某种原因需要它,您可以重命名定义的宏(#define fix_fft_c
表明它是 fix_fft.c
文件)或重命名定义的函数(不要忘记编辑 header 也声明了这个函数——你确实有一个 header 来声明这个函数,不是吗?),或者(真的很反常),使用 #define fix_fft fix_fft
。参见 C 标准,ISO/IEC 9899:2011 — §6.10.3.4 重新扫描和进一步替换:
If the name of the macro being replaced is found during this scan of the replacement list (not including the rest of the source file’s preprocessing tokens), it is not replaced. Furthermore, if any nested replacements encounter the name of the macro being replaced, it is not replaced. These nonreplaced macro name preprocessing tokens are no longer available for further replacement even if they are later (re)examined in contexts in which that macro name preprocessing token would otherwise have been replaced.
问题似乎在这里,
#define fix_fft
此宏会将您代码中具有相同名称的函数名称替换为空 space,这就是您出现错误的原因。 请将宏的名称更改为其他名称,例如 fix_fft_
。