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


#2302

Александр, речь о разорванных" строках таких как:

Также есть ли способ или директива

управления компиляцией, например,

временно отключить (для определённой

программы) Debug ?

Интересует компактное решение в неофункциональном стиле.


#2303

Отключить или включить режим Debug - нельзя, но можно узнать включён ли он или нет. Пример из справки:

{$define DEBUG} 
begin
  {$ifndef DEBUG}
  Writeln('Имя DEBUG не определено');
  {$else} 
  Writeln('Имя DEBUG определено');
  {$endif}
end.

#2304

Правильно ли я понимаю, что если после NewLine не следует прописной буквы, NewLine надо заменить пробелом?


#2305

Александр, всё верно.

MrFresnel, возможно, я просмотрел, но не заметил, чтобы {$define DEBUG} или {$define DEBUG=off} как-то влияла на состояние галочки “Генерировать отладочную информацию”.


#2306

Обновил сообщение выше - извиняюсь за ошибку.


#2307

Попробуйте так:

begin
  WriteAllText('TestMod.txt', ReadAllText('Test.txt')
      .RegexReplace('\r\n([^A-ZА-ЯЁ])',' $1'))
end.

Если файл линуксовый, уберите из шаблона \r

Если в файле есть пустые строки, вызовите дважды, указав выходной файл первого прогона в качестве входного: он будет перезаписан.

Если заведомо известно, что пустые строки есть, можно так:

begin
  var s := ReadAllText('Test.txt');
  while s.MatchValue('\r\n[^A-ZА-ЯЁ]') <> '' do
    s := s.RegexReplace('\r\n([^A-ZА-ЯЁ])',' $1');
  WriteAllText('TestMod.txt', s)
end.

#2308

Я тут подумал - нехорошо пустые строки так удалять, потому что каждая пустая будет пробелом замещаться. Но можно предварительно пройти файл построчно с использованием ReadLines( ) и переписать из него непустые строки.


#2309

@Admin а вообще это должно работать? Потому что $define и $undef не работают на DEBUG, от слова вообще. Может реализуете что это действительно переключало режим компиляции, чтоб не лезть каждый раз в настройки?


#2310

Если и реализовывать переключение настроек директивами, то делать это для всех настроек. Иначе по какому принципу они отбираются? Реализовывать только для DEBUG не вижу смысла. Может, стоит тогда сделать конфигурации компиляции для файлов (?) и проектов, по аналогии с Visual Studio? Но, насколько это будет востребовано? Я против того, чтобы из-за моей (!) ошибки разработчики исправляли свой проект, только ради того чтобы моя ошибка переставала быть ошибкой.

Значит, это моя ошибка, а не повод реализовывать очередной функционал.


#2312

В настройках есть пункт “Генерировать отладочную информацию” - это Debug. Надо понимать, что если программа запускается в режиме связи с оболочкой, то всё равно будет Debug.

По поводу констант вида {$define DEBUG} необходимо понимать, что они распространяются только на один .pas-файл. То есть, если его определить в модуле, он не будет действовать в основной программе. Вы же хотите глобальные константы. Такого функционала нет.


#2313

Чувствую сейчас последует просьба добавить директиву GLOBAL_CONSTS, или пункт Включить глобальные константы в настройки…


#2314

Число Авогадро, радиус Земли и постоянную Планка?


#2315

Запустил PascalABC.NET с правами администратора, добавил функционал в PABCSystem:

type
  ArrayOf<T> = array of T;
  MatrixOf<T> = array [,] of T;
  
  ns = static class
  public
    static function GArray<T>(count: integer;
      selector: integer -> T;
      firstIndex: integer := 0) := NETSquirrel.Utils.ArraysUtils.GenerateArray(count, selector, firstIndex);
  
    static function GArray<T>(count: integer;
      first: T;
      next: T -> T) := NETSquirrel.Utils.ArraysUtils.GenerateArray(count, first, next);
  
    static function GArray<T>(count: integer;
      selector: (ArrayOf<T>, integer) -> T) := NETSquirrel.Utils.ArraysUtils.GenerateArray(count, selector);
  end;

Попытался использовать из программы:

begin
  ns.GArray(10, x -> x).Println();
end.

, Intellisence - нормально реагирует на добавленный функционал - он его видит, но компилятор выдаёт ошибку:

Program1.pas(3) : ns не объявлен в пространстве имен PABCSystem

@Admin, как правильно пополнять функционал PABCSystem, чтобы им можно было без проблем пользоваться?


#2316

Надо проверить, не включено ли ускорение из под оболочки.

Кроме того, надо перегенерировать все pcu


#2317

@Admin, как это сделать, если не вручную? Встроенные средства имеются?


#2318

Встроенные средства имеются в репозитории. В готовый пакет такое не добавляется и не должно.


#2319

Здравствуйте. А есть ли функционал для сравнения двух динамических массивов на равенство (или неравенство) содержимого?

begin
  var a := Arr(1, 2, 3);
  var b := Arr(1, 2, 3);
  Println(a = b);  // False
 // понятно объекты разные, а как сравнить на содержимое?
end.

#2320

Навскидку:

begin
  var a := Arr(1, 2, 3);
  var b := Arr(1, 2, 3);
  ((a.Length = b.Length) and a.Zip(b, (p, q) -> p=q).All(p -> p)).Println
end.

#2321

a.SequenceEqual(b)


#2322

А если нужна скорость - лучше комбинировать:

(a.Length = b.Length) and a.SequenceEqual(b)

Потому что .SequenceEqual эффективнее сравнивает отдельные элементы.
Но при этом длины массивов сравниваются только после проверки всех элементов на равенство, хотя длины это то, что проще проверить и обычно чаще отличается.