PDA

Просмотр полной версии : > 2 GB


supernewbie
16.11.2011, 09:53
заметил что приложения скомпиленые на делфи не могут аллочить > 2 гб памяти, погуглил - нагуглил тока то, что можно юзать какую-то глючную директиву, либо вроде где-то было написано что нужен 64 битный компилятор чтобы компилил 64 битное приложение
так как аллочить > 2 гб?

alexteam
16.11.2011, 11:14
3 макс.

так как аллочить > 2 гб?
tfilestream

supernewbie
16.11.2011, 18:26
не не, тада перефразирую - 3 макс это на делфи?
потому что я видел ак аллочат 4 гб и больше

Добавлено через 4 минуты
http://habrahabr.ru/blogs/delphi/116866/

хм, есть ещё инфа по этому делу?

alexteam
16.11.2011, 18:41
не не, тада перефразирую - 3 макс это на делфи?
32 бита = 4гб адресация.
32 битное приложение адресует 4гб+ ?
где видел ? )

supernewbie
16.11.2011, 18:44
не, я ниче не грил что оно 32 битное)

поэтому и грю, че там с 64 битным компилятором?

alexteam
16.11.2011, 18:49
че там с 64 битным компилятором
http://www.embarcadero.com/company/contact-us

supernewbie
16.11.2011, 23:04
скачал rad studio xe2, опять аллочит тока 7.5, дальше Out of memory, как его заставить 16 гб аллочить?

alexteam
16.11.2011, 23:07
и куда в тебя стоко лезет то....

supernewbie
17.11.2011, 00:06
в rad studio xe2 ещё какая-то фигня с MySQL, пишет driver could not be properly initialized мб кто знаети из-за чего?

Yegor
17.11.2011, 01:22
supernewbie, ты таки не оставил попытку написать свой delphi l2 сервер? Зачем тебе так много памяти в процессе? Даже java сборки довольствутся 3-4 ГБ даже с геодатой при маленьком онлайне. ))

alexteam
17.11.2011, 01:26
ещё какая-то фигня с MySQL
дай как догадаюсь... дллко просит поинтеры 4 байта.. а ты подсовываеш 8.

Даже java сборки довольствутся 3-4 ГБ даже с геодатой при маленьком онлайне. ))
+ никто не говорит что это должен быть 1 процесс.

SeregaZ
17.11.2011, 02:36
сервер wot на дельфи зафигачте.

supernewbie
17.11.2011, 04:53
supernewbie, ты таки не оставил попытку написать свой delphi l2 сервер? Зачем тебе так много памяти в процессе? Даже java сборки довольствутся 3-4 ГБ даже с геодатой при маленьком онлайне. ))
эт на будущее, малоли, вдруг у меня там будет 100к онлайна!!!11

Добавлено через 42 секунды
дай как догадаюсь... дллко просит поинтеры 4 байта.. а ты подсовываеш 8.
не, не в этом была проблема, почему-то в компиляторе нельзя Connected:=true; сделать а в самом процессе можно, забил на это

Добавлено через 2 часа 8 минут
происходит эксцепшн при вызове:
var
ar:array [word] of byte;

procedure check(a:array of byte; len:word);
begin

end;

begin
check(ar,1000);
end.


а вот так не происходит:

var
ar:array [word] of byte;

procedure check(const a:array of byte; len:word);
begin

end;

begin
check(ar,1000);
end.


в чем прикол?

etoken
17.11.2011, 17:20
мб потому что при конст параметре нет копирования буфера ?
насколько я помню в дельфи через конст организована передача указателя, не ?

З.ы. если скранил - каюсь )

Yegor
17.11.2011, 17:31
мб потому что при конст параметре нет копирования буфера ?
насколько я помню в дельфи через конст организована передача указателя, не ?

З.ы. если скранил - каюсь )

передача с директивой const аналогична передаче с var только с запретом изменять передаваемую переменную. Тоесть переменная передается по ссылке.

Ошибка в первом случае скорее всего потому что delphi по какой то причине неправильно определяет размер передаваемого массива. ХЗ почему.

supernewbie
17.11.2011, 21:11
хех, баг репорт чтоль накатать в ембаркадеро

xkor
17.11.2011, 21:47
supernewbie, Yegor, проблема скорее всего не в том что дельфи не может размер массива определить, а в том что в первом случае в стек будет положен весь массив ar, и в стеке по видимому не хватает места (хотя 65 килобайт по идее в него бы должно было поместиться достаточно спокойно), хотя без текста ошибки ничего сказать точно нельзя.
Вот никак не могу понять, почему народ как минимум пытающийся строить из себя программистов (я уж молчу про тех кто ими и является), когда просит помочь избавиться от ошибки, очень редко предоставляет текст ошибки. Ладно ещё когда текст ошибки это "Access violation...", он как правило ни о чем не говорит если нет стека вызовов, но блин ошибки часто и другие бывают, и весьма информативные...

supernewbie
17.11.2011, 21:57
Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'

и кстати это тока на 64 битном приложении, на 32 нормалды

alexteam
17.11.2011, 21:57
var
ar:array [word] of byte;

procedure check(const a:array of byte; len:word);
begin

end;

begin
check(ar,1000);
end.

мне когдато дестр надавал по шапке за то что в стек хлама кучу ложу.. теперь пытаюсь везде где это критично передавать "4 байта"
если ты не хочешь каждый раз при изменении длинны массива передергивать память то сделай хотябы воттак


type
PData = ^TData;
TData = packed record len:word; data: array[word] of byte; end;




procedure check(p:pdata);
begin
while someshitcounter < p^.len do
dosomeshit(p^.data[someshitcounter]);
end;

var
ar : tdata;
begin
check(ar, 100)

supernewbie
17.11.2011, 22:02
ваще че это за C0000005 она часто че-то вылетает в местах где раньше все работало

Добавлено через 3 минуты
мне когдато дестр надавал по шапке за то что в стек хлама кучу ложу.. теперь пытаюсь везде где это критично передавать "4 байта"
если ты не хочешь каждый раз при изменении длинны массива передергивать память то сделай хотябы воттак


type
PData = ^TData;
TData = packed record len:word; data: array[word] of byte; end;




procedure check(p:pdata);
begin
while someshitcounter < p^.len do
dosomeshit(p^.data[someshitcounter]);
end;

var
ar : tdata;
begin
check(ar, 100)
но ведь если передавать через const\var то идёт тоже самое, ну т.е. передается только поинтер или нет?

alexteam
17.11.2011, 22:06
Копирование массива в стек происходит только при отсутствии const и var