Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2012, 09:31   #1
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию Перевод С файла в С++

Здравствуйте. У меня есть библиотека на С написанная под Linux. Можно ли ее как-нибудь переделать под VC++? Подскажите, пожалуйста, как это можно сделать. Она предназначена для работы с речевыми сигналами. Заранее большое спасибо.
Вложения
Тип файла: rar spt.rar (14.0 Кб, 8 просмотров)
varvara16 вне форума Ответить с цитированием
Старый 05.10.2012, 09:29   #2
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

Подскажите, пожалуйста, а как можно переделать параметры командной строки под MFC?

Код:
/* ----- int read_args(int, char **) ----- */
 *  -F, --format=s            signal file format (pcm)
 *  -f, --sample-rate=f       signal sample rate (8000 Hz)
 *  -x, --channel=n           use channel number (n) (1)
 *  -B, --swap                swap input stream samples
 *  -M, --input-bufsize=n     input buffer size (in bytes)
 *  -S, --output-bufsize=n    output buffer size (in bytes)
 *  -k, --pre-emphasis=f      pre-emphasis coefficient (0.95)
 *  -l, --length=f            frame length in ms (20 ms)
 *  -d, --shift=f             frame shift in ms (10 ms)
 *  -w, --window=s       weighting window (hamming)
 *  -n, --num-filter=n     number of filters in the filter-bank (24)
 *  -m, --mel            use MEL frequency scale (off)
 *  -i, --freq-min=f       lower frequency bound (0 Hz)
 *  -e, --energy              add log-energy (off)
 *  -s, --scale-energy=f      scale and normalize log-energy (off)
 *  -L, --segment-length=n    segment length in frames for normalization (whole data)
 *  -Z, --cms                 mean normalization
 *  -v, --verbose             verbose mode
 *  -V, --version             print version number
 *  -h, --help */

int read_args(int argc, char **argv)
{
  int c, i;
  char *p;
  opterr = 0;
  optopt = '!';

  while ((c = getopt_long(argc, argv, "F:f:x:BI:O:k:l:d:w:n:a:mi:u:b:p:r:es:ZRL:DANvVh", longopts, &i)) != EOF)

    switch (c) {

    case 'F':
      if (strcasecmp(optarg, "pcm16") == 0)
	format = SPRO_SIG_PCM16_FORMAT;
      else if(strcasecmp(optarg, "wave") == 0)
	format = SPRO_SIG_WAVE_FORMAT;
      break;

    case 'f':
      Fs = (float)strtod(optarg, &p);
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --sample-rate (use --help to get usage)\n", optarg);
	return(1);
      }
      break;

    case 'x':
      channel = (int)strtol(optarg, &p, 10);
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --channel (use --help to get usage)\n", optarg);
	return(1);
      }
      if (channel < 1 || channel > 2) {
	fprintf(stderr, "sfbcep error -- invalid channel number %d (not in [1,2])\n", channel);
	return(1);
      }
      break;

    case 'B':
      swap = 1;
      break;

    case 'I':
      ibs = (size_t)strtol(optarg, &p, 10) * 1000;
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --input-bufsize (use --help to get usage)\n", optarg);
	return(1);
      }
      break;      

    case 'O':
      obs = (size_t)strtol(optarg, &p, 10) * 1000;
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --output-bufsize (use --help to get usage)\n", optarg);
	return(1);
      }
      break;      

    case 'k':
      emphco = (float)strtod(optarg, &p);
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --pre-emphasis (use --help to get usage)\n", optarg);
	return(1);
      }
      if (emphco < 0 || emphco >= 1.0) {
	fprintf(stderr, "sfbcep error -- invalid pre-emphasis coefficient %f (not in [0,1[)\n", emphco);
	return(1);
      }
      break;

    case 'l':
      fm_l = (float)strtod(optarg, &p);
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --length (use --help to get usage)\n", optarg);
	return(1);
      }
      break;
  ...

    case 'L':
      winlen = (unsigned long)strtol(optarg, &p, 10);
      if (p == optarg || *p != 0) {
	fprintf(stderr, "sfbcep error -- invalid argument %s to --window-length (use --help to get usage)\n", optarg);
	return(1);
      }
      break;

    case 'Z':
      flag |= WITHZ;
      break;

    case 'v':
      trace = 1;
      break;

    case 'V':
      fprintf(stdout, "\nSPro %s -- %s\n\n", VERSION, cvsid);
      exit(0);      
     break;

    case 'h':
      usage();
      exit(0);
      break;

    default:
      fprintf(stderr, "sfbcep error -- unrecognized option %s (use --help to get usage)\n", argv[optind-1]);
      return(1);
    }

  /* ----- basic argument sanity check ----- */
  if (usemel && alpha != 0.0)
    fprintf(stderr, "sfbcep warning -- ignoring --alpha option with --mel specified\n");

  if (f_max != 0.0 && f_min != 0.0 && f_max <= f_min) {
    fprintf(stderr, "sfbcep error -- invalid frequency range specification\n");
    return(1);
  }
  
  if ((flag & WITHN) && ! (flag & WITHD)) {
    fprintf(stderr, "sfbcep error -- cannot suppress static log-energy if delta not set\n");
    return(1);
  }

  if (fm_l < fm_d)
    fprintf(stderr, "sfbcep warning -- using non overlapping frames\n");

  return(0);
}

