|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.09.2012, 09:31 | #1 |
Пользователь
Регистрация: 05.11.2007
Сообщений: 57
|
Перевод С файла в С++
Здравствуйте. У меня есть библиотека на С написанная под Linux. Можно ли ее как-нибудь переделать под VC++? Подскажите, пожалуйста, как это можно сделать. Она предназначена для работы с речевыми сигналами. Заранее большое спасибо.
|
05.10.2012, 09:29 | #2 |
Пользователь
Регистрация: 05.11.2007
Сообщений: 57
|
Подскажите, пожалуйста, а как можно переделать параметры командной строки под MFC?
Код:
Последний раз редактировалось Stilet; 06.10.2012 в 13:00. |
06.10.2012, 00:43 | #3 |
Пользователь
Регистрация: 04.10.2012
Сообщений: 95
|
Если не можешь переписать весь код передай нужные параметры этой функции.
read_args(3,"bla-bla -F +Z /dzh"); ну как-то так. В вообще-то язык С (С89) полностью совместим с С++. (Т.е. в С нет ничего такого чего бы не было в С++). Правда есть еще С99, но там не много такого чего нет в С++.
Пишу на чистом С, плюсы спилил.
|
07.10.2012, 10:39 | #4 |
Пользователь
Регистрация: 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); } |
07.10.2012, 11:31 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Лучше сохранить командную строку, т.е. просто перекомпилировать linux версию под Windows а UI написать отдельным приложением, которое запускает первое.
|
07.10.2012, 16:02 | #6 |
Пользователь
Регистрация: 04.10.2012
Сообщений: 95
|
Можно попробовать другой файл
Разделяй и властвуй! Т.е. выведи status Код:
waleri, возможно . А вдруг нужны промежуточные данные =) Тогда, консоль там не к месту. curl, sqlite имеют и консольные версии и их можно встроить. Кстати, да, varvara16, если не нужны промежуточные данные можно вызывать библиотеку с нужными параметрами в фоне, а потом принимать ее работу? Я так делал с curl: Код:
Пишу на чистом С, плюсы спилил.
|
08.10.2012, 09:32 | #7 |
Пользователь
Регистрация: 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); } А почему же не удается открыть файл с помощью fopen ? |
08.10.2012, 09:51 | #8 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Потому что файла нет или у вас нет прав доступа. Запускайте отладчик и смотрите на что указывает fn, потом смотрите есть такой файл и тд. Судя по предыдущим постам в имени файла не указана папка, так что поиск будет в текущей папке процесса. Лучше всего указывать полный путь - C:\Path\File.ext
Последний раз редактировалось waleri; 08.10.2012 в 09:55. |
15.10.2012, 10:30 | #9 | |
Пользователь
Регистрация: 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); Но появляется ошибка Цитата:
Код 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);
}
|
|
15.10.2012, 11:38 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Обращение к CDCDCD памяти обычно связано с выделением памяти но без последующего инициализирования.
Ref: http://www.microsoft.com/msj/1198/c/c1198.aspx http://www.softwareverify.com/memory-bit-patterns.php |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перевод 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 |