Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Где подвох или правда об Invalid Pointer Operation


Автор: Ариец 25.5.2007, 15:08
Вобщем вот мой курсяк.... Ещё не полный ибо зашёл в тупик.
Что делает курсяк - хеширует вторую таблицу и затем проходя по первой выдаёт в стрингрид соединённые две таблицы.
В чём тупик: при хешировании элементов первые 14 раз всё идёт гладко, но на 15-ом элементе, при его хешировании почему-то возникакет ошибка "Invalid Pointer Operation" - почему, не знаю. Всю голову уже поломал себе. Может вы что подскажете? Заранее благодарен.

Автор: MetalFan 25.5.2007, 15:28
ужасный стиль написания и форматирования кода.... читать неудобно и неприятно.
укажи, в какой строке возникает ошибка.
на вскидку: заменить все length(DynArr)-1, и тем более Length(DynArr) на High(DynArr).
понятно, про что я?

Автор: drkot 25.5.2007, 15:43
MetalFan, чем тебе стиль не понравился?

Автор: MetalFan 25.5.2007, 15:55
например вот этим....
Код

function hashing(quera:string): integer;
var i,j,k,l,l1:integer;
begin
  l:=Length(quera);
  l1:=Length(tbl2);
  j:=0;
  k:=1000;
  for i := 1 to l do
  if i mod 3 = 0
    then begin j := j + ord(quera[i])*k; k:=k div 10; end
    else begin k:=1000; j := j + ord(quera[i])*k; k:=k div 10; end;
    j:= j mod l1;
    if j=0
      then j:=1;
  hashing:=j;
end;

гораздо читабельнее имхо так:
Код

function hashing(quera:string): integer;
var 
  i, j,
  k, 
  l, l1:integer;
begin
  l:=Length(quera);
  l1:=Length(tbl2);
  j:=0;
  k:=1000;
  for i := 1 to l do
    if i mod 3 = 0 then 
    begin 
      j := j + ord(quera[i])*k; 
      k:=k div 10; 
    end
    else 
    begin 
      k:=1000; 
      j := j + ord(quera[i])*k; 
      k:=k div 10; 
    end;
  j:= j mod l1;
  if j=0 then 
    j:=1;
  hashing:=j;
end;


Автор: drkot 25.5.2007, 16:30
MetalFan, при всем уважении, для меня твой стиль тоже неудобен  smile (растянуто сильно)
Ужасно (в моем понимании) это вот так:
Код

delete(str[num],1,pos(' Page ',str[num])+15);
delete(str[num],1,pos('of ',str[num])+7);
s:=copy(str[num],1,pos(' ',str[num])-1);
if pos(',',s)>0 then delete(s,pos(',',s),1);
if pos('+',s)>0 then delete(s,length(s),1);
c_urr:=(strtoint(s)div 100)+1;
end;



if not zaa then begin
k:=1;
j:=spinedit1.value;
end else begin
j:=num;
k:=num;
end;

for i:=k to j do begin
if urls.Count=0 then begin
sock[i].Active:=false;
tek[i]:='';
str[i]:='';
zaa:=false;
//goto new_search;
exit;
end;
zaa:=true;
ssilka[i]:=urls.Strings[0];
urls.Delete(0);
sock[i].Active:=false;
tek[i]:='';
str[i]:='';
timer1[i].Enabled:=true;
stat[i]:=5;

end;

//list:=tstringlist.Create;
//list.Text:=str[num];
//list.SaveToFile('ccccc.htm');
//list.Free;
exit;
end else if pos('ResNoResults.aspx',str[num])>0 then begin
  res_no_res:=res_no_res+1;
if res_no_res>=15 then begin
sock[num].Active:=false;
timer1[num].Enabled:=false;
timer[num].Enabled:=false;

tek[num]:='';
str[num]:='';
zaa:=false;
if num=1 then
timer1[num].Enabled:=true;
stat[num]:=0;
//goto new_search;
exit;


end;
if nayd<10 then begin
 ind:=ind-1;
end;
 //b[num].Color:=clfuchsia;
if  t_urr<=c_urr then begin
tek[num]:='';
str[num]:='';
zaa:=false;
//ind:=ind-1;
//goto new_search1;
timer1[num].Enabled:=true;
exit;
end;
if zaa1 then begin
sock[num].Active:=false;
timer1[num].Enabled:=false;
timer[num].Enabled:=false;

tek[num]:='';
str[num]:='';
zaa:=false;
//goto new_search;
exit;

end;

//zaa1:=true;


//sock[num].Active:=false;
//timer1[num].Enabled:=false;
//timer[num].Enabled:=false;

tek[num]:='';
str[num]:='';
zaa:=false;
//goto new_search1;
timer1[num].Enabled:=true;
stat[num]:=2;
 exit;


end else goto ex;

if stat[num]=5 then
if (pos('HTTP/1.0 302',str[num])>0) or (pos('HTTP/1.1 302',str[num])>0) then begin
//if pos('</html>',str[num])=0 then exit;
delete(str[num],1,pos('location:',ansilowercase(str[num]))+9);
ssilka[num]:=copy(str[num],1,pos(#13#10,str[num])-1);
if (pos('http://',ssilka[num])=0)  then ssilka[num]:='http://carer.com'+ssilka[num];
while pos('set-cookie:',ansilowercase(str[num]))>0 do begin

и 3500 строк в такомже стиле.

Автор: MetalFan 25.5.2007, 18:38
drkot, растянуто, зато читать приятно) имхо
да, 3500 в этом стиле.. жэсть))) имхо таких "писунов" за программирование вообще пускать нельзя

