Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.01.2013, 23:13
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию Нехватка памяти и Access Violation

Здравствуйте! У меня возникла серьезная проблема, с которой я уже устал бороться..Не буду пока объяснять всю суть, но в общем: есть процедуры, есть массивы, и есть проблема.. Открываю я wav файл, в котором есть значения и они записываются в массив samp2[j,i]. J - это кол. каналов, I - это кол семплов. Так вот, при открытии маленьких файлов - все в порядке, но при открытии чуть больших - "Access Violetion". Так вот хочу у вас попросить помощи.. так как сам не знаю выхода из этой ситуации. Что вы можете сказать по этому поводу?
Код:
...
  TWavInfo = record
    WaveFormat: TWaveFormat;
    NumSamples: Integer;
    MaxAmplitude: Real;
    MinAmplitude: Real;
    Samples: packed array of array of SmallInt;
  end;
...
Const
  WAVE_FORMAT_PCM = $0001;
  b1=0.01;
  b2=0.2;
  c1=1;
  N0=0.0004;
  delT=0.25;
  Mz=0;
  Dz=1;
  a=25173;
  b=13849;
  c=65536;
  X10=0.16;
  X20=0;
...
  Samp1:        array[1..2, 1..10000000] of  LongInt;
  Samp2:        array[1..2, 1..10000000] of  Real;
  NewSamp:      array[1..2, 1..10000000] of  Real;
  Z: array [0..1000000]of Real;
  X1: array [0..1000000]of Real;
  X2: array [0..1000000] of Real;
  Prost: array [0..1000000]of LongInt;
  ProstCh: array [0..1000000]of Real;
...
//**Считывание основных сэмплов**//
      Sl:=tStringlist.Create;
      for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
        begin
          fs.ReadBuffer(Sample, BytsPerSample);
         case BytsPerSample of
            1: Sample := ShortInt(Sample);
            2: Sample := SmallInt(Sample);
          end;

      WavInfo.Samples[J - 1, I - 1]:=Sample;

      if Sample > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Sample;
      if Sample < WavInfo.MinAmplitude then WavInfo.MinAmplitude := Sample;
        end;
      end;
    WavInfo.NumSamples := LongInt(NumSamples);
...
//**Создание массивов из основных сэмплов**//                                
                                                                             
 for I := 1 to NumSamples do                                                  
    for J := 1 to WavInfo.WaveFormat.nChannels do                            
      begin                                                                  
      Samp1[j,i]:=WavInfo.Samples[J - 1, I - 1];                            
      Samp2[j,i]:=WavInfo.Samples[J - 1, I - 1] / 32767; // нормировка значений    
      if form1.chk1.Checked = False then                                   
          begin                                                                                           //
            sl.Add(FloatToStr(samp1[J , I ]));                              
          end else                                                            
          begin                                                                                           //
            sl.Add(FloatToStr(samp2[J , I ]));                              
          end;                                                               
      end;      
...
procedure TForm1.Encoding;
var
  I,J:Integer;
  Z1: real;
  Y1: real;
  Zmin , Zmax : Integer;
  Fm:Real;
begin
  I:=1;
  J:=0;

  FillChar(Prost, SizeOf(Prost),0);
  FillChar(ProstCh, SizeOf(ProstCh),0);
  Prost[0]:= StrToInt(sEdit3.Text) ;
  Zmin := StrToInt('-'+sEdit4.Text) ;
  Zmax := StrToInt(sEdit4.Text) ;
  Fm:=1/Sqrt(2*PI);
 repeat
    Z1:=0;
  Y1:=0;
  Prost[i]:= (a*(Prost[i-1])+b) mod c;
  Prost[i+1]:= (a*(Prost[i])+b) mod c;
  ProstCh[i]:=Prost[i]/c;
  ProstCh[i+1]:=Prost[i+1]/c;

  Z1:=Zmin+(Zmax-Zmin)* ProstCh[i];
  Y1:=Fm* ProstCh[i];
  if y1<=1/Sqrt(2*PI)*exp(-Sqr(z1)/2) then
  begin
   Inc(j);
   z[j]:=z1;

  end;
  inc(i,2);
 Until j=WavInfo.NumSamples;
 NextStepEncoding;
end;
...  
procedure TForm1.NextStepEncoding;
var
  f: Integer;
begin
  f:=1;
  X1[0]:=0.16;
  X2[0]:=0;
