Указатель на динамический массив

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Указатель на динамический массив

Сообщение trexxet » 02.10.2013 09:13:51

В одном модуле имеется динамический массив
Код: Выделить всё
Edits: array of TRectEdit;
...
CheckEdit( @Edits );

В другом GUI
Код: Выделить всё
procedure CheckEdit( EditArray: Pointer );
var
  i, j: byte;
begin
  j := 1;
  for i := 1 to Length( EditArray^ ) do

На что компилятор выдает
gui.pas(97,17) Error: Type mismatch

Что я делаю не так?
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Re: Указатель на динамический массив

Сообщение Vadim » 02.10.2013 09:33:55

Динамический массив - это уже указатель. Для проверки можете набить такую программу:
Код: Выделить всё
Var
  m: array of Int64;

Begin
  WriteLn(SizeOf(m));
  SetLength(m, 100);
  WriteLn(SizeOf(m));
  WriteLn(Length(m));
End.

и посмотреть, что будет выдаваться на экран. ;)
Вы лучше сделайте тип-массив и передавайте его параметром в процедуру, а Pointer применять не надо, вредно это и ошибочно.
Последний раз редактировалось Vadim 02.10.2013 09:37:25, всего редактировалось 1 раз.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Указатель на динамический массив

Сообщение zub » 02.10.2013 09:34:06

Нужно объявить указатель нужного типа
Код: Выделить всё
type Parray=^Edits;
....
procedure CheckEdit( EditArray: PArray );
var
  i, j: byte;
begin
  j := 1;
  for i := 1 to Length( EditArray^ ) do

а не использовать обычный pointer - он для компилятора ни на что не указывает - его придется приводить к нужному типу руками.

кстати переменная динамического массива сама по себе является указателем и
Код: Выделить всё
procedure CheckEdit(var EditArray: Edits);
или
procedure CheckEdit(const EditArray: Edits);

будут темже самым что и передача указателя
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Указатель на динамический массив

Сообщение rxt » 04.10.2013 20:57:22

zub писал(а):Нужно объявить указатель нужного типа
Код: Выделить всё
type PEdits = ^Edits


Вот это самое верное решение.

zub писал(а):кстати переменная динамического массива сама по себе является указателем и
Код: Выделить всё
procedure CheckEdit(var EditArray: Edits);
или
procedure CheckEdit(const EditArray: Edits);

будут темже самым что и передача указателя


Отнюдь! Множество здешних статей вводят, подобным высказыванием, программистов в заблуждение.
  1. Если переменная является указателем, это еще не значит, что данные будут переданы по ссылке.
  2. По ключевому слову const компилятор сам решит, как ему передавать параметр, а решит он его передавать по значению. Чтобы передавать по ссылке необходимо использовать ключевое слово constref. Исключение составляют вызовы по соглашению stdcall, и, даже здесь компилятор сам решает - передавать ему по ссылке или по значению. Поэтому, если необходимо передать по ссылке, нужно явно это сказать компилятору объявив параметр с ключевым словом constref. Пруфconst в Delphi <> const в FPC.
rxt
новенький
 
Сообщения: 15
Зарегистрирован: 03.03.2013 13:54:02

Re: Указатель на динамический массив

Сообщение zub » 05.10.2013 14:42:07

>>а решит он его передавать по значению
нет какраз по ссылке, о чем и говорит приведеный в пруфе пример. Какими соображениями по вашему должен руководствоваться компилятор чтобы передать огромный массив или строку по значению?
Это не гарантируется, но пока так и есть.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Указатель на динамический массив

Сообщение rxt » 09.10.2013 12:50:21

zub писал(а):нет какраз по ссылке, о чем и говорит приведеный в пруфе пример.

Давайте поглядим и дочитаем первый абзац до конца:
The main use for this is reducing the stack size, hence improving performance, and still retaining the semantics of passing by value...
Кириллицей: Основное назначение использования const - это уменьшение стека, что обусловливает производительность, но все еще сохраняя при этом семантику передачи параметра по значению ...

