Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2015, 08:16   #11
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Ну при наборе в редакторе слова self помощник кода говорит что это именно TCsServer а не PCsServer, в общем в любом случае я имею access violation read of address 0x000000...

У меня д7
Здравствуйте

Последний раз редактировалось NEoMASTERR; 23.06.2015 в 08:23.
NEoMASTERR вне форума Ответить с цитированием
Старый 23.06.2015, 09:10   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Любая объектная переменная это указатель на экземпляр класса или nil. В том числе и Self
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.06.2015, 09:15   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

self ЭТО неявный параметр функции(процедуры)
т.е. локальная переменная размещаемая в стеке и после выхода из процедуры ее НЕ существует, а память указывающая на нее имеет СОВСЕМ другое значение.
и обращение к неизвестной и возможно даже не существующей памяти естественно приводит к черт знает чему.

А вот ЕЕ значение и есть как раз УКАЗАТЕЛЬ на экземпляр обрабатываемого класса. (так устроены ВСЕ объекты в Delphi).

Так что как раз ВОВНЕ надо хранить Pointer(self). "разыменованный"(детипизированн ый) указатель экземпляра (объекта).
и восстанавливать типизацию при необходимости
Код:
TTCsServer(Pointer(self));
конечно же вместо Pointer(self) вы должны написать то где был сохранен нужный экземпляр
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.06.2015 в 09:24.
evg_m вне форума Ответить с цитированием
Старый 23.06.2015, 09:54   #14
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Код:
procedure TCsServerListener.AddServer(pcs: pCsServer);
begin
  if server.IndexOf(pcs)=-1
  then server.Add(pcs);
end;

constructor TCsServer.Create(ip: string; port: Word; rcon: string);
begin
  inherited Create;
  FIp:= ip;
  FPort:=port;
  FRcon:=rcon;
  FListener:=@Listener;     
  FListener^.AddServer(pointer(self));    //<- добавил
  FCounter := 0;
end;
Код:
procedure TCsServerListener.Listen(Sender: TObject);
var
  i,j,x:integer;
  pcs:PCsServer;
begin
if server.count >0 then
for i:=0 to server.count -1 do
begin
  pcs:=PCsServer(Pointer(server[i]));
// в pcs^ unaccessible value

  if pcs^.FRconChallenge = '' then      // error Access Violation
  begin
    GetChallenge(pcs);
  end

end;
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 23.06.2015, 10:06   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
pcs:=PCsServer(Pointer(server[i]));
А тут Pointer зачем? Он же и так указатель там...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2015, 10:09   #16
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А тут Pointer зачем? Он же и так указатель там...
Убрал, эффект тот же
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 23.06.2015, 12:22   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

если мы "засовывали" переменную типа TCsServer
Цитата:
FListener^.AddServer(pointer(self)) ; //<- добавил
то и "доставать" надо ее же (тот же тип!)
Код:
var
  pcs: TCsServer;
...
  pcs:=TCsServer(Pointer(server[i]));
P.S. конечно же без Pointer.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.06.2015 в 12:28.
evg_m вне форума Ответить с цитированием
Старый 23.06.2015, 12:31   #18
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Это один из моих давних проектов, передавал указатель как указатель, а не как T...

Код:
procedure TWSAReceiver.closesock(s: PClientConnected);
begin
  closesocket(s^.socket);
  s^.socket:=0;
  s^.id:=0;
  s^.servstatus:=0;
end;

///
closesock(@parent.client[i]);
Сейчас вроде то же самое, и не работает
Здравствуйте

Последний раз редактировалось NEoMASTERR; 23.06.2015 в 12:39.
NEoMASTERR вне форума Ответить с цитированием
Старый 23.06.2015, 12:37   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
var
  s: TCpServer; // УКАЗАТЕЛЬ на переменную в "ГЛОБАЛЬНОМ хранилище" экземпляров 
  ps: PCpServer; // УКАЗАТЕЛЬ на СВОЮ переменную c указателем конкретного экземпляра 

s:=TCpServer.Create();
ps:=@s;
работа с указателями НАПИСАНИЕ В стиле C(C++)
Код:
var
  ps: PCpServer;
ps:=new(TCpServer); //сначала надо ВЫДЕЛИТЬ память на котрую будем ссылаться
ps:=@(TCpServer.Create());  // а потом с ней работать
НИКОГДА так не работал, так что за правильность не ручаюсь.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.06.2015 в 12:45.
evg_m вне форума Ответить с цитированием
Старый 23.06.2015, 12:55   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ps:=new(TCpServer); //сначала надо ВЫДЕЛИТЬ память на котрую будем ссылаться
Это не нужно, потому что ps, как я понял, получает указатель из TList.
Цитата:
ps:=@(TCpServer.Create()); // а потом с ней работать
Автор в конструкторе объекта помещает указатель на объект в список. Так что это тоже сомнительная операция.

P.S. Единственное, что могу сказать - не работать в ООП с указателями. По крайней мере в Делфи при наличии кучи спецклассов для такого дела.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели СИ. Morowind Помощь студентам 1 12.09.2012 19:20
Указатели человек&кошка Помощь студентам 2 15.02.2012 07:26
указатели Артэс Общие вопросы C/C++ 11 07.02.2010 16:47
Указатели IceBreaker Общие вопросы C/C++ 9 05.02.2010 09:11
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39