Что не так? Прокомментируйте, пожалуйста.
А что нужно комментировать? Кроме того, публикуйте код, чтобы запустить можно было. Почему тот, кто захочет это запустить, должен заниматься набором текста? Вы написали функцию, возвращающую значение своего аргумента. Передали 40, получили 40. Что не так?
Записть имя_функции :=
устаревшая, для этого дела есть Result
.
function F(n: integer):integer;
begin
f:=n;
writeln(f)
end;
begin
write(F(40));
end.
А что там writeln(f) печатает?
Тип функции. Она возвращает int32 и имеет параметр Int32. А Вы что рассчитывали таким оператором вывести? Если 40 - то это не Free Pascal, тут с результатом ассоциируется переменная Result, как Вам уже написали. Совместимость есть в части присваивания имени функции ее значения, но и только.
Точнее, во всех Write
и Print
объект преобразовывает функция _ObjectToString
.
Она не считает делегат (ссылку на функцию f
) каким то особенным типом, поэтому выводит его публичные свойства, в скобках через запятую. А их 2:
-
Method: System.Reflection.MethodInfo
- рефлекция на функцию. -
Target: object
- экземпляр объекта, методом которого является делегат. В данном случае делегат не метод - поэтомуnil
.
Спасибо.
Если я правильно понял вашу задумку, то код должен выглдяеть так:
function F(n: integer): integer;
begin
result := n;
end;
begin
write(F(40));
end.
А так получается, что вы выводите функцию, которая ничего не возвращает. Это тоже самое, если бы в питоне вы написали:
print(f)
То есть он бы вывел тип, а не значение функции
Подскажите, почему при инциализации типа/класса, например string нам достаточно написать
var a := '...'
или var a := String('...')
,
однако при инциализации пользовательского класса, например Class, перед значением необходимо добавлять new, например:
var a := new Class('...')
Иначе будут возникать ошибки
'...'
это литерал - то есть значение, вычисленное на этапе компиляции, и затем зашитое в .exe как есть.
String('...')
это синтаксис вызова operator explicit(s: string): string
, но раз тип на входе и выходе совпадает - компилятор не ищет соответствующую подпрограмму, а просто игнорирует преобразование.
Это не вызов конструктора, как в C++. В .Net есть строгое разделение, конструкторов и операторов преобразования.
Задача: отследить приблизительно 5 минут (300 секунд) малой активности процессора + диска + сети (в сумме до 15%).
uses System.Diagnostics;
begin
var cpu := new PerformanceCounter('Processor', '% Processor Time', '_Total');
var hdd := new PerformanceCounter('PhysicalDisk', '% Disk Time', '_Total');
{* ОШИБКА} var net := new PerformanceCounter('Network Interface', '% Network Time', '_Total');
//foreach var i in net.CategoryName() do Print(i);
var t: integer;
Repeat
var _cpu := Trunc(cpu.NextValue());
var _hdd := Trunc(hdd.NextValue());
var _net := Trunc(net.NextValue());
if _cpu + _hdd + _net < 15 then Inc(t) else t := 0;
Sleep(999);
//Print(t)
Until t > 300;
end.
Как правильно назвать Категорию, Счётчик и Инстанс для всех активных сетевых интерфейсов?
- Самый простой способ Через System.Diagnostic или можно проще?
- Как отследить общую дисковую активность на всех устройствах ввода-вывода, а не только основного Disk 0?
Спасиб
Откуда вы взяли те строковые значения? Надо с этим сначала разобраться.
## uses System.Diagnostics;
PerformanceCounterCategory
.GetCategories.OrderBy(c->c.CategoryName)
.PrintLines(c->$'{c.CategoryName}: {_ObjectToString(c.GetInstanceNames)}');
У меня всего 1 физический диск, но 3 логических (тот что использую + 2 системных). Поэтому мне показывает:
LogicalDisk: [C:,_Total,HarddiskVolume1,HarddiskVolume3]
Спасибо, Sun_Serega.
Вся загвоздка была как раз в этом, а я при переносе, видимо, отвлёкся на обёртку, модуль или алиасы.
Всем творчества и с Наступающими!
Доброго времени! Подскажите, пожалуйста, как решить проблему с размерами стандартного поля исполнителя “Чертёжник”, если в справке указан размер 20 на 30, при описании процедуры при наведении курсора 9 на 11, а по факту при выполнении программы - 9 на 7. Спасибо!
Да, поправим в справке. 9 на 7 будет. 20 на 30 я такого не вижу
Файл Table2.txt содержит таблицу чисел размером, например, 10х2:
1 1
2 4
3 9
…
10 100
Требуется прочитать файл и поместить его весь в матрицу такого же размера.
В PascalABC.NET нет функции типа ReadAllMatr. Но есть ReadAllLines, ReadAllText и ReadLines.
Требуется, используя только эти новшества PascalABC.NET, получить матрицу.
Вариант 1.
##
// считать файл в строку:
var a := ReadAllText('Table2.txt'); // a: string
// строку превратить в массив чисел
// и на его основе сгенерировать матрицу 10x2:
var m := Matr(10, 2, a.ToIntegers);
Недостаток: надо заранее знать размер матрицы.
Вариант 2. С программным определением размера матрицы:
##
// определить колич. строк и колич. столбцов таблицы:
var b := ReadAllLines('Table2.txt');// b: array of string
var КоличСтрок := b.Length;
var КоличСтолбцов := b[0].ToIntegers.Length;
b := nil;
// считать файл в строку:
var a := ReadAllText('Table2.txt'); // a: string
// строку превратить в массив чисел
// и на его основе сгенерировать матрицу:
var m := Matr(КоличСтрок, КоличСтолбцов, a.ToIntegers);
m.Println;
Вариант не самый красивый: файл читается два раза.
А как, чтобы красиво?
(Традиционный способ: читать файл в цикле построчно, строку превращать в массив и добавлять его в матрицу, – мне известен.)
Спасибо!
А давайте представим, что компьютер - это Вы. И нужно решить поставленную Вами задачу… Есть текстовый файл, что в нем, Вы пока не знаете. И нужно создать матрицу - какую, Вы тоже не знаете. Ваши действия?
“Кампютер, кампютер, сделай матрицу мне нада” - такой номер не пройдет.
Вспомнил, что есть генератор Matr, не требующий указания размера матрицы, матрицу можно построить на основе одномерного массива чисел. Так что задача сводится к преобразованию массива строк, прочитанных из файла, в массив чисел.
var a := ReadAllLines('Table2.txt'); // a: array of string
var m := Matr(a.Select(x -> x.ToIntegers).ToArray); // m: array[,] of integer
Никогда так не делайте. .Select
возвращает ленивую последовательность. .ToArray
не может узнать её размер, пока всё не посчитает. Поэтому ему приходится выделять кучу временных массивов, для хранения промежуточных результатов.
Раз у вас на входе коллекция с заранее известной длиной - лучше использовать .ConvertAll
- он создаёт только 1 массив, для результата.
И лучше указать явно что вы передаёте именно строки а не столбцы, вызывая MatrByRow
.
Спасибо! очень хорошо! Будьте добры, поясните пожалуйста. Я ожидал, что получится двумерный массив-матрица m: array [,] of integer, и PrintLn(m.GetType) подтверждает: System.Int32[,]. Но. Когда я навожу курсор на переменную m, m1, m2, то высвечивается документирующий комментарий - тот, что я указал в комментариях.
##
var a := ReadAllLines('Table2.txt');
// a: array of string
var m := Matr(a.Select(x -> x.ToIntegers).ToArray);
// m: array[,] of string
var m1 := Matr(a.ConvertAll(x -> x.ToIntegers));
// m1: array[,] of array of array integer
var m2 := MatrByRow(a.ConvertAll(x -> x.ToIntegers));
// m2: array[,] of array of array integer
PrintLn(m.GetType); // System.Int32[,]
PrintLn(m1.GetType); // System.Int32[,]
PrintLn(m2.GetType); // System.Int32[,]
m.Println;
{ 1 1
2 4
3 9
... }
// доступ к элементам матрицы, перемножение:
PrintLn(m[1, 0] * m[1, 1]);
// 8
Какой тип переменных m, m1, m2? На печать выдается во всех трех случаях одно и то же. И во всех случаях можно выполнять ар.действия, - значит, матрица чисел. Почему же тогда для m высвечивается m: array[,] of string, а не m: array [,] of integer? И чем отличаются тогда m1 и m2? Спасибо!