И еще поглядим на примечание:
Remark: Contrary to Delphi, no assumptions should be made about how const parameters are passed to the underlying routine. In particular, the assumption that parameters with large size are passed by reference is not correct. For this the constref parameter type should be used, which is available as of version 2.5.1 of the compiler.
Кириллицей: Данное поведение отличается от поведения в Delphi. Предполагать, что бошьшие данные передаются по ссылке - не правильно(нельзя!!!). Для этого используйте ключевое слово constref, которое доступно с версии 2.5.1.

zub писал(а): Какими соображениями по вашему должен руководствоваться компилятор чтобы передать огромный массив или строку по значению?

Ответ на этот вопрос можно разглядеть в теме Неправильная передача параметров при SafeCall вот в этом сообщении
Да, это довольно мутный вопрос....
rxt
новенький
 
Сообщения: 15
Зарегистрирован: 03.03.2013 13:54:02

Re: Указатель на динамический массив

Сообщение zub » 09.10.2013 14:46:27

Я не понимаю что вы доказываете?
кстати переменная динамического массива сама по себе является указателем и
Код: Выделить всё
procedure CheckEdit(var EditArray: Edits);
или
procedure CheckEdit(const EditArray: Edits);

будут темже самым что и передача указателя

Хотябы потому что массиву нет разницы как указатель на него передался - по ссылке или по значению. копия массива создана небудет в первом случае потому что var, а во втором потому что const.

>>Кириллицей: Основное назначение использования const - это уменьшение стека, что обусловливает производительность,
Повторяю: Какими соображениями по вашему должен руководствоваться компилятор чтобы передать огромный массив или строку по значению с честным созданием копии?
Внимательно смотрим на пример и его вывод по ссылке в фпцвики и отвечаем как там передана строка?

ежу понятно что const b:byte выгоднее передать по значению и разумный компилятор так и сделает. динмассивы и строки из другой оперы... Variant по приведенной ссылке тоже - его похоронить давно надо

>>Вот это самое верное решение.
Самое верное для сишечки. Паскаль на то и паскаль, чтоб юзать указатели там где без них действительно не обойтись, а не на ровном месте, чтоб "сэкономить" на передаче параметров забив на родные var и const - можно и багов огрести по причине нетипизированного @
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Указатель на динамический массив

Сообщение rxt » 15.10.2013 22:57:45

zub,
Защищая свое самолюбие, Вы, вносите ошибочное представление о проектировании подпрограмм в неокрепшее сознание топикстартера и подобных ему вопрошающих.

zub писал(а):Я не понимаю что вы доказываете?
кстати переменная динамического массива сама по себе является указателем и
Код: Выделить всё
procedure CheckEdit(var EditArray: Edits);
или
procedure CheckEdit(const EditArray: Edits);

будут темже самым что и передача указателя

Хотябы потому что массиву нет разницы как указатель на него передался - по ссылке или по значению. копия массива создана небудет в первом случае потому что var, а во втором потому что const.


Верно, не понимаете, иначе не несли бы эту чужь.

zub писал(а):>>Кириллицей: Основное назначение использования const - это уменьшение стека, что обусловливает производительность,
Повторяю: Какими соображениями по вашему должен руководствоваться компилятор чтобы передать огромный массив или строку по значению с честным созданием копии?
Внимательно смотрим на пример и его вывод по ссылке в фпцвики и отвечаем как там передана строка?


В вики, которая находится в Вашем воображении, может быть всё что угодно :D . Но, своих высказываний Вы не подтвердили.
К Вашему удивлению, за распределение памяти, создание копий строк или дин. массивов, отвечает вовсе не модификатор параметра. Этим занимается механизм управления динамическими типами данных.


Пример несёт ту же смысловую нагрузку, что и пример отсюда.

Код: Выделить всё
program PassParam;

{$mode objfpc}{$H+}

uses
  SysUtils;

var
  s,s1:string;

