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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2010, 08:05   #1
nikolavna-88
 
Регистрация: 25.04.2010
Сообщений: 5
Вопрос LoadResString

Здравствуйте))) Помогите плз. Пишу диплом: надо обработать wav файл, (содержащий ЧМн сигнал) в соответствии с протоколом морской связи. Только есть косяк, из четырех файлов открывается только один. Точнее возникает ошибка при первой же обработки сигнала - Debbuger Fauilt Noftification
когда жмешь на "ок" окна ошибки появляется окошко thread, с синей строкой
LoadResString
.....
00405B35 6800040000 push $00000400
.....
Помогите пожалуйста!!!

Последний раз редактировалось nikolavna-88; 17.06.2010 в 08:12.
nikolavna-88 вне форума Ответить с цитированием
Старый 17.06.2010, 11:21   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Код:
#include <telepat.h>
using namespace yoda::telepat;

MasterYodaInit(nikolavna-88);
Если код выше не поможет, то можете написать какой компилятор используете, скинуть исходники, указать строку на которой валиться приложение. Тогда попробую вам помочь.
подпись
liljon вне форума Ответить с цитированием
Старый 18.06.2010, 22:22   #3
nikolavna-88
 
Регистрация: 25.04.2010
Сообщений: 5
По умолчанию

Делфи у меня)))

type //тип данных wave- ind
TData16=array[0..127] of SmallInt;
PData16=^TData16;

procedure TForm1.MakeFFT;
var
fftb: TFFTBase; //класс, который реализует БПФ
fFFTComplBuf: ^TComplexArray; //Буфер для хранения комплексных величин
i,j: integer;
begin
GetMem(fFFTComplBuf, SampleCount*SizeOf(TComplex)); //Выделение памяти под массив
j:=0;
while j<= SampleCount-1 do
begin
fftb:=TFFTBase.Create(nil);
GetMem(fFFTComplBuf, 1024*SizeOf(TComplex)); //Выделение памяти под массив
for i:=0 to 1024-1 do //берём блоками по 1024 !!!
begin
fFFTComplBuf[i].Re := fDataBuf[i+j];
fFFTComplBuf[i].Im := 0;
end;
fftb.FFT(Pointer(fFFTComplBuf), 1024, 10, False, 0);

for i:=0 to 1024-1 do //Переносим результат БПФ в исходный массив
begin
//заполняем массив выходными значениями
fDataBuf[i] := fFFTComplBuf[i].Re;
end;
fftb.Free;
FreeMem(fFFTComplBuf, 1024*SizeOf(TComplex)); //Освобождение памяти, выделенной под массив
DrawFFT;
j:=J+ 1024; // '1024 это 2 в десятой степени
for i:=0 to 1024-1 do
begin
fDataBuf[i]:= fDataBuf[i]/(SampleCount{1024}); // нормируем!!!
end;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
F: TFileStream;
Stream: TStream;
begin
if pData<>Nil then FreeMem(pData);
lpFileName:=AllocMem(128);
StrPCopy(lpFileName,FName);

//открытие файла средствами mmSystem
HFile:=mmioOpen(lpFileName,Nil,MMIO _READ or MMIO_ALLOCBUF);
if HFile=0 then
begin
mmioClose(HFile,0);
exit;
end;

//проверка идентификаторов 'RIFF' и 'WAVE'
mmioSeek(HFile,0,SEEK_SET);
ckRIFF:=AllocMem(SizeOf(ckRIFF^));
ckRIFF.fccType:=mmioStringToFOURCC( 'WAVE',MMIO_TOUPPER);
if mmioDescend(HFile,ckRIFF,Nil,MMIO_F INDRIFF)<>0 then
begin
mmioClose(HFile,0);
FreeMem(ckRIFF);
exit;
end;

//проверка идентификатора 'fmt '
ckFMT:=AllocMem(SizeOf(ckFMT^));
ckFMT.ckid:=mmioStringToFOURCC('fmt ',0);
if mmioDescend(HFile,ckFMT,ckRIFF,MMIO _FINDCHUNK)<>0 then
begin
mmioClose(HFile,0);
FreeMem(ckRIFF);
FreeMem(ckFMT);
exit;
end;

