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


#1058

Вот такой вопрос: хотел из текстового файла выводить русские слова в консоль (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.

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

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

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


#1059

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


#1060

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


#1061

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


#1062

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

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

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


#1063

Есть :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:


#1064

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

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


#1065

Как вариант:

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

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


#1066

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


#1067

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


#1068

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


#1069

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


#1070

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


#1073

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


#1074

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


#1075

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


#1076

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


#1077

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


#1078

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


#1079

Да, как-то не очень понятно, наверное написал, но как уж получилось. Пример, удаление 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.

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