Войти
ФлеймФорумПрограммирование

Visual С++ vs. Delphi (298 стр)

Страницы: 1295 296 297 298 299 300 Следующая »
#4455
23:31, 29 сен 2022

Cheb
> Но, однако, не забывайте, что в Паскале все сложные типы (*кроме* инстансов
> класса, лол) - менеджед,
Это работает только для строк и динамических массивов. И это никак не спасает от доступа к строке из разных потоков. А ещё коровьи строки отстой.

#4456
23:43, 29 сен 2022

master-sheff
> Ты с сипипи перепутал, в Delphi больше половины программистов понятия не имеют
> что такое указатели и прекрасно себя чувствуют.
  А они вообще что-нибудь кроме хеллоуворлдов то умеют писать?

#4457
23:48, 29 сен 2022

Zefick
> А они вообще что-нибудь кроме хеллоуворлдов то умеют писать?
Обычно, на такой уровень аргументов, отвечают, а знаете ли Вы, что плохому танцору мешает? :)

#4458
0:05, 30 сен 2022

master-sheff
> Ты с сипипи перепутал, в Delphi больше половины программистов понятия не имеют
> что такое указатели и прекрасно себя чувствуют.
samrrr
>Интересно и как же тогда они объекты передают в функцию? Целиком копируют >чтоли?))
Хм. Интересная постановка вопроса.
Лично у меня, почему-то не возникает такой необходимости. Если нужно ... как бы это сказать, отправить информацию об объекте в процедуру или функцию, можно передать его имя (строку), а в процедуре по имени найти объект в глобальном списке. Может, это немного громоздко, но совершенно не напрягает. И никаких утечек памяти.

#4459
0:05, 30 сен 2022

Zefick
> А они вообще что-нибудь кроме хеллоуворлдов то умеют писать?
Конечно, половина банковского софта ими написано.

#4460
0:07, 30 сен 2022

true_bump
> можно передать его имя (строку), а в процедуре по имени найти объект в списке.
О чём я и говорю, вот пример типичного Delphi программиста о которых я пытаюсь сказать.

#4461
0:13, 30 сен 2022

Вообще-то объекты в Дельфи это ссылочные типы, лол. При отправке в функцию отправляется ссылка.

#4462
0:23, 30 сен 2022

1 frag / 2 deaths
> Вообще-то объекты в Дельфи это ссылочные типы
как и строки (не shortstring)
но синтаксис языка позволяет об этом не думать.

#4463
(Правка: 0:31) 0:28, 30 сен 2022

1 frag / 2 deaths
>Вообще-то объекты в Дельфи это ссылочные типы, лол. При отправке в функцию >отправляется ссылка.

Вот так? Компилирует, но выполнение не проверял.

unit Unit1;

interface
//...

var
  Form1: TForm1;
  obj2: TObject;

procedure ok(p_:pointer);

implementation

{$R *.dfm}

procedure ok(p_:pointer);
var
  obj:TObject;
begin
  obj := TObject(p_);
//...
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  p_:pointer;
begin
  p_ := obj2;
  ok(p_);
end;

end.

Так тоже компилирует:

ok(obj2);
#4464
0:37, 30 сен 2022

true_bump
> Так тоже компилирует:
Заливай в продакшен!

#4465
(Правка: 0:54) 0:52, 30 сен 2022

Ссылочные типы совместимы с бестиповым указателем. Отчасти, думаю, для облегчения интерфейса с Си-кодом.
Тайпкасты из объекта/строки/массива в бестиповый указатель автоматические. Тайпкасты из бестипового указателя в объект/строку/массив допустимы - но это уровень "я сам с усам, не нужны мне ваши менеджед". Никто не мешает работать в Паскале в стиле Си. Включая гаргантюанские юниты, собирающиеся из 100500 заголовков и 100500 инклюдов (мой движок, кхм).

З.Ы. Способ сбросить счётчик ссылок массива в единицу, гарантировав, что работаешь с уникальной копией?
SetLength(a, Length(a)); // выполнит Copy-on-write если на массив ссылались откуда-либо ещё

