在char' char之前预期的不合格身份

时间:2015-12-29 04:01:47

标签: c++ arduino char command

我对整个编程社区相对较新,并且正在玩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;
}

…

音频转换中还有其他文件。

2 个答案:

答案 0 :(得分:1)

问题似乎在这里,

#define fix_fft

此宏将使用空格替换代码中具有相同名称的函数名称,这就是您遇到错误的原因。 请将宏名称更改为其他内容,例如fix_fft_

答案 1 :(得分:0)

您认为这条线的作用是什么?为什么您认为代码中根本需要它?

#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文件)或重命名已定义的函数(不要忘记编辑标题,声明函数 - 你有一个标题来声明函数,不是吗?),或者(真正有悖常理),使用#define fix_fft fix_fft。参见C标准,ISO / IEC 9899:2011 - §6.10.3.4重新扫描和进一步更换

  

如果在替换列表的扫描期间(不包括源文件的其余预处理标记)找到要替换的宏的名称,则不会替换它。此外,如果任何嵌套替换遇到要替换的宏的名称,则不会替换它。这些未替换的宏名称预处理令牌不再可用于进一步替换,即使它们稍后(重新)检查其中宏名称预处理令牌将被替换的上下文中。