procedure test1(a:string);
begin
  s  :='test1';
  WriteLn('procedure test1(a:string)');
  WriteLn(Format('  @a=$%p a=%s', [@a, a]));
  WriteLn(Format('  @s=$%p s=%s', [@s, s]));
  WriteLn;
end;

procedure test2(var a:string);
begin
  s  :='test2';
  WriteLn('procedure test2(var a:string)');
  WriteLn(Format('  @a=$%p a=%s', [@a, a]));
  WriteLn(Format('  @s=$%p s=%s', [@s, s]));
  WriteLn;
end;

procedure test3(const a:string);
begin
  s  :='test3';
  WriteLn('procedure test3(const a:string)');
  WriteLn(Format('  @a=$%p a=%s', [@a, a]));
  WriteLn(Format('  @s=$%p s=%s', [@s, s]));
  WriteLn;
end;

procedure test4(constref a:string);
begin
  s  :='test4';
  WriteLn('procedure test4(constref a:string)');
  WriteLn(Format('  @a=$%p a=%s', [@a, a]));
  WriteLn(Format('  @s=$%p s=%s', [@s, s]));
  WriteLn;
end;

procedure test5(a:pstring);
begin
  s  :='test5';
  WriteLn('procedure test5(a:pstring)');
  WriteLn(Format('  @a=$%p a=$%p a^=%s', [@a, a, a^]));
  WriteLn(Format('  @s=$%p s=%s', [@s, s]));
  WriteLn;
end;

begin
  s1:= 'aaaaaa';
  s := s1;
  WriteLn(Format('s=$%p  s=%s', [@(s),s])+sLineBreak);
  test1(s);
  s := s1;
  test2(s);
  s := s1;
  test3(s);
  s := s1;
  test4(s);
  s := s1;
  test5(@s);

  readln;


end.



Результат:
@s=$00416000 s=aaaaaa

procedure test1(a:string) - параметр передан по значению
@a=$0141FF04 a=aaaaaa
@s=$00416000 s=test1

procedure test2(var a:string) - параметр передан по ссылке
@a=$00416000 a=test2
@s=$00416000 s=test2

procedure test3(const a:string) - параметр передан по значению
@a=$0141FF04 a=aaaaaa
@s=$00416000 s=test3

procedure test4(constref a:string) - параметр передан по ссылке
@a=$00416000 a=test4
@s=$00416000 s=test4

procedure test5(a:pstring) - параметр передан по значению (в качестве значения передан указатель)
@a=$0141FF04 a=$00416000 a^=test5
@s=$00416000 s=test5
rxt
новенький
 
Сообщения: 15
Зарегистрирован: 03.03.2013 13:54:02

Re: Указатель на динамический массив

Сообщение zub » 16.10.2013 01:51:39

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

>>К Вашему удивлению, за распределение памяти, создание копий строк или дин. массивов, отвечает вовсе не модификатор параметра. Этим занимается механизм управления динамическими типами данных.
>>механизм управления динамическими типами данных
какбы оно не называлось на основании чего оно по вашему принимает решение? помоему на основании соглашений о передаче в том числе. не?

>>Пример несёт ту же смысловую нагрузку, что и пример отсюда.
Спасибо, конечно поучительный пример, только одно но, не из жизни - строки константные, а компилятор последнее время умным стал, у меня изза хака с присвоением в конст вообще билеберду пишет, ишь наоптимизировал)). также @s и @а совершенно нам с вами неинтересны, мы же понимаем как оно устроено и что нужны @s[1] и @а[1]
Поэтому предложу всетаки доработать тот который в "воображаемом" вики. у меня получилось так:
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,sysutils
  { you can add units after this };

Var
  S : String;

Procedure DoIt(Const t : String);

begin
  writeln('Doit begin');
  S:='Something else'+inttostr(1);
  WriteLn(Format('@t=%p @s=%p',[@t,@s]));
  WriteLn(Format('@t[1]=%p @s[1]=%p',[@t[1],@s[1]]));
  WriteLn(t);
  WriteLn(s);
  writeln('Doit end');