for I := 1 to NumSamples do
 for J := 1 to WavInfo.WaveFormat.nChannels do
  begin
  X1[f]:=X1[f-1]+X2[f-1]*delT;
  X2[f]:=X2[f-1]+Z[f]*sqrt(N0*DelT)-(b1*X2[f-1]+b2*Abs(X2[f-1])*X2[f-1]+c1*X1[f-1]+Samp2[j,i]*sqr(X1[f-1])*X1[f-1])*delT;


  //sMemo1.Lines.Add(FloatToStr(X1[i]));
  inc(f);
  end;
  ShowMessage('Готово');

end;                  
P/S: Все массивы сделал глобальными, что бы не было ошибки "Stack is overload"
Возникает постоянная нехватка памяти.. так же есть сомнения в правильности главной формулы:
Код:
  X1[f]:=X1[f-1]+X2[f-1]*delT;
  X2[f]:=X2[f-1]+Z[f]*sqrt(N0*DelT)-(b1*X2[f-1]+b2*Abs(X2[f-1])*X2[f-1]+c1*X1[f-1]+Samp2[j,i]*sqr(X1[f-1])*X1[f-1])*delT;
Прошу мне помочь! Пожалуйста не оставляете в беде! Вот формула такая, какой она должна быть:
Ответить с цитированием
  #2  
Старый 25.01.2013, 13:21
caHek-2x caHek-2x вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 31
Репутация: 11
По умолчанию

а не жирноватые ли массивы на 10 000 000 элементов ?
вот тебе и нехватка памяти. .. )
Ответить с цитированием
Этот пользователь сказал Спасибо caHek-2x за это полезное сообщение:
Dmitry_DM (26.01.2013)
  #3  
Старый 25.01.2013, 13:44
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

Цитата:
Сообщение от Dmitry_DM
так же есть сомнения в правильности главной формулы:
а сомнений в том что ты вообще делаешь\алгоритме не возникает у меня вот сразу возникло
Ответить с цитированием
Этот пользователь сказал Спасибо my33oh за это полезное сообщение:
Dmitry_DM (26.01.2013)
  #4  
Старый 25.01.2013, 16:50
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Код:
...
    Samples: packed array of array of SmallInt;
  end;
Тут описан динамический массив. В коде не встретил ни одного SetLength.
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Dmitry_DM (26.01.2013)
  #5  
Старый 25.01.2013, 16:57
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

Цитата:
Сообщение от Freeman
Тут описан динамический массив. В коде не встретил ни одного SetLength.
зато там есть многоточия
написано же
Цитата:
Сообщение от Dmitry_DM
Не буду пока объяснять всю суть
т.е. секретно-загадочный проект

Последний раз редактировалось my33oh, 25.01.2013 в 16:59.
Ответить с цитированием
  #6  
Старый 25.01.2013, 17:38
OTVET2 OTVET2 вне форума
Прохожий
 
Регистрация: 29.11.2012
Адрес: http://crprogram.16mb.com
Сообщения: 9
Репутация: выкл
По умолчанию

Код:
Samp1:        array[1..2, 1..10000000] of  LongInt;
  Samp2:        array[1..2, 1..10000000] of  Real;
  NewSamp:      array[1..2, 1..10000000] of  Real;
  Z: array [0..1000000]of Real;
  X1: array [0..1000000]of Real;
  X2: array [0..1000000] of Real;
  Prost: array [0..1000000]of LongInt;
  ProstCh: array [0..1000000]of Real;
Real 6 байт тогда

6 * 2 * 10000000 * 6 = 720 000 000 байт

720 МБ как минимум, и это только на 6 таблиц.
Ответить с цитированием
Этот пользователь сказал Спасибо OTVET2 за это полезное сообщение:
Dmitry_DM (26.01.2013)
  #7  
Старый 25.01.2013, 18:05
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Dmitry_DM, стукнись в аську, есть о чем поговорить по твоей теме.

Ты кодек пишешь или что?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Dmitry_DM (26.01.2013)
  #8  
Старый 25.01.2013, 19:20
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от OTVET2
Real 6 байт тогда
Не в Delphi. В Delphi Real -- синоним Double, 8 байт.
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Dmitry_DM (26.01.2013)
  #9  
Старый 26.01.2013, 01:15
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Freeman, OTVET2, caHek-2x спасибо вам за отклик и пояснения проблемы. Особую благодарность выражаю M.A.D.M.A.N. за его желание мне помочь! Человек нашел время заняться моей проблемой. Это стоит огромного уважение! Спасибо вам огромное, M.A.D.M.A.N. Еще раз всем спасибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:34.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025