//чтение формата
lpFmt:=AllocMem(SizeOf(lpFmt^));
if mmioRead(HFile,LPSTR(lpFmt),SizeOf( lpFmt^))<>SizeOf(lpFmt^) then
begin
mmioClose(HFile,0);
FreeMem(ckRIFF);
FreeMem(ckFMT);
FreeMem(lpFmt);
exit;
end;

//проверка соответствия формата стандарту PCM
if lpFmt.wFormatTag<>WAVE_FORMAT_PCM then
begin
mmioClose(HFile,0);
FreeMem(ckRIFF);
FreeMem(ckFMT);
FreeMem(lpFmt);
exit;
end;

//нахождение идентификатора 'data' и сдвига данных от начала файла
mmioAscend(HFile,ckFMT,0);
ckFMT.ckid:=mmioStringToFOURCC('dat a',0);
if mmioDescend(HFile,ckFMT,ckRIFF,MMIO _FINDCHUNK)<>0 then
begin
mmioClose(HFile,0);
FreeMem(ckRIFF);
FreeMem(ckFMT);
FreeMem(lpFmt);
exit;
end;

dwSize_bytes:=ckFMT.cksize;
dwDataOffset:=ckFMT.dwDataOffset;
FreeMem(lpFileName);
FreeMem(ckRIFF);
FreeMem(ckFMT);
Memo1.Clear;
//передача параметров данных
fDis:=lpFmt.nSamplesPerSec;
nBit:=lpFmt.wBitsPerSample;
nCan:=lpFmt.nChannels;
SampleCount:=dwSize_bytes div (nCan*nBit div 8);
Memo1.Lines.Add('fDis '+IntToStr(fDis));
Memo1.Lines.Add('nBit '+IntToStr(nBit));
Memo1.Lines.Add('nCan '+IntToStr(nCan));
pData:=AllocMem(dwSize_bytes);
Memo1.Lines.Add('dwSize_bytes '+IntToStr(dwSize_bytes));

//чтение данных
mmioSeek(HFile,dwDataOffset,SEEK_SE T);

if mmioRead(HFile,pData,dwSize_bytes)< >dwSize_bytes then
begin
mmioClose(HFile,0);
exit;
end
else
data16:=PData16(pData);
//закрытие файла
mmioClose(HFile,0);

SetLength(fDataBuf, SampleCount-1);
SetLength(fDataBufback, SampleCount-1);
SampleCount:=Trunc(exp((Trunc(Log2( SampleCount div 2))+1)*ln(2))); //вычисление ближайшего большего числа степени 2
for i:=0 to SampleCount-1 do //генерация тестового сигнала
begin
fDataBuf[i] := data16^[nCan*i];
fDataBufback[i]:=data16^[nCan*i];
end;

end;

Последний раз редактировалось nikolavna-88; 18.06.2010 в 22:24.
nikolavna-88 вне форума Ответить с цитированием
Старый 18.06.2010, 22:24   #4
nikolavna-88
 
Регистрация: 25.04.2010
Сообщений: 5
По умолчанию

begin
fDataBuf[i] := data16^[nCan*i];
fDataBufback[i]:=data16^[nCan*i];
end;

вот здесь ошибка, а когда этот Thread выскакивает - не могу скопировать((

Понимаю, что выгляжу полной идиоткой, ну что ж поделать))
nikolavna-88 вне форума Ответить с цитированием
Старый 19.06.2010, 11:34   #5
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

вы дебаггером пользоваться умеете? канечно в дельфи дебаггер оставляет желать лучшего, но все же... мне кажеться nCan*i указывает на индекс в массиве, которого не существует. Получаеться что nCan*SampleCount не должен быть больше 127, проверте это.


Код нужно заключать в тег CODE, иначе не читабельно, может быть именно поэтому никто кроме меня не отвечает
подпись
liljon вне форума Ответить с цитированием
Старый 19.06.2010, 18:58   #6
nikolavna-88
 
Регистрация: 25.04.2010
Сообщений: 5
По умолчанию

Пасиба большое
nikolavna-88 вне форума Ответить с цитированием
Ответ


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