Автор: Yanis 25.5.2007, 19:06
drkot, MetalFan
Ребят, не хотелось бы отвлекать, но коль уж вы скачали, то помогите парню то smile 

Автор: MetalFan 25.5.2007, 19:45
Yanis, ну я указал на явную ошибку... а отладкой влом как-то заниматься... может там еще какой баг

Автор: Ариец 27.5.2007, 00:10
Строка где возникает ошибка:
hashkey:=hashing(tbl2[i].id);
а именно в функции hashing в самомо конце при проходже в 15 раз.

Если вы такие мега культурные кодеры - то должны знать, что у каждого СВОЙ стиль написания. И для МЕНЯ этот стиль удобный, к тому же этот стиль требует науч рук. Поэтому по поводу стиля притензии не принимаются smile Помогите лучше smile

Автор: MetalFan 27.5.2007, 00:35
Цитата(Ариец @  27.5.2007,  00:10 Найти цитируемый пост)
у каждого СВОЙ стиль написания

существует понятие культуры кода. 
если кому-то код свой показываешь, то уж будь добр привести его в читабельный вид ;)
отлаживать и искать ошибки в чужом ужасно оформленном коде... нет уж, я уж лучше своими делами займусь...

Код

procedure HashInit (var hashtable: THashtbl);
var i:integer;
begin
  SetLength(hashtable, Length(tbl2));
  for i:=0 to Length(tbl2) do <- здесь Length заменить на High
    begin
      hashtable[i].used:=false;
      hashtable[i].id:=-1;
    end;
end;

Автор: Ариец 27.5.2007, 13:22
Когда меняю length на High вообще вылетает ошибка о cannot write куда-то там...
Вобщем это не выход.
Чем кстати отличается Length от High если не секрет?

по поводу стиля: если програмист знает своё дело, то он разберётся в ЛЮБОМ коде. Даже если он будет написан в строчку.
Недаром говорят что самая лучшая программа, написанная на Си++ это та, которая написана в одну строчку!
А если вы лишь хотите показать свою аккуратность и понты, извините, подстраиваться под вас не буду. Я лишь попросил помощи.

Автор: aktuba 27.5.2007, 14:28
Ариец, ты немного не прав...

Цитата

если програмист знает своё дело, то он разберётся в ЛЮБОМ коде.


А никто не говорит, что программист не разберется. Тебе говорят, что разбираться в плохо написанном коде тяжело - и это правильно. Да, у каждого свой стиль, но общие правила должны быть... Тебе будет приятно разбираться вот в таком коде:
Код

procedure Etoproceduravydumanadlzprimeraplohogostilzprogrammirovania;
var etoperepennayadlayciklatogepridumanadlaprimeraplohogostilyz, etoperepennayadlayciklatogepridumanadlaprimeraplohogostilya: integer;
begin for etoperepennayadlayciklatogepridumanadlaprimeraplohogostilyz:=1 to 50 do etoperepennayadlayciklatogepridumanadlaprimeraplohogostilya := etoperepennayadlayciklatogepridumanadlaprimeraplohogostilyz + (etoperepennayadlayciklatogepridumanadlaprimeraplohogostilya) * etoperepennayadlayciklatogepridumanadlaprimeraplohogostilyz;


Привер выдуманный, но показывает хорошо, что то, что удобно удному - совершенно не удобно другому. Очень советую почитать книгу "Совершенный код", которая, кстати, обязательна к прочтению в Microsoft. В ней прекрасно описано как надо оформлять код...

Добавлено через 1 минуту и 35 секунд
Цитата

А если вы лишь хотите показать свою аккуратность и понты, извините, подстраиваться под вас не буду. Я лишь попросил помощи. 


Тебе как-раз никто ничего не показывает. Тебя просят оформить так, чтобы было легче разобраться в твоем коде и проще было найти ошибку, о чем ты и просил!

Автор: MetalFan 27.5.2007, 15:34
Цитата(Ариец @  27.5.2007,  13:22 Найти цитируемый пост)
Когда меняю length на High вообще вылетает ошибка о cannot write куда-то там...
Вобщем это не выход.
Чем кстати отличается Length от High если не секрет?

уууу.... вот как у нас тут все запущено... а хелп прочитать - религия не позволяет?
и ошибочку бы не плохо тогда полностью указывать... а не "ну чо-то там куда-то там"...

Цитата(Ариец @  27.5.2007,  13:22 Найти цитируемый пост)
А если вы лишь хотите показать свою аккуратность и понты, извините, подстраиваться под вас не буду. Я лишь попросил помощи.

одно дело, когда в коде надо по своей необходимости разбираться и ПЕРЕДЕЛЫВАТЬ его под себя,
другое - когда просит ПОМОЩИ новис, да еще и с "понтами"...
ну не хочешь элементарную разметку коду сделать - сам свою помойку отлаживай,
раз уж считаешь себя "программистом, знающим свое дело" ;)

Автор: Ариец 27.5.2007, 16:51
Спасибо всем за помощь. Какие добрые програмисты. Никогда таких не видел.

Автор: aktuba 27.5.2007, 17:34
Цитата

Спасибо всем за помощь. Какие добрые програмисты. Никогда таких не видел. 


Да тебе бы и рады помочь, только ты этого не хочешь!

Автор: ils 30.5.2007, 09:45
[оффтоп]

Когда-то прочитал, что имеет смысл ориентироваться на оформление сорцов Борланда. У них типа очень корректное оформление. 

А оформлять свой код надо еще и потому, что, показывая другим свой код, оформленный правильно (по неким общепринятым стандартам), ты показываешь своё уважение к собеседнику. В данном случае, к тем людям, которых ты просишь о помощи.

[/оффтоп]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)