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

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

Procedure MakeString(c1,c2,c3:char;sd:TArrStr); 
  var j:byte;
  begin s:=c1;
  For j:=1 to N-1 do
  If ji,j:7:0,sAN[j]);

Тут что должно было происходить? я не понял…

Для начала удалить {$M 20000,0,0} USES DOS. CRT тоже не нужен. Выкинуть. Привести кодировку к нормальному виду, преобразовав все как минимум в Windows1251

ibond

Для начала удалить {$M 20000,0,0} USES DOS. CRT тоже не нужен. Выкинуть. Привести кодировку к нормальному виду, преобразовав все как минимум в Windows1251

Спасибо, где об этом можно узнать, найти примеры?

Здравствуйте! установил последнюю версию pascal+ framework с оф сайта. определил varы типа int64. При вычислении суммы кубов чисел 1, 1, 3182 результат -2141593798, т.е. вычисление идет по типу longint. Как исправить? Система windows 10 64bit.

Код приведите

Вот код.

program ABCN;

var r, t, s, N: int64; f: text;

function NOD(m, s: int64): int64; var a, b: int64; begin a := m; b := s; if a <> 0 then NOD := NOD(b mod a, a) else NOD := b; end;

begin rewrite(f, ‘D:/Pascal/ABCN.txt’); for var x := 1 to 10 do for var y := x to 100000 do for var z := y to 100000 do begin r := nod(x, y); if nod(r, z) = 1 then begin t := x * x * x + y * y * y + z * z * z; writeln(‘t’, x:10, y:10, z:10, t:20); s := x * y * z; if t mod s = 0 then begin N := t div s; writeln(f, N:10); writeln(f, x:10); writeln(f, y:10); writeln(f, z:10); writeln(f, s:10); writeln(N:15, x:10, y:10, z:10, s:20); end; end; end; writeln(’ END’); Close(f); end.

ну если подсветка кода не врет, то у вас x,y,z определяются перед циклом как integer, потому что для 100000 большего не надо. попробуйте вот так заменить:

for var x:= 1 to 10 do
  for var y: int64 := x to 100000 do
    for var z: int64 := y to 100000 do

UPD: подумал, для x оно не нужно. достаточно указать для y и z.

А за сколько времени должны быть обработаны эти примерно 50 миллиардов вариантов?

Спасибо. Все получилось. У меня есть еще предложение сделать встроенную функцию вычисления наибольшего общего делителя двух чисел, тем более что эта функция довольно востребована.

А можно вывод результатов сделать в виде таблицы в rtf или даже эксель файлы?

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

Что такое бэкграунд и как все это сделать, объясните, пожалуйста.

Ну консольное приложение так просто спрятать не получится, потому что открытый процесс - на самом деле cmd.exe. Но можно создать оконное приложение WinForms, которое будет сворачиваться в трей при запуске, и работать по заданному алгоритму, никому не мешая.

почитать про это можно тут например.

Что касается отправки писем, то портированный C# код будет выглядеть примерно так:

uses System.Net.Mail, System.Text;

begin
  var client := new SmtpClient();
  client.Port := 587;
  client.Host := 'smtp.gmail.com';
  client.EnableSsl := true;
  client.Timeout := 10000;
  client.DeliveryMethod := SmtpDeliveryMethod.Network;
  client.UseDefaultCredentials := false;
  client.Credentials := new System.Net.NetworkCredential('user@gmail.com','password');

  var mm := new MailMessage('donotreply@domain.com', 'sendtomyemail@domain.co.uk', 'test', 'test');
  mm.BodyEncoding := UTF8Encoding.UTF8;
  mm.DeliveryNotificationOptions := DeliveryNotificationOptions.OnFailure;

  client.Send(mm);
end.

естетсвенно нужно будет свои данные в него вставить.

1 лайк

Здравствуйте, не знаю куда отнести свою проблему, поэтому решил написать сюда. У меня есть такой код:

type
  TT = record
    x: integer := 0;// значение по умолчанию
  end;
var ATT:array of TT;
BEGIN
  setlength(ATT,1); // инициализируем массив
  ATT[0].x := -1;   // присваиваем свое значение
  writeln('x=',ATT[0].x); // проверяем что оно сохранилось || x=-1
  
  setlength(ATT,2); // меняем размерность
  writeln('x=',ATT[0].x); // проверяем что оно не сохранилось || x=0
END.

Суть в том, что в справке о “setlength” написано: “Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется”, но в данном случае оно теряется, а точнее заменяется на значение по умолчанию. Так и должно быть или это не предвиденный случай?

Если удалить значение по умолчанию, то тогда остается присвоенное значение.

Добрый день, только приступаю к знакомству с версией “ABC”, лет 15 назад пользовался “Turbo”, но уже почти все забыл, а что помню не очень подходит к современным реалиям, потому возникает куча вопросов:

Файл справки слабоват, в большинстве своем указаны краткие сведения, без уточнений и примеров, понимаю, что “много хочу”, но в результате сходу использовать прочитанное не получается. Например, захотелось мне узнать, есть ли в массиве определенный байт, или нет. Вспомнил, что встречал о похожую функцию в описании String, но вовремя вспомнил, что все элементы текста теперь 2 байта. Нашел схожую функцию в массивах - “IndexOf”, но не совсем понятна запись: “IndexOf”. Попробовал так: Position:=IndexOf(MyBytes,NewByte); - компилятор не знает такого слова! Пробовал использовать IndexOfByte вместо IndexOf - тот же результат.

