Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
Внизпроблема с большими числами Найти похожие ветки
← →
_ant_ © (2007-11-20 15:15) [0]проблема в следующем:
клиент-сервер. клиент отправляет серверу длину массива, который он хочет получить. сервер забивает массив и отправляет его через tcp/ip.
для длины<90 000 работает, если задать длину >100 000, то перестает работать.
не подскажите из-за чего может не работать?
может с массивом надо по другому работать?
пару команд, как работает.
//сервер
readinteger(maslength);
setlength(pocket,maslength);
забивается массив из файла
writeBuffer(Pocket[0],length(Pocket));
//клиент
writeinteger(maslength);
setlength(pocket,maslength);
ReadBuffer(Pocket[0],length(Pocket));
записывается массив в файл
← →
clickmaker © (2007-11-20 15:16) [1]
> то перестает работать.
"перестает" - это как?
← →
_ant_ © (2007-11-20 15:25) [2]клиент отключается от сервера...
есть блок:
try
except //отключиться от сервера
видно туда попадает, а там стоит
вот поинтерисовался, вдруг есть тонкости использования больших чисел в таком случае.
← →
clickmaker © (2007-11-20 15:28) [3]
> try
> except //отключиться от сервера
> видно туда попадает, а там стоит
посмотри exeption.Message - почему стоит?
← →
Johnmen © (2007-11-20 15:32) [4]
> проблема с большими числами
У меня вот проблема с холодильником, а я ведь не курю!
← →
Сергей М. © (2007-11-20 15:32) [5]
> есть блок:
> try
> except
Пустой блок ?!
> больших чисел
Массив - это не число.
← →
_ant_ © (2007-11-20 15:37) [6]except
on E : Exception do
begin
LockControls(True);
ShowMessage(E.Message);
end;
end;
procedure TfrmMain.LockControls(ALock: Boolean);
var
i : integer;
begin
for i := 0 to componentcount-1 do
if TControl(Components[i]).Tag = 99 then
TControl(Components[i]).Enabled := ALock;
end;
// взято из стандартного примера. как работает не сильно вдавался, а надо бы конечно..
жму на отправить команду(послать запрос) и все, клиент закрывается.
p.s. я не знаю в чем тут трабла именно в массивах или еще в чем
← →
Сергей М. © (2007-11-20 15:40) [7]
> не знаю в чем тут трабла
"Трабла" в том, что находится между try и except
А у тебя там, судя по
> есть блок:
> try
> except
ничего не находится.
следовательно и "траблы" никакой нет)
← →
_ant_ © (2007-11-20 15:45) [8]гы, вот что там находится:
WriteLn(LCommand);
case cboCommands.ItemIndex of
0: LInString := ReadLn;
1: LInString := ReadLn;
2: LInInteger := ReadInteger;
3: LInString := ReadLn;
4: LInString := ReadLn;
end;
if LInInteger <> -1 then
LInString := IntToStr(LInInteger);
if cboCommands.ItemIndex<>5 then begin
lbCommunication.Items.Insert(0,"We said -> " + LCommand);
lbCommunication.Items.Insert(0,"Server said -> " + LInString);
end ;
//вот здесь отправляется команда на получение массива
if cboCommands.ItemIndex=5 then begin
lbCommunication.Items.Insert(0,"We said -> " + LCommand);
AssignFile(tfile,edit2.Text);
reset(tfile);
writeinteger(maslength);
setlength(sdp.DF,maslength);
setlength(pocket,maslength+12);
ReadBuffer(Pocket[0],length(Pocket));
SDP.n:=Getinteger(Pocket,0);
SDP.l:=Getinteger(Pocket,4);
SDP.crc_32:=Getinteger(Pocket,maslength+8);
for i:=8 to maslength+7 do
sdp.DF[i-8]:=pocket[i];
dzapis(maslength);
lbCommunication.Items.Insert(0,"server said -> Bufer prinyat" ) ;
lbCommunication.Items.Insert(0,"We said -> n = " + inttostr(sdp.n));
lbCommunication.Items.Insert(0,"We said -> l = " + inttostr(sdp.l));
lbCommunication.Items.Insert(0,"We said -> crc_32 = " + inttostr(sdp.CRC_32));
crc_32:=$ffffffff;
crc_32:=crc32.CalculateCRC32(sdp.df,maslength );
lbCommunication.Items.Insert(0,"We said -> crc_32 = " + inttostr(crc_32));
closefile(tfile);
end;
← →
_ant_ © (2007-11-20 15:45) [9]гы, вот что там находится:
WriteLn(LCommand);
case cboCommands.ItemIndex of
0: LInString := ReadLn;
1: LInString := ReadLn;
2: LInInteger := ReadInteger;
3: LInString := ReadLn;
4: LInString := ReadLn;
end;
if LInInteger <> -1 then
LInString := IntToStr(LInInteger);
if cboCommands.ItemIndex<>5 then begin
lbCommunication.Items.Insert(0,"We said -> " + LCommand);
lbCommunication.Items.Insert(0,"Server said -> " + LInString);
end ;
//вот здесь отправляется команда на получение массива
if cboCommands.ItemIndex=5 then begin
lbCommunication.Items.Insert(0,"We said -> " + LCommand);
AssignFile(tfile,edit2.Text);
reset(tfile);
writeinteger(maslength);
setlength(sdp.DF,maslength);
setlength(pocket,maslength+12);
ReadBuffer(Pocket[0],length(Pocket));
SDP.n:=Getinteger(Pocket,0);
SDP.l:=Getinteger(Pocket,4);
SDP.crc_32:=Getinteger(Pocket,maslength+8);
for i:=8 to maslength+7 do
sdp.DF[i-8]:=pocket[i];
dzapis(maslength);
lbCommunication.Items.Insert(0,"server said -> Bufer prinyat" ) ;
lbCommunication.Items.Insert(0,"We said -> n = " + inttostr(sdp.n));
lbCommunication.Items.Insert(0,"We said -> l = " + inttostr(sdp.l));
lbCommunication.Items.Insert(0,"We said -> crc_32 = " + inttostr(sdp.CRC_32));
crc_32:=$ffffffff;
crc_32:=crc32.CalculateCRC32(sdp.df,maslength );
lbCommunication.Items.Insert(0,"We said -> crc_32 = " + inttostr(crc_32));
closefile(tfile);
end;
← →
Сергей М. © (2007-11-20 15:49) [10]
> гы
И какая конкретно строчка в этом "гы" вызывает исключение ?
← →
_ant_ © (2007-11-20 15:52) [11]знал бы, не утаил бы эту информацию.
а как это узнать? что нужно переделать?
← →
Сергей М. © (2007-11-20 16:04) [12]Нужно вооружиться встроенным отладчиком и оттрассировать пошагово строки между try и except
← →
_ant_ © (2007-11-20 16:17) [13]ругается при вычислении crc32
на след. строчку:
//при первом способе вычисления
MyCRC32:= MyCRC32 shr 8 xor T[MyCRC32 and $FF xor PData^];
//при втором способе вычисления
mov edx,[esi]
Project Server.exe raised exception class EAccessViolation with message "Access violation at address 0046F792" in module "Server.exe". Read of address 0048C000". Process stopped
вот
← →
clickmaker © (2007-11-20 16:18) [14]
> T[MyCRC32 and $FF xor PData^];
вылез за границы массива?
← →
_ant_ © (2007-11-20 16:35) [15]var T: array [byte] of Cardinal; -
это матрица заполняется ранее.алгоритмом, в ней не должно быть проблем. увеличение элементов ничего не дает, да и по смыслу не нужно.
вся процедура:
procedure CRC32Next(const Data; const Count: Cardinal; var CRC32: Cardinal);
var
MyCRC32, I: Cardinal;
PData: ^Byte;
begin
PData:= @Data;
MyCRC32:= CRC32;
for I:= 1 to Count do begin
MyCRC32:= MyCRC32 shr 8 xor T[MyCRC32 and $FF xor PData^];
Inc(PData);
end;
CRC32:= MyCRC32;
end;
вылез или нет не знаю. повторюсь, а как проверить?
p.s. если убрать вычисление crc32, то все работает.
← →
Сергей М. © (2007-11-20 16:49) [16]
> как проверить?
Вот так:
try
MyCRC32:= MyCRC32 shr 8 xor T[MyCRC32 and $FF xor PData^];
except
on e: EAccessViolation do ShowMessage("Грабли на " + IntToStr(i) + "-ой итерации цикла);
raise;
end;
← →
_ant_ © (2007-11-20 17:11) [17]не ловится. писал так и еще вместо EAccessViolation, просто exception
все равно выводится, приведенная выше ошибка и все.
опытным путем установил, что ошибка возникает на 93565 шаге
← →
Плохиш © (2007-11-20 17:29) [18]
> все равно выводится, приведенная выше ошибка и все.
Детский сад. F7/F8/F9 нажимать Пушкин должен?
← →
Slym © (2007-11-21 09:30) [19]исправлено и немного оптимизировано по скорости
procedure CRC32Next(const Data; const Count: Cardinal; var CRC32: Cardinal);
var
PData: PByte;
I,MyCRC32: Cardinal;
begin
if Count=0 then exit;
PData:= @Data;
I:=Count;
MyCRC32:= CRC32;
repeat
MyCRC32:= MyCRC32 shr 8 xor T[byte(byte(MyCRC32) xor PData^)];
Inc(PData);
Dec(I);
until I=0;
CRC32:= MyCRC32;
end;
← →
Сергей М. © (2007-11-21 09:54) [20]
> не ловится
Значит ошибка не в этой строке, а как всегда в 17-й
← →
Slym © (2007-11-21 10:11) [21]Сергей М. © (21.11.07 9:54) [20]
Значит ошибка не в этой строке
ошибка в том что компилятор при операции
T[MyCRC32 and $FF xor PData^];
индексом к таблице T принимает полный регистр (EAX) а не его младшую часть (AX)
нужно явно указывать диапазон T[byte(MyCRC32 and $FF xor PData^)]; тогда перед использованием индекса его обрубятXOR EAX, $000000FF
до границ байта
← →
Slym © (2007-11-21 10:24) [22]MyCRC32 and $FF - лишнее
хватит byte(MyCRC32)T[byte(byte(byte(MyCRC32) xor PData^))];
← →
_ant_ © (2007-11-21 10:29) [23]спасибо за корректировки.
но тем не менее, все равно возникает ошибка на 93565 шаге вычисления.
(procedure CRC32Next вставил как было написано Slym-ом)
← →
Slym © (2007-11-21 10:36) [24]складывается впечатление что CRC32Next неправильно параметры передаешь а именно параметр Data...
строку вызова CRC32Next давай
← →
_ant_ © (2007-11-21 10:53) [25]//вызов из программы
sdp.CRC_32:=psnCRC32.CRC32Full(sdp.df,maslength) ;
//вызов в модуле psnCRC32
function CRC32Full(const Data; const Count: Cardinal): Cardinal;
begin
//Result:= not 0;
CRC32Next(Data, Count, Result);
Result:= not Result;
end;
sdp.DF:array of byte;
← →
Slym © (2007-11-21 10:59) [26]так и есть!
psnCRC32.CRC32Full(sdp.df[0],maslength) ;
← →
_ant_ © (2007-11-21 11:07) [27]вот это я ...
заработало, как надо.
спасибо, Slym
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c