Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.16;
Скачать: CL | DM;

Вниз

проблема с большими числами   Найти похожие ветки 

 
_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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.018 c
15-1194954330
Slimer
2007-11-13 14:45
2007.12.16
Открытие *.qrt файлов


1-1189937206
sdubaruhnul
2007-09-16 14:06
2007.12.16
Общий паттерн нескольких строк


15-1195035397
NX
2007-11-14 13:16
2007.12.16
Языки програмирования под АПП?


10-1141092748
Bratskiy
2006-02-28 05:12
2007.12.16
Доступ к внутреннему словарю Word (не Custom.dic)


2-1195642569
Alex_C
2007-11-21 13:56
2007.12.16
Странная проблема с ShowMessage