Второй момент - в TurboPascal для работы с файлами были процедуры BlockRead и BlockWrite с произвольным размером (в пределах “сегмента”). Здесь вроде как можно считывать только жестко установленное кол-во байт, равное длине переменной. Но и это мне не очень подходит, т.к. при попытке считать переменную, например типа integer из файла, где осталось только 3 байта, немедленно проиозойдет ошибка. Перехватить ошибку можно, но как узнать, что считалось только 3 байта? Ведь ошибка могла возникнуть по разной причине, например испорченный сектор, а не только окончание файла, которое можно учесть, получив длиину файла при открытии!

Еще интересно: в описании типа данных “char” приведены функции chr(), char() и chrunicode(). Для наглядности сделал вывод на экран всех трех функций с одинаковым значением в цикле. Странное дело: на одном компьютере все 3 символа выглядели одинаково, а на другом значение char() отличалось в диапазоне 128…159, хотя на обоих компьютерах одинаковая Win8rus64, и локализация форматов Россия. Совершенно случайно наткнулся на функцию chrAnsi(), вот она отличается от прочих, как и положено.

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

Pascal изначально не оперирует понятием “сегмент файловой системы”. Вы хотите читать из файла неизвестно сколько байт в неизвестно куда? Читайте в цикле в массив типа byte.

Любая операция ввода-вывода может завершиться с ошибкой. Но раньше можно было поставить диррективу компилятора {$I-} (кажется, уже не помню) и просто проверить код ошибки, плюс было известно, сколько байт реально удалось прочесть. Удобно ведь? )))

Не очень понял Вашего применения понятия “сегмент файловой системы”, ну да пока не до этого. Главное - я не хочу считывать “неизвестно сколько” и “неизвестно куда”. Я хочу считать (но главное - записать!) определенное кол-во байт, заданное переменной, и само собой в массив, а не в воздух. Под ДОСом блочная операция обработки бинарного файла, по сравнению с побайтовой, поднимала производительность в десятки раз. Кеширование в Винде конечно же частично решит эту проблему, но как быть с побайтовой записью, особенно при работе на флешке, где кеширования по записи по-умолчанию нет из-за возможности в любой момент вытащить флешку из юсб-порта? Пара часов работы и флешка на выброс из-за выработки MLC-ячеек? Плюс недозволительные тормоза. В принципе, проблема побайтной записи может быть решена применением транзакции, та же самая кеширующая буферизация, но я не знаю, есть ли она в ABC? И если есть, как ею пользоваться?

Еще остался пока насущным вопрос с использованием IndexOf Не верю, что данной функции не существует, так же маловероятно, что компилятор не определяет его из-за внутренней ошибки, вероятнее всего, я просто не умею пользоваться этой функцией. Если функция поиска байта в массиве все же существует, то хотелось бы увидеть пример правильного вызова.

Можно пользоваться классами .NET

uses System.IO;

begin
  var fs := new FileStream('test.bin',FileMode.Open);
  var off := 0;
  var count := 100;
  var arr := new byte[10000];
  while fs.Read(arr, off, count) = count do
  begin
    off += count;
  end;
end.
1 лайк

Мне сразу вспоминается пара бородатых анекдотов.

  • Доктор, когда делаю вот так, мне больно!
  • Голубчик, а Вы “вот так” больше не делайте!

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

Во-первых, никто Вам не запрещает кэширование включить. Во-вторых, я не понимаю, зачем развлекаться с обработкой данных на медленном носителе, таком, как флэш-драйв, вместо того, чтобы переписать данные на жесткий диск и там спокойно с ними работать. Флешка - это не устройство для РАБОТЫ С ДАННЫМИ, это устройство для ХРАНЕНИЯ данных.

Я понимаю Вашу ностальгию по ДОС-временам, готов даже понять раздражение от пресловутой “винды”, но весь этот обскурантизм - он ведь только Ваш, не правда ли? Я сам когда-то обрабатывал огромные массивы данных на ЕС ЭВМ с объемом памяти “аж 512 килобайт” и был в свое время возмущен “дикими тратами” памяти на персоналках. Но это время, время дорогих ЭВМ и дорогого машинного часа прошло. Сейчас час работы программиста стоит в разы дороже, чем неделя работы персонального компьютера. И теперь в моде не компактные и быстрые программы, а промышленные технологии, которые позволяют быстро разрабатывать приложения и дают низкую стоимость сопровождения таких приложений. Теперь учат не байты и микросекунды экономить, а быстро-быстро печь программки среднепаршивого качества. “Алгоритм” - это больше не звучит гордо, качественные алгоритмы имеют сугубо академический интерес. И флешку Вашу, по 120 рублей за 4 гигабайта, проще выкинуть и купить новую, чем неделями маяться с программой по её оптимальному использованию.

Подскажите, как создать документ MS Word в программе. В Дельфи есть функция createoleobject(‘Word.Application’), в С# вроде - var w = new Word.Application. А здесь как, что то нужно подключить в uses?

Здравствуйте. Есть ли способ задать отсутствующий цвет? К примеру, ссылочным переменным можно задать “nil”. Это удобно использовать в качестве значения по умолчанию параметра функции, а в самой функции проверять:

if a<>nil then begin
...
end;

Было бы неплохо сделать такую константу для цвета, знаю что есть свойство у цвета “IsEmpty”, но оно только на чтение. Я пока делаю так:

//HACK
const clNil = ARGB(0,0,0,0);
...
function func1(clr:Color:=clNil):boolean;
if clr = clNil then result := false
else begin

end;

но это, конечно же, не решение.

Color.Empty