Каждая программа на языке Си должна содержать функцию main(). Эта функция является точкой входа в программу - является функцией которая выполняется обязательно и самой первой. Все остальные функции вызываются явно или неявно через функцию main().
Простейшая программа на Си, выводящая в консоль сообщение 'Hello World!'', представлена ниже.
#include <stdio.h> // Требуется для функции printf
int main(){ // Обязательная функция main() - точка входа в программу
printf("Hello World!"); // Вывод сообщения
return 0; // Выход из функции
}
Для использования передаваемых в программу параметров, используется вызов функции с параметрами int main(int argc, char *argv[]), где argc - количество параметров разделенных пробелами, argv - массив строковых параметров. Нулевым параметром всегда является путь с названием исполняемого файла программы.
#include <stdio.h> //printf()
int main(int argc, char *argv[]){ // Функция main с параметрами
for(int i = 0; i < argc; i++){ // Перебираем параметры
printf("Param_%d = %s \n", i, argv[i]); // Выводим параметр
}
}
Запущенная программа без параметров выводит
Param_0 = test.exeЗапущенная с двумя параметрами
test.exe 10 Victor Param_0 = test.exe Param_1 = 10 Param_2 = Victor
Все параметры являются строковыми и их нужно приводить к нужному типу самостоятельно. Для того чтобы каждый раз при запуске не вводить параметры вручную, можно составить командный файл (bat файл) Пример фрагмента реальной программы bat файла для запуска приведен ниже.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "ipp.h"
#include "mgc_ippecho.h"
int main(int argc, char *argv[])
{
int sample_rate = 16000; //частота дискретизации. 8000 или 16000
int filter_length = 200; //Длина фильтра мс. Не более 200
int algorithm = EC_FASTSUBBAND; //алгоритм ЭК. Может быть EC_SUBBAND EC_FULLBAND EC_AFFINESUBBAND EC_FASTSUBBAND
int adapt = AD_FULLADAPT; // Режимы адаптации. Может быть AD_OFF AD_LITEADAPT AD_FULLADAPT
int ah_mode = 1; // анти-рев (разнос фильтра).0-disable, 1-spectra-based HD, 2- energy-based HD
int nlp = 1; // Нелинейный процессор.
unsigned int block_size = 80; // размер блока чтения и обработки. Не менять, в mgc_ippecho.c "IPP Echo canceller frame size is always equal to 160 bytes."
if(argc == 7){ // Берем параметры из командной строки
sample_rate = atoi(argv[1]);
printf("sample_rate = %s \n", argv[1]);
filter_length = atoi(argv[2]);
printf("filter_length = %s \n", argv[2]);
algorithm = atoi(argv[3]);
printf("algorithm = %s \n", argv[3]);
adapt = atoi(argv[4]);
printf("adapt = %s \n", argv[4]);
ah_mode = atoi(argv[5]);
printf("ah_mode = %s \n", argv[5]);
nlp = atoi(argv[6]);
printf("nlp = %s \n", argv[6]);
}
long int start_time = clock(); //время начала выполения программы
FILE *file_far = fopen((char*)"far.wav", "rb"); // файл дальнего сигнала
FILE *file_mic = fopen((char*)"mic.wav", "rb"); // файл микрофонного сигнала
FILE *file_out= fopen((char*)"out.wav", "wb"); // файл для записи результата
short *buf_far = (short *)malloc(sizeof(short) * block_size); // буфер far
short *buf_mic = (short *)malloc(sizeof(short) * block_size); // буфер mic
short *buf_out = (short *)malloc(sizeof(short) * block_size); // буфер out
fread(buf_far, 1, 44, file_far); // читаем заголовок файла
fread(buf_far, 1, 44, file_mic); // читаем заголовок файла
fwrite(buf_far, 1, 44, file_out); // пишем заголовок файла в выходной файл
mgc_ippecho_init(); // выводим данные о библиотеке
CommandLineParams params; // структура с параметрами ЭК
strcpy(params.ECName, "IPP_EC_INT"); // имя чего-то там
params.alg = algorithm; //EC_SUBBAND
params.freq = sample_rate; //частота дискретизации
params.tail = filter_length; // длина адаптивного фильтра
params.ah_mode = ah_mode;
params.adapt=adapt; //AD_FULLADAPT
params.nlp=nlp; // нелинейный процессор
params.cng=1; // комфортный шум (влияние не замечено)
USC_EC_Params ecParams; // структура для ЭК
ipp_echo_state_init(&ecParams, ¶ms); // инициализируем ecParams. Выводит версии модулей в консоль.
while (!feof(file_far)){ //читаем в цикле файл
fread(buf_far, sizeof(short), block_size, file_far);
fread(buf_mic, sizeof(short), block_size, file_mic);
ipp_echo_cancellation(&ecParams, buf_mic,buf_far, buf_out);
fwrite(buf_out, sizeof(short), (unsigned int)block_size, file_out);
}
printf("process %li ms.", clock() - start_time);
return 0;
}
bat файл с установкой переменных и описанием имеет следующее содержание:
goto start
/***********************
Можно менять значения в строках 13-18 после знака =
Доступные значения: (переменные описаны в usc_ec.h)
sample_rate 16000 8000 Частота дискретизации
filter_length 1 ... 200 Длина фильтра мс. 1-200 для ..SUBBAND и 1 - 16 для EC_FULLBAND
algorithm 0 ... 3 алгоритм ЭК(0 = EC_SUBBAND, 1 = EC_FULLBAND, 2 = EC_FASTSUBBAND, 3 = EC_AFFINESUBBAND)
adapt 0 ... 2 режим ЭК(0 = no adaptation, 1 = full adaptation, 2 = lite adaptation)
ah_mode 0 ... 2 анти-рев (разнос фильтра).0-disable, 1-spectra-based HD, 2- energy-based HD
nlp 0 ... 2 нелинейный процессор (постпроцессор). 0 - disable NLP, 1 or 2 - enable different NLP types
************************/
:start
SET sample_rate=16000
SET filter_length=200
SET algorithm=3
SET adapt=1
SET ah_mode=1
SET nlp=1
IPP.exe %sample_rate% %filter_length% %algorithm% %adapt% %ah_mode% %nlp%
pause