Последний раз редактировалось Stilet; 06.10.2012 в 13:00.
varvara16 вне форума Ответить с цитированием
Старый 06.10.2012, 00:43   #3
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Если не можешь переписать весь код передай нужные параметры этой функции.
read_args(3,"bla-bla -F +Z /dzh");
ну как-то так.

В вообще-то язык С (С89) полностью совместим с С++. (Т.е. в С нет ничего такого чего бы не было в С++). Правда есть еще С99, но там не много такого чего нет в С++.
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 07.10.2012, 10:39   #4
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

LynXzp, спасибо тебе большое за помощь.
Я хочу переделать весь код. Хочу убрать командную строку. Пока пробую по частям. Хочу попробовать считать звуковой файл wav. Но появляются ошибки чтения. Может быть дело в формате?
Вот функция открытия потока
Код HTML:
# define SPRO_SIG_PCM16_FORMAT 0     /* RAW (linear 16) signal format         */
# define SPRO_SIG_WAVE_FORMAT 1      /* WAVE COMP360 signal format            */

typedef struct {
  char *name;                   /* stream file name (or NULL if stdin)        */
  FILE *f;                      /* input stream (FILE or SP_FILE)             */
  int format;                   /* stream format                              */
  unsigned long nsamples;       /* total number of samples in stream          */
  unsigned long nread;          /* number of samples read from stream         */
  float Fs;                     /* sample rate                                */
  unsigned short nchannels;     /* number of channels                         */
  int nbps;                     /* number of bytes per samples.channel        */
  int swap;                     /* to swap or not to swap?                    */
  sigbuf_t *buf;                /* input buffer                               */
} sigstream_t;                  /* signal input stream */

sigstream_t *CSpro::sig_stream_open(const char *fn, int format, float Fs, size_t nbytes, int swap)
{
  sigstream_t *p;
  char *name;                    /* just a buffer pointer for nice output   */
  int status;

  /* allocate output structure */
  if ((p = (sigstream_t *)malloc(sizeof(sigstream_t))) == NULL) {
	  this->Show(_T("sig_stream_open(): cannot allocate memory"));
    return NULL;
  }

  p->name = NULL;
  p->f = NULL;
  p->buf = NULL;
  p->format = format;
  p->nsamples = 0;
  p->nread = 0;
  p->Fs = Fs;
  p->nchannels = 0;
  p->nbps = 0; // number of bytes per samples.channel
  p->swap = swap;

  /* set stream filename */
  if (fn && strcmp(fn, "-") != 0)
    name = (char *)fn;
  else
    name = NULL;

  /* initialize stream - open input file and read header info */
  switch (format) {

  case SPRO_SIG_PCM16_FORMAT:
    status = sig_pcm16_stream_init(p, name);
    break;

  case SPRO_SIG_WAVE_FORMAT:
    status = sig_wave_stream_init(p, name);
    break;

  default:
    this->Show(_T("sig_stream_open(): unknown stream format"));
    sig_stream_close(p);
    return NULL;
  }

  if (status) {
    this->Show(_T("sig_stream_open(): cannot open input signal stream"));
    sig_stream_close(p);
    return NULL;
  }

  /* allocate buffer */
  if ((p->buf = sig_buf_alloc(nbytes, (unsigned short)(p->nbps))) == NULL) {
    sig_stream_close(p);
    return(NULL);
  }

  return p;
}
Вызываю следующим образом:
Код HTML:
void CHelloWorldDlg::OnBnClickedOk()
{
CSpro spr;
sigstream_t *is;
is=spr.sig_stream_open("s1.wav",SPRO_SIG_WAVE_FORMAT,22050,8,1);
}
Но выдает только ошибку "sig_stream_open(): cannot open input signal stream"
varvara16 вне форума Ответить с цитированием
Старый 07.10.2012, 11:31   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Лучше сохранить командную строку, т.е. просто перекомпилировать linux версию под Windows а UI написать отдельным приложением, которое запускает первое.
waleri вне форума Ответить с цитированием
Старый 07.10.2012, 16:02   #6
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Можно попробовать другой файл

