Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
ВнизПочему не правильно работает SetLength? Найти похожие ветки
← →
kir86975 (2009-06-04 11:44) [0]у меня проблема... Не хочет работать процедура 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;
← →
Медвежонок Пятачок © (2009-06-04 11:54) [1]а ты верь тому, что оно тебе говорит.
оно правду говорит
← →
Игорь © (2009-06-04 12:06) [2]
> Медвежонок Пятачок © (04.06.09 11:54) [1]
Говорит правду, но он не верит
← →
kir86975 (2009-06-04 12:09) [3]укажите что в коде не так?
← →
Игорь © (2009-06-04 12:15) [4]
> kir86975 (04.06.09 12:09) [3]
NetAr, TMMVector что такое?
← →
kir86975 (2009-06-04 12:20) [5]NetAr: array of array of array of real;
TMMVector=array of integer;
← →
brother © (2009-06-04 12:22) [6]> NetAr: array of array of array of real;
О_о памяти говорит нет?)
← →
kir86975 (2009-06-04 12:26) [7]ну это не должно быть преградой....Delphi позволяет создавать такие массивы...значит и должен с ними работать. Я бу не сказал, что я их прямо так уж до отказа забиваю.
У меня эта процедура может отработать несколько раз, на какой-то n-ый раз все падает
← →
brother © (2009-06-04 12:27) [8]> на какой-то n-ый раз все падает
все верно, памяти нет)
← →
Игорь © (2009-06-04 12:29) [9]
> kir86975 (04.06.09 12:26) [7]
Ну и флаг тебе в руки, не хочешь сам себе помочь, никто тебе не поможет
← →
kir86975 (2009-06-04 12:38) [10]...
← →
kir86975 (2009-06-04 12:38) [11]Элементы массива S не превышают 10-15 , самих элементов может быть 4-5
← →
kir86975 (2009-06-04 12:39) [12]неужели Delphi не хватает памяти на такой небольшой массивчик?
← →
brother © (2009-06-04 12:41) [13]> Не хочет работать процедура SetLength.
где именно?
← →
kir86975 (2009-06-04 12:42) [14]как увеличить количество выделяемой памяти?
← →
brother © (2009-06-04 12:43) [15]> как увеличить количество выделяемой памяти?
добавь мозгов
← →
Медвежонок Пятачок © (2009-06-04 12:46) [16]как увеличить количество выделяемой памяти?
Увеличить количество вызовов SetLength
← →
Медвежонок Пятачок © (2009-06-04 12:49) [17]как увеличить количество выделяемой памяти?
А зачем ее увеличивать, если ее у тебя и так не хватает?
Надо уменьшать количество выделяемой памяти.
← →
kir86975 (2009-06-04 12:55) [18]Ну чтобы памяти хватало ее выделение надо увеличить.
>Увеличить количество вызовов SetLength
это Вы к чему???
ведь как раз выделение таким образом памяти требует памяти О_о
← →
Dennis I. Komarov © (2009-06-04 12:56) [19]А может от REAL отказаться?
← →
Медвежонок Пятачок © (2009-06-04 12:58) [20]это Вы к чему???
SetLength выделяет память.
и если ты считаешь, что :
Ну чтобы памяти хватало ее выделение надо увеличить.
то надо увеличить число вызовов SetLength
← →
Медвежонок Пятачок © (2009-06-04 13:01) [21]Ну чтобы памяти хватало ее выделение надо увеличить.
А чтобы денег в бюджете хватало, надо увеличить выделение денег из бюджета.
Так?
← →
Игорь © (2009-06-04 13:04) [22]
> Медвежонок Пятачок © (04.06.09 13:01) [21]
Логично Винипух
← →
Sapersky (2009-06-04 13:04) [23]Если заранее известно, сколько нужно выделять - то лучше это делать не в цикле, а перед циклом. Т.е. вместо
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 исправить по тому же принципу.
← →
kir86975 (2009-06-04 13:13) [24]Sapersky, спс хорошая идея
← →
kir86975 (2009-06-04 13:18) [25]Еще кое-что уточню... Сначала программу с этой процедурой я писал в моей оболочке и все работало блестяще. Мне предложили сделать эту программу как часть другой, т.е. написать Длл-ку. Вот уже в Длл-ке этот алгоритм аварийно завершается из-за нехватки памяти... может быть кто-то сталкивался с таким при использовании SetLength???
← →
Игорь © (2009-06-04 13:22) [26]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
← →
Sapersky (2009-06-04 13:31) [27]Не рекомендуется передавать в (возвращать из) DLL"ки дин. массивы, строки и прочие автоматически финализируемые типы. Хотя, если добавить Const, то должно работать нормально:
procedure Teaching(Const S:TMMVector);
← →
kir86975 (2009-06-04 13:39) [28]хорошо, спасибо большое... вот что-то вроде этого я и ждал
← →
Игорь © (2009-06-04 13:47) [29]
> kir86975 (04.06.09 13:39) [28]
> вот что-то вроде этого я и ждал
Ладно уж давай домучаем тебя до конца, продолжай не стесняйся
← →
kir86975 (2009-06-04 13:51) [30]надо время чтобы внести во всю программу советуемые изменения... вечерее напишу что-то изменилось или нет ) спасибо за отзывчивость!
← →
Sapersky (2009-06-04 14:20) [31]procedure Teaching(Const S:TMMVector);
Хотя нет, Const в данном случае не имеет значения. Т.е. его лучше оставить, так чуть быстрее, но с т.з. глючности без разницы.
Проблема с DLL в том, что у неё и проекта разные менеджеры памяти. Поэтому то, что выделено в DLL - должно быть освобождено в DLL, и для основного проекта так же.
← →
Wadim005 (2009-06-04 16:18) [32]попробуй не вот так
SetLength(NetAr,i);
а SetLength(NetAr,length(NetAr)+1);
так точно не прогадаешь, сколько тебе надо элементов
ну и т.д. по уровню массива
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c