2015-12-29 4 views
1

Я относительно не знаком со всем окружением программирования и играл с Arduino Duemilanove и экраном LOL. У меня была эта замечательная идея превратить ее в визуальный эквалайзер, и вот, были люди, которые уже делают это here.Ожидаемый неквалифицированный идентификатор до «char»

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

… 

В преобразовании звука есть и другие файлы.

+0

Добро пожаловать в Переполнение стека. Прочитайте страницу [About] слишком долго. Благодарим вас за включение кода; это определенно облегчило вашу проблему. Однако в вашем файле было очень много кода. Пожалуйста, прочитайте о том, как создать MCVE ([Как создать минимальный, полный и проверенный пример?] (Http://stackoverflow.com/help/mcve)) или SSCCE ([Short, Self-Contained, Correct Example] (http://sscce.org/)) - два имени и ссылки для одной и той же базовой идеи. На этот раз я очистил много кода, но очистка может быть еще более безжалостной. –

ответ

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 Повторное сканирование и далее замена:

Если имя макроса заменяется обнаруживается во время этой проверки списка замены (не включая остальная часть токенов предварительной обработки исходного файла), он не заменяется. Кроме того, если какие-либо вложенные замены встречают имя заменяемого макроса, оно не заменяется. Эти неперемещаемые маркеры предварительной обработки макросов больше не доступны для дальнейшей замены, даже если они позже (повторно) рассмотрены в контекстах, в которых токен предварительной обработки макросов, в противном случае был бы заменен.

+0

Огромное вам спасибо –

1

Проблема кажется здесь,

#define fix_fft 

Этот макрос будет заменить имя функции с таким же именем в коде с пустым пространством, и поэтому у вас есть ошибка. Измените имя макроса на что-то еще, например fix_fft_.

+0

Эй, спасибо, я переименовал его, и он работает нормально. –

+0

Диагноз правильный; Я не уверен в рецепте. Первый вопрос, вероятно, должен быть «почему вы думаете, что макрос' #define fix_fft' нужен вообще? » и, если для этого нет хорошего ответа, средство состоит в том, чтобы удалить эту строку вообще, вместо того, чтобы определять какое-либо другое имя макроса квази-случайным образом. –

Смежные вопросы