Разделяй и властвуй! Т.е. выведи status
Код:
<<здесь

  case SPRO_SIG_PCM16_FORMAT:
    status = sig_pcm16_stream_init(p, name);
    break;

<<здесь

  case SPRO_SIG_WAVE_FORMAT:
    status = sig_wave_stream_init(p, name);
    break;

<<здесь
Посмотри какая функция из этих его меняет, а потом уже смотреть внутри нее.

waleri, возможно . А вдруг нужны промежуточные данные =) Тогда, консоль там не к месту. curl, sqlite имеют и консольные версии и их можно встроить. Кстати, да, varvara16, если не нужны промежуточные данные можно вызывать библиотеку с нужными параметрами в фоне, а потом принимать ее работу?

Я так делал с curl:
Код:
RunWait("curl -o tmp.html http://sample.com/index.html");
....

void  RunWait(AnsiString RunCmdLine)
{   STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory( &si, sizeof(si) );ZeroMemory( &pi, sizeof(pi) );
    si.cb = sizeof(si);si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = SW_HIDE;
	GS=RunCmdLine;Synchronize(&MemoAdd);
	if(CreateProcess(NULL,RunCmdLine.c_str(),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))	WaitForSingleObject(pi.hProcess, INFINITE);
	CloseHandle( pi.hProcess );		CloseHandle( pi.hThread  );
}
// Функция запускает и ждет завершения консольной команды. Команда запускается в фоне, черное окошко не появляется и не мигает. Но пока запускаемая с консоли программа не завершится функция не возвращает управление и программа "не отвечает". (У меня это было в отдельном потоке, так что не страшно).
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 08.10.2012, 09:32   #7
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

Первая ошибка "sig_wave_stream_init(): cannot open file " появляется из этой фунции

Код HTML:
/* ----------------------------------------------------------------- */
/* ----- int sig_wave_stream_init(sigstream_t *, const char *) ----- */
/* ----------------------------------------------------------------- */
/*
 * Initialize stream for WAVE COMP 360 format. 
 */
int CSpro::sig_wave_stream_init(sigstream_t *f, const char *fn)
{
  struct {
    char riff[4];                 /* String 'RIFF' without \0                */
    long totsize;                 /* Total file size - 8                     */
    char wave[4];                 /* String 'WAVE' without \0                */
    char fmtstr[4];               /* String 'fmt_' without \0                */
    long dum1;                    /* Length of format chunk (0x10)           */
    short dum2;                   /* Always 0x01                             */
    short numchans;               /* Number of channels                      */
    long Fs;                      /* Sample rate (in Hz)                     */
    long nbytespersec;            /* number of bytes/seconde                 */
    short nbytespersample;        /* number of bytes/sample                  */
    /* (1=8 bit mono, 2=8 bit stereo or 16 bit mono, 4= 16 bit stereo)   */
    short nbitspersample;         /* number of bits/samples                  */
    char data[4];                 /* string 'data' without \0                */
    unsigned long datsize;        /* number of data bytes (not samples)      */
  } hdr;

  /* open input file */
  if (fn) {
    if ((f->name = _strdup(fn)) == NULL) {
      this->Show(_T("sig_wave_stream_init(): cannot set stream name ", fn));
      return SPRO_ALLOC_ERR;
    }
    
    if ((f->f = fopen(fn, "rb")) == NULL) {
      this->Show(_T("sig_wave_stream_init(): cannot open file ", fn));
      return SPRO_SIG_READ_ERR;
    }
  }
  else
    f->f = stdin;
  
  /* read WAVE header */
  if (fread(&hdr, sizeof(hdr), 1, f->f) != 1) {
    this->Show(_T("sig_wave_stream_init(): cannot read WAVE header"));
    return SPRO_SIG_READ_ERR;
  }
  
  if (f->swap) {
    sp_swap(&(hdr.numchans), sizeof(short));
    sp_swap(&(hdr.Fs), sizeof(long));
    sp_swap(&(hdr.nbytespersample), sizeof(short));
    sp_swap(&(hdr.datsize), sizeof(long));
  }

  if (strncmp(hdr.riff, "RIFF", 4) != 0 || strncmp(hdr.wave, "WAVE", 4)) {
    this->Show(_T("sig_wave_stream_init(): stream not in WAVE format"));
    return SPRO_SIG_READ_ERR;
  }

  /* set the value we are looking for */
  f->nchannels = (unsigned short)hdr.numchans;
  f->nbps = hdr.nbytespersample / hdr.numchans;
  f->Fs = (float)hdr.Fs;
  f->nsamples = (unsigned long)(hdr.datsize / hdr.nbytespersample); /* number of samples / channel */
  
  /* fprintf(stderr, "nchannels=%d  nbytespersample=%d  datasize=%ld\n", hdr.numchans, hdr.nbytespersample, hdr.datsize); */

  return(0);
}
А затем выскакивает "sig_stream_open(): cannot open input signal stream"