end;
begin
  S:='test '+inttostr(1);
  DoIt(S);
  writeln(S);
end.

Ушел от константных строк и добавил в конце вывод S чтоб оптимизатор не хоронил ее раньше времени
Его вывод:
zamtmn@desktop:~/tmp$ ./project1
Doit begin
@t=00007FFF40D8B5E8 @s=00000000006AA4F0
@t[1]=00007FF301A44258 @s[1]=00007FF301A44258
Something else1
Something else1
Doit end
Something else1

Как и предполагалось - "указатель на строку" передан по значению, сама строка не скопирована. о чем и речь
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Указатель на динамический массив

Сообщение rxt » 16.10.2013 15:27:20

zub писал(а):>>К Вашему удивлению, за распределение памяти, создание копий строк или дин. массивов, отвечает вовсе не модификатор параметра. Этим занимается механизм управления динамическими типами данных.
>>механизм управления динамическими типами данных
какбы оно не называлось на основании чего оно по вашему принимает решение? помоему на основании соглашений о передаче в том числе. не?


Нет, соглашения о передаче здесь не к месту. Данный механизм хорошо описан в справке. Напомню: по смещению -8 находится счетчик ссылок на строку(массив). При присвоении строки, этот счетчик увеличивается на 1. Таким образом, присваивается только указатель, будь-то локальные переменные, параметры процедур или ещё что. Когда счетчик опускается до 0, память освобождается. Если же в процессе происходит изменение строки, строки раздваиваются. Счётчик предыдущей уменьшается на 1 и создается новая измененная строка, счетчик которой становится 1. То есть, работа с памятью происходит в момент изменения данных. Константы имеют счетчик -1. Назначение счетчика – отследить момент, когда нужно освободить память, и избежать лишнего копирования.
Начните изучение этого механизма с этой статьи: «Динамические структуры данных» @ Роман Игнатьев.
В конце этого поста есть ссылки, будет очень полезно сходить по ним.

zub писал(а):также @s и @а совершенно нам с вами неинтересны, мы же понимаем как оно устроено и что нужны @s[1] и @а[1]


Все дело в том, что @s и @а несут основные факты о передачи параметров, а это @s[1] и @а[1] - Вы что-то выдумали и запутались. О механизме читайте в статье и в справке.

Ок!.
Я Вас поздравляю! Вы хорошо постарались. Самое время создать в багтрекере запрос.

Горяченькое:
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
sysutils;

Var
  S, s1 : String;

Procedure DoIt(Const t : String);

begin
  S:='Something else'+inttostr(1);
  WriteLn(Format('@t=%p @s=%p',[@t,@s]));
  WriteLn('t=',t);
  WriteLn('s=',s);
end;
begin
  S:='test '+inttostr(1);
  WriteLn('before');
  WriteLn(Format('@s=%p',[@s]));
  WriteLn;
  s1 := s;              // закомментировав эту строку результат будет: t=Something else1, s=Something else1
  WriteLn('after');
  DoIt(s);
  readln;
end.       

Результат:
    t = test 1
    s = Something else1
Закомментируйте 28 строку и получите уже иной результат:
    t = Something else1
    s = Something else1


Отлично, а теперь десерт:
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
  sysutils;

Var
  S: String;

Procedure DoIt(Const t : String);

begin
  S:='Something elsedddddd'+inttostr(1); // присвоение значения более, чем 20 символов
  WriteLn(Format('@t=%p @s=%p',[@t,@s]));
  WriteLn('t=', t);
  WriteLn('s=', s);
end;
begin
  S:='test '+inttostr(1);
  DoIt(S);
  readln;
end.       


Присвоение строки размером более 20-ти символов, уводит программу в безвозвратный штопор.
rxt
новенький
 
Сообщения: 15
Зарегистрирован: 03.03.2013 13:54:02

Re: Указатель на динамический массив

Сообщение zub » 16.10.2013 17:24:41

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

>>Напомню: по смещению -8 находится счетчик ссылок на строку(массив)
>>Все дело в том, что @s и @а несут основные факты о передачи параметров, а это @s[1] и @а[1] - Вы что-то выдумали и запутались. О механизме читайте в статье и в справке.
Незнаю, напомню или просвещу... -8 считается какраз от @s[1] а в @s лежит всеголишь указатель на @s[1]... такчто судим по @s[1] - оно показывает создана копия строки или нет. Вы ведь в этом меня уверяете?
Я вам говорю что нету разницы как передастся s... главное что @s[1] не размножается. И по сути эта таже передача данных через
type PEdits = ^Edits Вот это самое верное решение.

только лишенное минусов нетипизированного указателя, и полностью в строгих паскалевских правилах.

>>Я Вас поздравляю! Вы хорошо постарались. Самое время создать в багтрекере запрос.
Спешу расстроить, я не старался)) Можете заодно и на свой пример сразу репорт накатать, если в нем сделать
Код: Выделить всё
test3(s+inttostr(1));

будут глюки... но на трекере ответ будет "не требует изменений" - т.к. всё работает как задумано

>>Присвоение строки размером более 20-ти символов, уводит программу в безвозвратный штопор.
Вполне законный штопор, имхо всё верно, и в вики по вашей ссылке именно это и написано... объявили const, хаком его всетаки меняем, только не думаем что компилятор с чистым сердцем не накрутил рефкаунт и не сделал копию содержимого строки (напоминаю, модификаторы не просто так придуманы :lol: ) и как только выходим за предел заранее выделенного блока памяти (который чуток больше чем содержимое строки) ловим глюки... В вашем исходном примере вас вводят в заблуждение константные строки - они коварней чем кажется))

напоследок еще пример после которого думаю спорить бесполезно:
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };
var
  s:string;
const
  ssize=1624*1024*1024;//будем выделять ~1.6 гб, специально
                       //под win32 - на большем оно сразу валится
procedure test(const b:string);
begin
     s[ssize]:='b';
     writeln('s[ssize]='+s[ssize]);
     writeln('b[ssize]='+b[ssize]);
end;

begin
  setlength(s,ssize);
  s[ssize]:='a';
  writeln('s[ssize]='+s[ssize]);
  test(s);
end.

вывод в винде 32 бита:
D:\temp>project1.exe
s[ssize]=a
s[ssize]=b
b[ssize]=b

всё ясно и по выводу и по невозможности создать чесную копию - памяти нехватит в win32

Будем дальше спорить?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Указатель на динамический массив

Сообщение rxt » 18.10.2013 22:33:08

zub, Будьте любезны, увольте от спора с Вами. Ваша демагогия уходит от контекста вопроса: "передача по значению; передача по ссылке". Либо, скорее всего, Вы вообще не понимаете данную терминологию.
rxt
новенький
 
Сообщения: 15
Зарегистрирован: 03.03.2013 13:54:02

Re: Указатель на динамический массив

Сообщение hinst » 19.10.2013 01:24:12

может не надо просто нетипизированный @ включать
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Указатель на динамический массив

Сообщение zub » 19.10.2013 02:51:00

rxt
Увольняю. Увожаемый, я же вас просил без выводов - анализируйте себя а не окружающих
>>Ваша демагогия уходит от контекста вопроса: "передача по значению; передача по ссылке"
Изначално контекст был что передача массива-строки это всегда передача указателя, без разницы о соглашении вызова. Это вы нагнали неподтвержденной ничем мути, в желении блеснуть знаниями - невышло - но не я виноват, а ваши знания))
И вики вы трактуете както однобоко: Там где написано что "нелзя делать никаких предположений о способе передачи" вы озвучиваете "Предполагать, что бошьшие данные передаются по ссылке - не правильно(нельзя!!!)" - ага, значит по значению. А нифига, не так и не так))

Нравится плодить указатели и разматывать их руками - мне пофиг, но это никак не лучшее решение для паскаля. В данном случае лучшим думаю будет var, а если строка или массив недолжны менятся то const - компилятор избавит вас от лишней возни и укажет возможные проблемы в copiletime. Хотя допускаю - есть ситуации когда без указателей никак - сам их пользую очень часто.

область применения указателей - когда тип данных заранее неизвестен. Если известен - они автоматически хуже var и const. Ненадо пытаться обхитрит компилятор - он соптимизирует гораздо лучше вас, особенно в свете ваших постов (неудержался :lol: )
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Указатель на динамический массив

Сообщение rxt » 31.10.2013 23:14:33

zub
zub писал(а):Увольняю. Увожаемый, я же вас просил без выводов - анализируйте себя а не окружающих

Вы оказались еще глупее, чем я предполагал. Да к тому же хамите.

zub писал(а):И вики вы трактуете както однобоко: Там где написано что "нелзя делать никаких предположений о способе передачи" вы озвучиваете "Предполагать, что бошьшие данные передаются по ссылке - не правильно(нельзя!!!)" - ага, значит по значению. А нифига, не так и не так))

У Вас даже с английским проблемы. Хотя nizkzin'ы братья по разуму не отличались знанием языков.
Это не трактование, как Вы выразились, а перевод второго предложения в абзаце : "In particular, the assumption that parameters with large size are passed by reference is not correct". Взамен этому Вы предлагаете свой вариант перевода: "А нифига, не так и не так". Оригинально.

zub писал(а):Незнаю, напомню или просвещу... -8 считается какраз от @s[1] а в @s лежит всеголишь указатель на @s[1]... такчто судим по @s[1] - оно показывает создана копия строки или нет. Вы ведь в этом меня уверяете?

Процитируйте, где в моих постах Вы нашли такое утверждение?

Мои утверждения из поста полностью подтверждены примерами, в том числе и Вашими.

zub писал(а):нет какраз по ссылке, о чем и говорит приведеный в пруфе пример

Это Ваше утверждение Вы сами опровергаете своим же примером(ниже), который подтверждает сказанное: параметр передан по значению.

zub писал(а):zamtmn@desktop:~/tmp$ ./project1
Doit begin
@t=00007FFF40D8B5E8 @s=00000000006AA4F0
@t[1]=00007FF301A44258 @s[1]=00007FF301A44258
Something else1
Something else1
Doit end
Something else1
Как и предполагалось - "указатель на строку" передан по значению, сама строка не скопирована. о чем и речь


Процитируйте, где в моих постах выше говорится о копиях строк? Если Вы не понимаете суть, то начните с букваря.
Передача параметра по ссылке означает что копируется не само значение, а адрес исходной переменной.

zub писал(а):Variant по приведенной ссылке тоже - его похоронить давно надо

Иногда лучше жевать, чем что-либо говорить.

Чушь, которую Вы несёте присутствует не только в данной теме, но и в ответах других тем. Вы зарегистрированы на форуме 8 лет. И за такое время
не знать азов и не понимать - прогрессивная эволюция.

Здесь даже судить нечего, Вы сами себя опровергаете. Стараясь не утратить свой ореол знаний, неудачно ведете диалог превращая свои ответы в демагогию. И даже более,
Ваша тупость, а так же Ваш каменный столб самолюбия вынуждают Вас на абсурдные высказывания, которых Вы не подтвердили и не в состоянии подтвердить.
Если Вы не следите за письмом речи(пишите, как курка лапой), и допускаете огромное множество грамматических ошибок, то какой шанс, что Вы не проявите ту же халатность в коде своих программ?
Одним словом, Вы - балабол(данная тема тому подтверждение). Жаль тех пользователей, которые пользуются Вашими программами.


Надеюсь, у Вас хватит мужества не оффтопить более в этой теме.
rxt
новенький
 
Сообщения: 15
Зарегистрирован: 03.03.2013 13:54:02

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru
cron