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

Вот такой вопрос: хотел из текстового файла выводить русские слова в консоль (PascalABC).

  a: string;
  f: Text;

begin
  assign(f, 'C:\PABCWork.NET\programs\Провека букв в словах\word_rus.txt');
  Reset(f);
  loop 100 do
  begin
    Readln(f, a);
    writeln(a);
    end;
  close(f);
end.

Вроде выводятся, но в неправильной кодировке и в результате получается

абаз
абазин
абазинка
абака
аббат
аббатиса
аббатисса
аббатство
аббревиатура
абвер
абверовец
аберрация
абзац
абиогенез
абиссаль
абиссинец
абиссинка
абитуриент
абитуриентка
аболиционизм
...

Видимо я чего-то не понял.

PascalABC 10 лет как снят с поддержки. Тут PascalABC.NЕТ. Кстати, loop в PascalABc не поддерживается. А для отладки и понимания файл надо прикрепить Ваш текстовый

Под PascalABC я имел ввиду PascalABC.NЕТ, всё правильно. Вот файл, откуда скачивал. http://blog.harrix.org/wp-content/uploads/2015/08/word_rus.zip - обычный .txt в архиве. word_rus.txt (700,3 КБ). Возможно, знаете такую игру, в которой есть длинное слово, и из его букв нужно составлять другие маленькие. Для этого решения стало интересно сделать программу. main.pas (679 Байты) Это пока алгоритм продумал. Теперь хочу, что бы с текстового файла слова брал и анализировал. Сделал со свои файлом, всё хорошо. Здесь какие-то проблемы в кодировке символов

Вообщем перекопировал то же самое в другой файл, и нормально отображается.

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

Решением было бы добавить кодировку файла перегрузкой assign с тремя параметрами, где третий - строка с именем кодировки. По умолчанию - кодировка принятой в системе локали. Или, к примеру, вызов вроде setEncoding(f, ‘name’).

Может, уже есть?:slight_smile:

Есть :slight_smile:

@0_kotik_0

begin
  var words := ReadAllLines('word_rus.txt', System.Text.Encoding.UTF8);
  foreach var w in words do
    println(w);
end.

Только осторожно, от так все 34010 слов выведет :slight_smile:

Да, вроде в буфере обмена сохраняется всегда в стандартной кодировке, вне зависимости от того что копировали.

И, вам рекомендовали добавить указание кодировки в паскале, но можно и поменять кодировку файла. К примеру, Notepad++ так может:

Как вариант:

begin
  ReadLines('word_rus.txt', Encoding.UTF8).Take(100).PrintLines
end.

Если запускаете из-под среды Паскаля, то по умолчанию файлы ищутся в той же директории, где создаются скомпилированные .exe. У меня это C:\PABCWork.NET\Output

Понимаю, что вопрос не относится напрямую к PascalABC.NET, но всё же задам его здесь. Я решил собрать компьютер на Intel Xeon. В описании сказано, что поддерживается до 64 ГБ оперативной памяти. Собственно, сможет ли .NET работать с такой оперативкой? Как-то раз программа выплюнула ошибку, что массивы более 2 ГБ не поддерживаются. Ставить планирую Win7 x64.

2.1 Гб - это порог адресации при счетчике длиной 4 байта. Он используется обычно в массивах, строках и т.п. Так что за 2 миллиарда элементов массива Вы не перейдете.

А почему по расчётам получается 4096 МБ? А на x64 будет работать?

Потому, что диапазон 2^32 - это числа от 0 до 2^32-1 для беззнаковых чисел и -2^31 … 2^31-1 при поддержке знака в старшем бите.

3 сообщения перенесены в тему Болталка PascalABC.NET

Ну какое отношение указатель имеет к счетчику элементов? Я не знаю, как там все внутри устроено, да и неважно это, если говорится о технических ограничениях - изменить мы их все равно не можем. Но большинство программных средств под Windows имеют ограничения в 1-2-4 миллиарда неважно чего - элементов, отводимой памяти и т.п. Это зависит от количества выделяемых служебных битов или байтов.

Аааа, понял. Счётчик имеет тип Int32. Ясно. Вопрос закрыт.

6 сообщений перенесены в тему Болталка PascalABC.NET

Какой способ лучше использовать для удаления (вставки) строк (столбцов) в динамических матрицах? Если например взять удаление строки и сдвинуть столбцы на 1 элемент а потом SetLength(a,m-1,n,) выделить новую память вроде так можно технически, но это даже хуже, чем со статической матрицей, которой всего то нужно уменьшить число строк и не нужно переопределять новую память. Есть ли какие-то другие способы для динамических матриц? Такие, как если бы был такой расширяемый тип матриц у которой строки и стобцы были бы типами List? Если в строки еще можно вставить те же списки (List), например, определив массив списков, и потом можно удалять столбцы и даже несколько столбцов методами для List, то вот со строками не понятно получается, да и как удалить элемент массива списков - список, чтобы не выделять потом новую память? Или для таких задач лучше пользоваться статическими матрицами?

Можете привести пример? Ну или объяснить подробнее?

Всё, понял. Нет, так не получится сделать. Даже List построен на базе динамического массива, поэтому удаление элемента с последующим смещением так же потребует память.

Да, как-то не очень понятно, наверное написал, но как уж получилось. Пример, удаление k-й строки в динамической матрице:

begin
  var m := 5;
  var n := 6;
  
  var a := MatrRandom(m, n, 0, 100); a.Println;
  
  var k := 0;
  
  for var i := k to m - 2 do
    for var j := 0 to n - 1 do
      a[i, j] := a[i + 1, j];
  
  SetLength(a, m - 1, n);
  
  Println;
  a.Println;
end.

Мне не нравится, что нужно выделять новую память после удаления строки, какие есть еще способы?