А почему же не удается открыть файл с помощью fopen ?
varvara16 вне форума Ответить с цитированием
Старый 08.10.2012, 09:51   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Потому что файла нет или у вас нет прав доступа. Запускайте отладчик и смотрите на что указывает fn, потом смотрите есть такой файл и тд. Судя по предыдущим постам в имени файла не указана папка, так что поиск будет в текущей папке процесса. Лучше всего указывать полный путь - C:\Path\File.ext

Последний раз редактировалось waleri; 08.10.2012 в 09:55.
waleri вне форума Ответить с цитированием
Старый 15.10.2012, 10:30   #9
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

waleri, спасибо большое за подсказку. Я ввела полный путь следующим образом: is=spr.sig_stream_open("C:\\alize\\ frf01_s02_fast.wav",SPRO_SIG_WAVE_F ORMAT,44100,16,0);

Сейчас пытаюсь реализовать следующую функцию:
CFFT furye;
furye.dct_init(24, 12);

Но появляется ошибка
Цитата:
Первый этап обработки исключения в "0x54be723c (msvcr100d.dll)" в "HelloWorld.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcdc8".
Необработанное исключение в "0x54be723c (msvcr100d.dll)" в "HelloWorld.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcdc8".
С чем это может быть связано? Помогите, пожалуйста, разобраться. Вот код самой функции

Код HTML:
/* -------------------------------------------------------- */
/* ----- int dct_init(unsigned short, unsigned short) ----- */
/* -------------------------------------------------------- */
/*
 * Initialize or reset DCT kernel
 */
int CFFT::dct_init(unsigned short nin, unsigned short nout)
{
  float *kp;
  unsigned short i, j;

  if (nin && nout) {
    if ((_dctk = (float **)realloc(_dctk, nout * sizeof(float *))) == NULL) {
      this->Show(_T("[SPro erro r%d] DCTInit(): cannot allocate DCT kernel", SPRO_ALLOC_ERR));
      return(SPRO_ALLOC_ERR);
    }
    
    for (i = 0; i < nout; i++) {

      if ((_dctk[i] = (float *)realloc(_dctk[i], nin * sizeof(float))) == NULL) {
	this->Show(_T("[SPro error %d] DCTInit(): cannot allocate DCT kernel", SPRO_ALLOC_ERR));
	while(i)
	  free(_dctk[--i]);
	free(_dctk);
	return(SPRO_ALLOC_ERR);
      }
      
      kp = *(_dctk+i);
      for (j = 0; j < nin; j++)
	*(kp+j) = (float)cos(M_PI * (i + 1.0) * (j + 0.5) / nin);
    }
    
    _dctz = (float)sqrt(2.0 / nin);
    _dctnin = nin;
    _dctnout = nout;
  }
  else {
    if (_dctk) {
      for (i = 0; i < _dctnout; i++)
	if (*(_dctk+i))
	  free(*(_dctk+i));
      free(_dctk);
    }
    _dctnin = _dctnout = 0;
  }

  return(0);
}
varvara16 вне форума Ответить с цитированием
Старый 15.10.2012, 11:38   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Обращение к CDCDCD памяти обычно связано с выделением памяти но без последующего инициализирования.

Ref:
http://www.microsoft.com/msj/1198/c/c1198.aspx
http://www.softwareverify.com/memory-bit-patterns.php
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод exe-файла игры Rote Rakete Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 10.04.2012 21:18
Перевод каретки при чтении строк из файла MartinSeptim Общие вопросы C/C++ 1 02.04.2012 00:19
Перевод бат файла на язык ассемблера stdio Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 36 28.02.2012 03:08
Перезапись файла без путя или определение расположения файла программы The Best Общие вопросы Delphi 4 13.07.2009 22:50
перевод таблицы из текстового файла в таблицу paradox7.0 ГОСЕАН БД в Delphi 4 19.07.2007 15:12