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

Он не выводит массивы, списки и т.п. Он выводит последовательности. А последовательности бывают бесконечные.

Понял. Одна процедура для различных типов.

А можно как-то узнать конечность или бесконечность, чтобы добавлять … только для последних ?

Спасибо.

Конечные последовательности наследуют от ICollection.

Если в PABCSystem заменить строку 3487 на

    while g.MoveNext() and ((o is System.Collections.ICollection) or (cnt < nmax)) do 

Конечные последовательности будет выводить до конца.

@Admin что думаете?

Если надо последовательности выводить до конца - преобразуйте в строку на свой страх и риск. Но последовательности могут быть очень большими

Согласен с тем, что вывод заведомо очень длинных последовательностей на экран - это скорее просчёт программиста. А есть переменная или другая возможность задавать порог количества выводимых элементов ? nmax меняется извне ?

Writeln - не позволит выводить последовательности длинной больше 100 элементов. Но Print/Println - не даёт таких ограничений.

/// Выводит последовательность на экран, используя delim в качестве разделителя
function Print<T>(Self: sequence of T; delim: string): sequence of T; extensionmethod;
begin
  var g := Self.GetEnumerator();
  if g.MoveNext() then
    Write(g.Current);
  while g.MoveNext() do
    if delim <> '' then
      Write(delim, g.Current)
    else Write(g.Current);
  Result := Self; 
end;

/// Выводит последовательность на экран, используя пробел в качестве разделителя
function Print<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
  if typeof(T) = typeof(char) then 
    Result := Self.Print('')
  else  
    Result := Self.Print(PrintDelimDefault);  
end;

/// Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку
function Println<T>(Self: sequence of T; delim: string): sequence of T; extensionmethod;
begin
  Self.Print(delim);
  Writeln;
  Result := Self;  
end;

/// Выводит последовательность на экран, используя пробел качестве разделителя, и переходит на новую строку
function Println<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
  if typeof(T) = typeof(char) then 
    Result := Self.Println('')
  else  
    Result := Self.Println(PrintDelimDefault);  
end;

Благодарю @Sun_Serega за корректировку ответа.

Жаль, но понятно. Хотя не совсем ясно зачем в примере считать 100000 простых чисел, если выводится лишь около сотни последних.

Нет ну почему, у того же .Println нет такого ограничения, вот его и используйте.

begin
  (new byte[150]).Println;
end.

Инструментарий всегда надо знать. С оговоркой по Жванецкому:

Если, конечно, Вас интересует результат

3 лайка

После ознакомления со справкой и примерами у меня возник вопрос:

А откуда лично вы узнали о

var primes := Range(2, n).ToHashSet;
и как пришли к подобному решению?
"Всем хорошим во мне я обязан книгам"
   М. Горький

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

1 лайк

Кроме книг, так же из источников информации:

  • На главной странице офф сайта есть несколько презентаций. Их мало и они короткие, но разок прочитать стоит, найдёте много интересного и полезного;

  • Когда вы наводите мышкой на что то, нажимаете Ctrl+Space или ставите точку - вам показывает тонну полезной информации по данному контексту;

  • Если поставить курсор на то что не понятно - можно нажать F1 - откроется справка на нужной странице;

  • Для всего паскалевского открывается паскалевская справка, но для вещей вроде .ToHashSet - откроется сайт msdn, который является справкой .Net;

  • Когда не знаете как что то сделать - лучше всего искать на StackOverflow, с тегом [c#], потому что всё из C# есть в паскале, перевести можно строчка в строчку.

Полезность информации - это такая тонкая штука! Уж череcчур сильно она пересекается с другим свойством информации - ее своевременностью. Пока найдешь в тонне “полезной информации” свое жемчужное зерно, твой поезд может уйти.

Просмотреть всё что отображается по точке для System - это максимум пару часов. Хотя я и сам так не делал, я его по частям смотрел.

Кники как раз всегда больше чем на 2 часа отстают от современности)).

Современность и своевременность - это, как говорят в Одессе, “две большие разницы”.

Вопрос был не о том.

Абрамяна как раз читаю, а у Осипова посмотрел единственное упоминание “hashset” на странице 135 в разделе “Множества” и понял, что-то пропустил или же придётся читать в другом месте. А Вы эрудит или где-то узнавали и для какой-то задачи?

Про HashSet будет в части 10 “Стандартные коллекции”. Вот рабочий фрагмент Фрагмент.pdf (435,0 КБ) Он пока не окончательный, но что-то Вы там найти сможете.

Просто попробуйте навести курсор мыши на мою иконку и подождать всплывающую подсказку.

P.S. Так и вспоминается фраза из кинофильма “Кин-Дза-Дза!”:>

Девочка, вы тут самые умные? Это вам кто-нибудь сказал, или вы сами решили?

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

Для меня пока очень много особенностей Pascal Abc .Net, о которых я даже не догадывался. Жду полную версию, чтобы научиться.

Узнавать приходилось из Справки и презентаций на официальном сайте. Путем изучения контрольных примеров, идущих в комплекте поставки. Помогло общение на форуме. А для чего применять… чтобы научиться писать современный код. Изучить современные технологии программирования.

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

1 лайк

image

Подробная информация об использовании оперативной 
(JIT) отладки вместо данного диалогового 
окна содержится в конце этого сообщения.

************** Текст исключения **************
System.ArgumentOutOfRangeException: Длина не может быть меньше нуля.
Имя параметра: length
   в System.String.Substring(Int32 startIndex, Int32 length)
   в VisualPascalABC.OutputWindowForm.InputTextBox_TextChanged(Object sender, EventArgs e)
   в System.Windows.Forms.Control.OnTextChanged(EventArgs e)
   в System.Windows.Forms.Control.set_Text(String value)
   в System.Windows.Forms.TextBoxBase.set_Text(String value)
   в System.Windows.Forms.TextBox.set_Text(String value)
   в VisualPascalABC.WorkbenchRunService.UpdateReadRequest(Boolean changeSelected)
   в VisualPascalABC.Form1.ChangedSelectedTab()
   в System.Windows.Forms.Form.OnActivated(EventArgs e)
   в System.Windows.Forms.Form.set_Active(Boolean value)
   в System.Windows.Forms.Form.ActivateMdiChildInternal(Form form)
   в System.Windows.Forms.Form.WmMdiActivate(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

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