#4466
7:00, 30 сен 2022

true_bump
> Если нужно ... как бы это сказать, отправить информацию об объекте в процедуру
> или функцию, можно передать его имя (строку), а в процедуре по имени найти
> объект в глобальном списке. Может, это немного громоздко, но совершенно не
> напрягает. И никаких утечек памяти.
GJ это самый худший способ передать объект в функцию о котором я слышал.

#4467
(Правка: 7:35) 7:11, 30 сен 2022

true_bump
> Вот так? Компилирует, но выполнение не проверял.
Если выкинуть тип Pointer заменив на TObject и соответственно все ненужные временные переменные, то это именно то, что происходит в Delphi/FPC при передаче объекта в функцию.
Экземпляр переменной a: TObject имеет размер указателя и хранит указатель на объект размещаемый в куче или nil если a не нацелена на объект.
Передаётся в функции как параметр соответственно именно этот указатель.
P.S.
Это, кстати, одна из вещей в Delphi которые мне вправили мозги насчёт того что такое ООП.
Ведь в ООП ключевая, скажем так, идея крутится вокруг виртуальных методов.
А чтобы ты мог передать в код по настоящему (как заповедовано в ООП) работающий с виртуальными методами что-то, то как это сделать?
Ведь если передавать сам объект по значению, то как можно вместо TStream передать TMemoryStream или TFileStream? По значению никак не получается такой код сделать.
А значит объектно-ориентированный код может принимать объекты в себя только по ссылке/указателю.
И это касается и C++, но из-за того, что C++ позволяет передавать объекты и по значению и даже настаивает на этом в ряде своих мест, то он довольно таки мощно дезориентирует в плане того что есть ООП, а что не есть ООП. Новичкам эта свобода наглухо выносит мозг и заставляет видеть ООП там где его нет вообще от слова совсем.
Но в Delphi у тебя просто и нет других способов передавать объект (наследник от TObject) кроме как по ссылке.
Любой код работающий с объектами пишется потенциально способным к ООП-у. Поэтому любой наследник от TObject в Дельфи сразу же адаптирован к реалиям ООП и легко может быть использован в ООП-ключе. Хотя последнее и необязательно. И как раз когда оно необязательно и раздаются недовольства тем, что все объекты в куче лежат по указателям - для неООП-применений это может быть крайне неэффективно.
А да, потому что Delphi настаивает на ООП.

#4468
8:32, 30 сен 2022

Cheb
> IDE, не такая навороченная, как в Quick basic'е - зато паскаль давал
> использовать ажно килобайт 500 супротив 64 у бэйсика.
Что-то ты ошибаешься. Сейчас в досбоксе запустил Quick Basic, в нём такую программу:

DIM m1(16383) AS LONG
DIM m2(16383) AS LONG
DIM m3(16383) AS LONG
DIM m4(16383) AS LONG

DIM i AS INTEGER

FOR i = 0 TO 16383
  m1(i) = 1
  m2(i) = 2
  m3(i) = 3
  m4(i) = 4
NEXT i

PRINT "Ok"

работает без проблем.
Это один массив не может быть больше 64к, да. А так - вся память тебе доступна, в том числе и напрямую, через DEF SEG.

#4469
9:40, 30 сен 2022

=A=L=X=
> По значению никак не получается такой код сделать.

variant<TMemoryStream, TFileStream>

Вполне реально.

=A=L=X=
> о в Delphi у тебя просто и нет других способов передавать объект (наследник от
> TObject)
А чё там с обычной структуркой происходит вспомни. Всё так же как и в C++ и в C#.

=A=L=X=
> Новичкам эта свобода наглухо выносит мозг и заставляет видеть ООП там где его
> нет вообще от слова совсем.
Ну ну в C# struct и class и что-то не слышал раньше жалоб на не ооп-шность этого.

Страницы: 1295 296 297 298 299 300 Следующая »
ФлеймФорумПрограммирование