2013-05-15 4 views
1

Работа с .wav file ... * ptr_8 и * ptr_16 - указатели на массивы образцов.ошибка: ожидаемое выражение перед 'unsigned'

Я хочу сделать программу, чтобы объявить эти указатели в зависимости от данных заголовка (если 8 BitsPerSample ---> DECLARE * ptr_8 ...)

if (hdr.S1.BitsPerSample == 8)  // Declaring array for samples. Depending 
             // on header's data (8 or 16 bits). 
    unsigned char *ptr_8; 
else 
    if (hdr.S1.BitsPerSample == 16) 
     unsigned short *ptr_16; 

Проблема в том, что он пишет:

error: expected expression before 'unsigned' 

на обе линии (где должны быть объявлены *ptr_8 и *ptr_16), хотя я не вижу причины такого поведения. Расскажите, пожалуйста, что не так.


UPDATE:

Как оказалось, декларация времени компиляции концепции (см принятый ответ ниже).

Переменные объявляются при компиляции, поэтому один раз он получает ресурсы машины, а затем (когда вы скомпилировали приложение) все они уже объявлены там. Это означает, что это был один из худших способов попытаться оптимизировать программу ...

+0

Что делать, если вы замените 'hdr.S1.BitsPerSample == 8' на' true'? –

+0

Он пишет: '' true 'uneclared (первое использование в функции) '. – yulian

ответ

5

Вы не можете условно формулировать объявления переменных на основе условий выполнения: обе переменные должны быть объявлены безоговорочно, хотя остальная часть кода идет использовать только один из них.

Единственный способ сделать объявления условными - использовать условную компиляцию препроцессора, которая не выглядит применимой, поскольку ваше условие основано на заголовке файла, поэтому оно явно является исполняемым.

Вы можете поставить обработку в двух ветвях if, как это:

if (hdr.S1.BitsPerSample == 16) { 
    unsigned short *ptr_16; 
    // Use ptr_16 here 
} else if (hdr.S1.BitsPerSample == 8) { 
    unsigned char *ptr_8; 
    // Use ptr_8 here 
} 
// Neither ptr_16 nor ptr_8 is available here 
+0

Проще говоря, означает ли это, что во время компиляции программы объявляются все переменные? Как я понял, это очень плохой способ оптимизировать программу из-за того, что все переменные объявляются при компиляции программы, и они не могут быть объявлены при запуске программы ... Thankx за советы! – yulian

+1

@Julian Правильно, декларация - это концепция времени компиляции. Препроцессор получает доступ к вашей программе перед компилятором, поэтому он может помочь вам скрыть некоторые из объявлений, но после этого компилятор должен увидеть все объявления, которые вы в конечном итоге используете в своем коде. Вы можете ограничить объем деклараций, включив их в фигурные скобки, но при достижении закрывающей скобки заканчивается доступность переменной. – dasblinkenlight

1

Почему вы не можете просто объявить как указатели в любом случае, а затем только заполнить тот, который вы хотите использовать? В любом случае проблема связана с областью - если вы хотите объявить переменные в блоке if, у нее должны быть фигурные скобки, а затем переменные действительны только в этом блоке привязки.

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