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


#1505

Сколько ни произволся PascalABC.Net, узнал про эту особенность строк только сегодня… Не перестаю удивляться.

То, что фактически ссылочный тип, то и называть ссылочным, остальное - размерным. Проверить можно рефлексией (примеры выше). На счёт строк действительно непонятно к чему их относить. Если ориентироваться на терминологию C#, то там нет понятия гибридного типа. Но, это, все - же, не означает, что в любом другом языке его нет. Стоит поискать подобные PascalABC.Net примеры.


#1506

Кто-нибудь знаком с реализацией строк в Oxygen? Как там они классифицируются официально?

А во Free Pascal и Delphi?


#1507

Немного поздно. Но, хочется заметить, что Вас никто не заставляет пользоваться данным языком. Проектом занимаются те, кому это действительно интересно и хочется…


#1508

Файл скрин в архиве.Вот этот строк комментарии в инспектор объектов.rar (475,8 КБ)


#1509

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

А вот тут я с Вами полностью согласен, более того, Вы фактически повторили мой вопрос несколько иными словами.

А это называется придирками. Вы прекрасно сознаете, что проблема возникает из за моделирования поведения, в частности, строк одновременно по образцу предшественников PascalABC.NЕТ, и по образцу именно других NET-языков, в частности C#.


#1510

Вы это серьезно мне адресовали? Хотя… в Ваших высказываниях в мой адрес уже ничего не удивляет.


#1511

Я на полном серьёзе.

Не ясно каким образом это коррелирует с темой про строки…


#1514
using System;
 
namespace Test
{	
	class Program
	{	
		public static void Main(string[] args)
		{
			string s1 = "12";
			string s2 = "12";
			Console.WriteLine(s1.Equals(s2)); // True
			Console.ReadLine();
		}
	}
}

Про Equals(String) почитать можно здесь. Важный момент:

Determines whether this instance and another specified String object have the same value.

Про Equals(Object) можно почитать здесь.

Исходный код находится здесь (строка 570):


#1515
procedure p1(var ch: char) := ch := '_';

begin
  var s1 := '123';
  var s2 := '123';
  
  s2[1] := '1'; // Вручную изменили символ, теперь строки не будут меняться вместе.
  
  p1(s2[1]);
  Println(s1, s2); // 123 _23
end.

#1516

Да, увидел, но это далеко не самый страшный глюк WinForms)) Разработчики отказались исправлять их, лучше делайте формы руками, кодом а не графическим редактором.


#1517

@Admin насчёт строк и передачи их символов как var-параметров, предлагаю производить дополнительное копирование если символ строки решили передать как var-параметр и при этом выводить предупреждение, про то что это медленно.

У кого то есть претензии к этому решению? И, предлагайте что то своё тоже, можно будет голосование запустить, если наберётся несколько хороших идей.


#1518

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


#1519

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


#1520

А они меняют? Это кто-то подтвердил?


#1521

Выше было несколько кодов. Вот почитайте.

Строки могут иметь общее значение даже между AppDomain-ам, то есть, если я правильно понимаю - они могут даже быть общими между несколькими .exe файлами, если они используют одну .dll !


#1522

И зачем Вы отсылаете в коды C#, если в PascalABC.NЕТ своя реализация этих строк?

В общем, чтобы не тянуть бесконечную дискуссию, резюме: я против любых ковыряний в строках, пока разработчики не признают, что проблема существует.


#1523

У паскаля нету своей реализации строк. Это реализация общая для .Net . Вот доказательство что это работает между потоками.

var
  lock_obj := new class(state := 0);

procedure thr1;
begin
  
  var s := 'abc';
  while lock_obj.state < 1 do Sleep(10);
  lock lock_obj do
  begin
    Swap(s[1],s[2]);
    write($'Swap выполнено, теперь строка = "{s}"');
    readln;
    lock_obj.state := 2;
  end;
  
end;

procedure thr2;
begin
  
  var s := 'abc';
  lock lock_obj do
  begin
    write('2 потока успешно запущены');
    readln;
    lock_obj.state := 1;
  end;
  
  while lock_obj.state < 2 do Sleep(10);
  lock lock_obj do
  begin
    write($'и другая строка = "{s}"');
    readln;
    halt;
  end;
  
end;

begin
  System.Threading.Thread.Create(thr1).Start;
  thr2;
end.

То что между AppDomain-аму работает вам тоже так доказывать, или наконец всё же поверите, что паскаль это надстройка над .Net , наследующая все свойства .Net ?


#1524

Да я уже объяснял это:

И получил это:


#1525

И что Вы этим кодом доказали? Что строки в многопоточности работают так, как им положено - если строка меняется в одном потоке, это вызывает ее изменение в другом? А кто-то сомневался, что все нормально?


#1526

1 переменная в 1 потоке не должна менять другую переменную из другого потока. Посмотрите внимательно, это 2 отдельные переменные s, которые никак друг друга никогда не касались.