Помощь новичкам


#1418

Вот псевдокод:

type
  ШарикСИменемИЗначением = class
    
    СамШарик: ТипШарика;
    Имя, значение: string;
    
    constructor;
    begin
      //ToDo инициализировать СамШарик
      Сцена.КогдаКликнули += (x, y, mb)->
      if Кликнули_на_этот_шарик then
      begin
        writeln(self.Имя, ' : ', self.значение);
      end;
    end;
    
  end;

Можете от него отталкиваться. Основной смысл в том - что каждый объект шарика должен сам следить когда на него кликнули. Чтоб не вызывать FindNearestObject для каждого шарика - можно вызывать его перед всеми остальными обработками клика и присваивать глобальной переменной. А в if Кликнули_на_этот_шарик then проверять на равенство ту глобальную переменную и себя.


#1419

У меня во всех компьютерах комментарии свойства в инспектор объектов отражаются на русском языке, но в одном на английском. Как сделать, чтобы был на русском? Переустановил, все равно на английский.


#1420

Попробуйте поменять язык системы.


#1421

Почему так? То есть если строки это ссылочный тип то понятен первый обмен, но тогда не понятен второй. А если размерный, то наоборот не понятен первый.

begin
  var s1 := 'Hello';
  var s2 := s1;
  Println('s1 =', s1, 's2 =', s2);//s1 = Hello s2 = Hello
  
  Swap(s2[1], s2[2]);
  Println('s1 =', s1, 's2 =', s2);//s1 = eHllo s2 = eHllo
  
  var tmp := s2[1];
  s2[1] := s2[2];
  s2[2] := tmp;
  Println('s1 =', s1, 's2 =', s2);//s1 = eHllo s2 = Hello
end.

#1422

Поздравляю, вы сломали .Net :rofl: Даже у меня так ещё не удавалось, со всем моим опытом баготестов паскаля.

Строки - ссылочный тип. Но при попытке изменить строку - всегда должна создаваться новая, чтоб всё работало как будто строки это размерный тип. Это так заморочились для оптимизации.

А вот подтверждение что это таки сломано:

begin
  var s1 := 'Hello';
  
  //тут .Net видит что такая строка объявлена в другом месте
  //и ради оптимизации - не создаёт новую, а присваивает ссылку на старую
  var s2 := 'Hello';
  
  Println('s1 =', s1, 's2 =', s2);//s1 = Hello s2 = Hello
  
  Swap(s2[1], s2[2]);
  Println('s1 =', s1, 's2 =', s2);//s1 = eHllo s2 = eHllo
  
end.

#1423

Ой, извините, я ничего не хотел ломать. И вообще это не я, это кенгуру виноватая. Опять мама будет ругаться…:pensive:


#1424

В паскале у строк Copy-On-Write семантика. Исключение: передача символа строки по ссылке. Там ничего не копируется.


#1425

Открываем в Паскале Справку. Все типы в PascalABC.NET подразделяются на две большие группы: размерные и ссылочные. К размерным относятся все простые типы, указатели, записи, статические массивы, множества и строки. К ссылочным типам относятся классы, динамические массивы, файлы и процедурный тип


#1426
begin
  Writeln(typeof(string).IsClass); // True
end.

Строки имеют ссылочный тип. В C# тоже так. Поэтому написанное в справке утверждение противоречит действительности, которая продемонстрирована программой.


#1427

Я уже говорил, что от этого аргумента меня лишь неприлично “пробивает на ржачку”. Строки - они так, как захотели сделать разработчики. А там не все так уж однозначно. Есть еще строки с фиксированной длиной. Официальный источник информации - Справка. А вовсе не ссылки на другой язык.


#1428

Упоминание про C# здесь не было аргументом. Не вижу ничего смешного в том, чтобы упомянать про другие языки программирования. Впрочем, это Ваше личное дело как к этому относится.

Я привёл пример кода, показывающий, что string - ссылочный тип.


#1429

Вы лишь показали пример, в котором string ведет себя, как ссылочный тип. Не более того. Я подожду, может быть разработчики скажут, правильно ли у них написано в Справке, или нет.

Если доверять Вашей “проверке” получается что Справка вообще почти везде врёт, говоря о размерных типах.

type
  t0 = string;
  t1 = set of char;
  t2 = record
    x: integer;
    y: string;
  end;
  t3 = array of integer;
  t4 = array[1..5] of real;
  t5 = ^integer;
  t6 = pointer;

begin
  typeof(t0).IsClass.Println; // True - строка
  typeof(t1).IsClass.Println; // True - множество
  typeof(t2).IsClass.Println; // False - запись
  typeof(t3).IsClass.Println; // True - динамический массив
  typeof(t4).IsClass.Println; // True - статический массив
  typeof(t5).IsClass.Println; // True - типизированный указатель
  typeof(t6).IsClass.Println; // True - бестиповый указатель
end.

Текст из Справки еще раз:

К размерным относятся все простые типы, указатели, записи, статические массивы, множества и строки. К ссылочным типам относятся классы, динамические массивы, файлы и процедурный тип.


#1430

Поддерживаю Ваше предложение.

Не думаю, что уместен сарказм по поводу «проверки».


#1431

А это Ваше право. Я не обязан доверять тому что пишет эта функция, мало ли как она реализована. Если вдруг программа выдаст, что 2+2=5, это не поставит всю математику “на уши”.


#1432

В панель управления - Языки и регион. станд. язык стоит русский. В самом АВС тоже русский. Я пробовал так: скопировал всю папку из другого компьютера и вставил в этом компьютере, но всеравно английский коментарии.


#1433

Да врёт справка, я всё это декомпилировал - статические массивы, множества и строки (в том числе и короткие) - это классы. Единственное - IsClass считает указатели классом тоже, просто потому что они хранят ссылку. Но указатель это и не запись, однозначно))) Да и при наведении мышки показывает что это класс.


#1434

Так, подождите, теперь это комментарий? Я совсем запутался, приведите скрины.


#1435

@RAlex, не нравятся аргументы - игнорируйте. Грубить не обязательно.


#1436

@Gleb, Вы где грубость в очередной раз увидели? Я скоро буду вынужден к @Admin обращаться по поводу Ваших публичных наездов на пустом месте.


#1437

Тогда у Вас есть повод создать issure ))))