![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не правильно работает SetLength? [D7, WinXP]
kir86975 © (2009-06-04 11:44:00)у меня проблема... Не хочет работать процедура SetLength. Говорит, что якобы не хватает памяти либо в доступе к ячейке памяти отказано.
Вот фрагмент кода:
procedure Teaching(S:TMMVector); //ñîçäàíèå ñåòè
var i,j,k,x,y: integer; w: real;
begin
SetLength(NetAr,0);
//Length(S) - êîë-âî ñëî¸â
//S[I] - êîë-âî íåéðîíîâ íà I ñëîå
for i := 1 to Length(S) - 1 do //ïåðåáèðàåì Ñëîè
begin
SetLength(NetAr,i);
x := S[i]; //êîëè÷åñòâî íåéðîíîâ
y := S[i - 1]; //êîëè÷åñòâî ñâÿçåé ó êàæäîãî íåéðîíà ñ ïðåäûäóùèì ñëîåì
for j := 1 to x do //ïåðåáèðàåì Íåéðîíû
begin
SetLength(NetAr[i - 1],j);
Randomize;
for k := 1 to y do //ïåðåáèðàåì Âåñà
begin
w := Random - Random;
SetLength(NetAr[i - 1,j - 1],k);
NetAr[i - 1,j - 1,k - 1] := w;
end;
SetLength(NetAr[i - 1,j - 1],y + 1);
NetAr[i - 1,j - 1, y] := Random - Random; //çàïîìèíàåì çíà÷åíèå ñäâèãà w0
end;
end;
end;
Wadim005 (2009-06-04 16:18:00) [1]попробуй не вот так
SetLength(NetAr,i);
а SetLength(NetAr,length(NetAr)+1);
так точно не прогадаешь, сколько тебе надо элементов
ну и т.д. по уровню массива
Sapersky (2009-06-04 14:20:00) [2]procedure Teaching(Const S:TMMVector);
Хотя нет, Const в данном случае не имеет значения. Т.е. его лучше оставить, так чуть быстрее, но с т.з. глючности без разницы.
Проблема с DLL в том, что у неё и проекта разные менеджеры памяти. Поэтому то, что выделено в DLL - должно быть освобождено в DLL, и для основного проекта так же.
kir86975 (2009-06-04 13:51:00) [3]надо время чтобы внести во всю программу советуемые изменения... вечерее напишу что-то изменилось или нет ) спасибо за отзывчивость!
Игорь (2009-06-04 13:47:00) [4]
> kir86975 (04.06.09 13:39) [28]
> вот что-то вроде этого я и ждал
Ладно уж давай домучаем тебя до конца, продолжай не стесняйся
kir86975 (2009-06-04 13:39:00) [5]хорошо, спасибо большое... вот что-то вроде этого я и ждал
Sapersky (2009-06-04 13:31:00) [6]Не рекомендуется передавать в (возвращать из) DLL'ки дин. массивы, строки и прочие автоматически финализируемые типы. Хотя, если добавить Const, то должно работать нормально:
procedure Teaching(Const S:TMMVector);
Игорь (2009-06-04 13:22:00) [7]kir86975 (04.06.09 13:18) [25]
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
Пользуй WideString
kir86975 (2009-06-04 13:18:00) [8]Еще кое-что уточню... Сначала программу с этой процедурой я писал в моей оболочке и все работало блестяще. Мне предложили сделать эту программу как часть другой, т.е. написать Длл-ку. Вот уже в Длл-ке этот алгоритм аварийно завершается из-за нехватки памяти... может быть кто-то сталкивался с таким при использовании SetLength???
kir86975 (2009-06-04 13:13:00) [9]Sapersky, спс хорошая идея
Sapersky (2009-06-04 13:04:00) [10]Если заранее известно, сколько нужно выделять - то лучше это делать не в цикле, а перед циклом. Т.е. вместо
for i := 1 to Length(S) - 1 do begin
SetLength(NetAr,i);
нужно написать
SetLength(NetAr, Length(S));
for i := 1 to Length(S) - 1 do begin
и все остальные SetLength исправить по тому же принципу.
Игорь (2009-06-04 13:04:00) [11]
> Медвежонок Пятачок © (04.06.09 13:01) [21]
Логично Винипух
Медвежонок Пятачок (2009-06-04 13:01:00) [12]Ну чтобы памяти хватало ее выделение надо увеличить.
А чтобы денег в бюджете хватало, надо увеличить выделение денег из бюджета.
Так?
Медвежонок Пятачок (2009-06-04 12:58:00) [13]это Вы к чему???
SetLength выделяет память.
и если ты считаешь, что :
Ну чтобы памяти хватало ее выделение надо увеличить.
то надо увеличить число вызовов SetLength
Dennis I. Komarov (2009-06-04 12:56:00) [14]А может от REAL отказаться?
kir86975 (2009-06-04 12:55:00) [15]Ну чтобы памяти хватало ее выделение надо увеличить.
>Увеличить количество вызовов SetLength
это Вы к чему???
ведь как раз выделение таким образом памяти требует памяти О_о
Медвежонок Пятачок (2009-06-04 12:49:00) [16]как увеличить количество выделяемой памяти?
А зачем ее увеличивать, если ее у тебя и так не хватает?
Надо уменьшать количество выделяемой памяти.
Медвежонок Пятачок (2009-06-04 12:46:00) [17]как увеличить количество выделяемой памяти?
Увеличить количество вызовов SetLength
brother (2009-06-04 12:43:00) [18]> как увеличить количество выделяемой памяти?
добавь мозгов
kir86975 (2009-06-04 12:42:00) [19]как увеличить количество выделяемой памяти?
brother (2009-06-04 12:41:00) [20]> Не хочет работать процедура SetLength.
где именно?