Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1170672615
bobus
2007-02-05 13:50
2007.12.16
Картинки для панели инструментов


2-1195311260
Dru095
2007-11-17 17:54
2007.12.16
как удалить файл с определенной датой создания


15-1195331712
Petr V. Abramov
2007-11-17 23:35
2007.12.16
Себестоимость и амортизация


15-1195145218
Сусл
2007-11-15 19:46
2007.12.16
Как определить, кто препятствует отключению USB-HDD


2-1195310384
Dru095
2007-11-17 17:39
2007.12.16
Удаление файлов с определенной датой создания..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский