Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KDA
krast
спецмально сделал маленький пример и дизассемблировал его. (компилятор D7, дизассемблер Ida).
Могу заявить: Явного кода обнуления глобальных переменных нет!.
 
 
Добавлено:
вот текст примера

Код:
 
program tes;
{$APPTYPE CONSOLE}
var a:integer;
begin
  a:=1;
  writeln(a);
end.
 

иследуя код (ассембленый, естественно), видно, что адрес переменной а используется всего 2 раза.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:34 25-05-2005
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OdesitVadim
блин, знал бы я еще asm, все руки не доходят. но по примерам посмотрел счас - да, не компилятор похоже гонит код, поэтому и прошу у КДА натолкнуть на инфу по его версии.
 
Добавлено:
OdesitVadim
а еще глянь что происходит когда а - string
 
Добавлено:
хотя... кажись все, нашел что хотел...

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 15:39 25-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
и объявление а в ассемблерном коде выглядит так

Код:
 
a dd ?
 

но кода вида mov offset a,0 нет
 
Подтверждаются слова KDA
 
Добавлено:
krast
со строками тоже. независимо от того, короткие они (ShortString) или нет

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:44 25-05-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
15:34 25-05-2005
Цитата:
спецмально сделал маленький пример и дизассемблировал его. (компилятор D7, дизассемблер Ida).  
Могу заявить: Явного кода обнуления глобальных переменных нет!.

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

----------
Per Aspera Ad Astra...

Всего записей: 2203 | Зарегистр. 10-08-2003 | Отправлено: 15:58 25-05-2005 | Исправлено: mr_eoi, 16:01 25-05-2005
KDA

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast
По "крайней мере" относилось к другим компиляторам, скажет Turbo Pascal под DOS.
Еще раз: переменные не обнуляются. А обнуляется принадлежащая им область памяти, а это несколько разные вещи. Скажем, в случае Boolean никто не обязан нам гарантировать, что двоичный 0 соответствует false (иначе было бы допустимо НЕЯВНОЕ преобразование в Integer, скажем, а этого нет). Или вот смотри приведенный выше пример с TTest1 - там появляется двоичный нуль, а с т.з. задачи переменая является невалидной. В случае стандартных типов разницы особой нет, но это всего лишь - особенности реализации, и можно закладываться на них, к примеру (как я делаю), но всегда отдавать себе отчет, что это может оказаться временным
 
Со стрингами, кстати, хорошо демонстрируется: на глобах - это тот же двоичный нуль (при операциях сравнения эквивалент ''). Больше похоже на "обнуление" в неглобах: всегда в неявном виде присутствует конструктор и деструктор, плюс еще доп код, т.е, не просто обнуление, а правильнее (извини за грубый псевдокод)
 
var S : String;
begin
  ...
end;
 
превращается в
begin
  S.Init;  //"обнуление"
  try
    ...
  finally  
     S.Free
  end;  
end;
 
C интерфейсами - так же.  Так же, по поводу нулей, можно глянуть реализацию TObject.InitInstance и увидеть, что и Boolean'ы и String'и и вообще все затирается обычными нулями без малейшей поправки на тип
 
ЗЫ.. Почитать - для начала MSDN по структуре PE

Всего записей: 265 | Зарегистр. 30-12-2001 | Отправлено: 16:05 25-05-2005 | Исправлено: KDA, 16:08 25-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mr_eoi
с твоей мыслью полностью согласен
я же написал

Цитата:
a dd ?

это обо всём говорит
"обнуление" выполняет загрузчик, руководствуясь "заметками и указаниями" компилятора, оставленных в exe'шнике, не прога.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 16:17 25-05-2005
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KDA

Цитата:
плюс еще доп код, т.е, не просто обнуление, а правильнее (извини за грубый псевдокод)  

ну, на самом деле, там происходит так:
Pointer(S) := nil;
 
тож самое с дин. массмивами
 
при выходи за пределы зоны видимости _LStrClr(S);
 
ну, короче, практически все функции для работы со строчками и массива подменяются на системные функции.
 
Добавлено:
да, там только разница с константной локальной строчкой - никакого управления памятью вообще для нее не ведется.

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 16:22 25-05-2005 | Исправлено: krast, 16:24 25-05-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast

Цитата:
в классе TMyData определяешь обрабочики событий (методы объекта), создаешь экземпляр этого класса. Ну и там где тебе нужно их прицепить к событиям - просто идет присваивание методов из экземпляра класса TMyData (который ты создал)

Ты наверно плохо посмотрел статью. Программа содержит два модуля. Исходник:

Цитата:
 
program Dataset;
uses
  Forms,
  DB,
  DBGrids,
  DBCtrls,
  Controls,
  DataSet3,  // первый модуль
  MyData; // второй модуль
 
var
  F: TForm;
  DS: TDataSource;
  MyDataSet: TMyDataSet;
  MyDataEx: TMyData;
begin
  Application.Initialize;
  Application.CreateForm(TForm, F);
  F.Width := 300;
  F.Height := 300;
  F.Position := poDesktopCenter;
  MyDataEx :=  TMyData.Create;
  MyDataSet := TMyDataSet.Create(F);
  MyDataSet.Open;
 
  DS := TDataSource.Create(F);
  DS.DataSet := MyDataSet;
  with TDBNavigator.Create(F) do
  begin
    Parent := F;
    Align := alTop;
    DataSource := DS
  end;
  with TDBGrid.Create(F) do
  begin
    Parent := F;
    Align := alClient;
    DataSource := DS
  end;
  Application.Run;
end.
 

Но как сделать чтобы экземпляр TMyData, можно было увидеть(вызвать процедуру) в модуле MyDataSet???

Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 17:53 25-05-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть здесь люди, работавшие с библиотечкой unrar.dll? Приведите, пожалуйста, пример для извлечения архива защищенного паролем. В сети есть много примеров работы с библиотекой, но интересующую меня функцию я еще не встречал.
 
Заранее благодарен...

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 17:59 25-05-2005
KDA

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast

Цитата:
ну, на самом деле, там происходит так:  
Pointer(S) := nil;

На самом деле это именно конструктор, пусть он так и просто выглядит (инлайн, однако)
так же как и _LStrClr(S) в простейшем случае приведет в результате к освобождению памяти - можно сильно не копаться, а просто в сорцы заглянуть

Всего записей: 265 | Зарегистр. 30-12-2001 | Отправлено: 18:06 25-05-2005
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ViktorSila
я пока еще ее вообще не читал... но если тебе надо работать с объектом MyData в классе MyDataSet, передай его его через конструктор например, ну, и понятно, в uses MyDataSet пропиши ссылку на MyData. если я тебя правильно понял.
 
Добавлено:
KDA
дык я не спорю, я уточнил
 

Цитата:
На самом деле это именно конструктор

конешна конструктор, ведь для строки определены счетчик ссылок, флаги по распределении памяти, строки же сидят в динамической памяти

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 18:09 25-05-2005
Fox0001ww



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое спасибо, Господа, за помощь. Весьма признателен.

Всего записей: 2 | Зарегистр. 28-12-2004 | Отправлено: 20:12 25-05-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, как подключить мышку к программе на Паскале и заставить программу обрабатывать клики?
 
Заранее благодарен...

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 11:35 27-05-2005
FAngel



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Larry Laffer
Во первых должен буть запущен драйвер мыши (чего-нибудь типа mouse.com), во вторых через $33 прерывание получаешь все что тебе надо (не забудь прочитать документацию по его использованию).  
P.S. Если найду свои старые исходники (помнится я еще и эмулятор мыши для SVGA режимов писал), могу поделится

Всего записей: 799 | Зарегистр. 04-12-2003 | Отправлено: 13:30 27-05-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
P.S. Если найду свои старые исходники (помнится я еще и эмулятор мыши для SVGA режимов писал), могу поделится

FAngel, было бы очень замечательно.

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 13:36 27-05-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast
В uses прописываю MyData, но выдает ошибку:

Цитата:
 Circular unit reference to 'DataSet3'
 


Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 13:19 28-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ViktorSila
Сделел циклическую ссылку - юниты ссылаються дру на дружку.
Наиболее простой способ решить - uses можно писать как секции interface, так и в implemetation. Поэтому напиши в одном юните в одном месте, а в другом - в другом.
Но если у тебя так получилось, значит неакуратно програмишь. Обычно решаеться перетаскиванием определением некоторых переменных с одного юнита в другой.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 14:27 28-05-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, как можно (и можно ли вообще) в стандартной компоненте PopupMenu выделить один Caption жирным шрифтом?

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 09:42 29-05-2005 | Исправлено: Larry Laffer, 09:44 29-05-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Larry Laffer
09:42 29-05-2005
Цитата:
Подскажите, как можно (и можно ли вообще) в стандартной компоненте PopupMenu выделить один Caption жирным шрифтом?

Надо соответствующему TMenuItem сделать Default := true;

----------
Per Aspera Ad Astra...

Всего записей: 2203 | Зарегистр. 10-08-2003 | Отправлено: 09:56 29-05-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как сохранить в текстовый файл содержимое бинарного файла в шестнадцатиричном виде?
 
Заранее благодарен за ответ...

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 17:40 29-05-2005
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru