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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2014, 22:14   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию Указатели, TList и разыменовывание

ЧЯДНТ?
Код:
var
pTmp: ^TPoint;
lst : TList;
iTmp : integer;
...
begin
...
// читаю  файл, хз, а пишется ли что-то вообще в pTmp? 

 while not EOF(f) do
  begin
    New(pTmp);
     Read(f, i);
     pTmp.X := i;
     Read(f, i);
     pTmp.Y := i;
     lstPntInit.Add(pTmp);
  end;

// пытаюсь как-то достучаться до значения, чтоб посмотреть в отладчике:

iTmp := @TPoint(lstPntInit.Items[i]).X; // ERRORRRR!!
....

end;
Oшибка: Invalid typecast.

...Блин, ваще не курю указатели в дельфях... ((

Собственно, два вопроса:
1) Как работать с TList?
2) почему применим оператор "точка" к pTmp? В с++ это ж ошибка.

Последний раз редактировалось Smogg; 08.03.2014 в 22:18.
Smogg вне форума Ответить с цитированием
Старый 08.03.2014, 22:30   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

В помощь:
TList
Streletz вне форума Ответить с цитированием
Старый 08.03.2014, 22:38   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var pTmp: ^TPoint;
    lst : TList;
    i: integer;
begin
  lst:=TList.Create;
  New(pTmp); pTmp.X:=25; pTmp.y:=35; lst.Add(pTmp);
  New(pTmp); pTmp.X:=5;  pTmp.y:=6;  lst.Add(pTmp);

  for i:=0 to lst.Count-1 do begin
    Memo1.Lines.Add(Format('i=%d X=%d Y=%d',[i,TPoint(lst.Items[i]^).X,TPoint(lst.Items[i]^).Y]));
    FreeMem(lst.Items[i]);
  end;
  lst.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.03.2014, 23:08   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Аватар, спасибо! Теперь понял)

Код:
TPoint(lst.Items[i]^).X
Сначала разыменовываем итем и получаем нечто неясного размера. Затем эту шнягу приводим к нужному типу. Иппанутся алогичность.

Вот жеж дельфи, где не надо - избыточные абстракции, а где надо - нужно помнить про самый низкий уровень, что переменная - это на самом деле индекс ячейки в памяти, где начинается храниться объект.
Smogg вне форума Ответить с цитированием
Старый 08.03.2014, 23:42   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Ап! кагрится)

Еще один вопрос - как удалить объект TPoint?

Код:
Dispose(TPoint(lstPntInit.Items[i]));
Оять - [Error] Unit1.pas(71): Invalid typecast
Smogg вне форума Ответить с цитированием
Старый 08.03.2014, 23:46   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Там не надо TPoint. Просто указатель Dispose(lst.Items[i]);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.03.2014, 00:18   #7
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

То есть, при выделении памяти где-то там в какой-то таблице менеджера памяти указано сколько байт выделено под этот конкретный указатель (типа void)? Поэтому явно размер указывать не надо, он уже компьютеру известен?

Вроде понятно стало.
Smogg вне форума Ответить с цитированием
Старый 10.03.2014, 20:52   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Переменные - указатели
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разыменовывание итератора litviak Общие вопросы C/C++ 5 08.06.2012 14:29
Tlist AngryD Помощь студентам 2 24.02.2012 12:22
delphi TList world12_tk Помощь студентам 3 14.04.2011 18:02
Подкорректирова tList Altera Общие вопросы Delphi 2 11.09.2009 20:24
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39