main() обязательная функция в языке Си и точка входа в программу.

Каждая программа на языке Си должна содержать функцию 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, &params); // инициализируем 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
2023-03-14



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

callback функции в языке Си.
goto оператор языка Си.
inline ключевое слово языка Си. Встраивание функции в код.
main() обязательная функция в языке Си и точка входа в программу.
return ключевое слово языка Си.
static ключевое слово языка Си.