Я хочу получить информацию о OS, процессоре, графическом процессоре и т.д. так, что бы программа могла автоматически выводить эти данные. Да, версия OS и чсило процессоров есть в классе System.Environment, но а название процессора и т.д. как можно узнать, какие библиотеки использовать? p.s. именно что бы программа сама узнавала
begin
writeln(System.Environment.GetEnvironmentVariable('PROCESSOR_IDENTIFIER'));
end.
есть еще класс System.Windows.Forms.SystemInformation. там много настроек. надо подключать сборку System.Windows.Forms.dll.
данные о видеокарты берутся с помощью WMI
{$reference System.Management.dll}
uses System.Management;
begin
var objvide := new ManagementObjectSearcher('select * from Win32_VideoController');
foreach obj: ManagementObject in objvide.Get() do
begin
writeln(obj['Name']);
writeln(obj['DriverDate']);
end;
end.
и т.д.
тут описаные все свойства объекта WMI https://msdn.microsoft.com/en-us/library/aa394512(v=vs.85).aspx
[CODE]begin var a:=arr(arr(1,1),arr(2,2,2),arr(3,3)); a.Println; println(a.MaxBy(i->i.Count)); foreach var i in a do println(i.First);
var b:=seq(seq(1,1),seq(2,2,2),seq(3,3)); b.Println; println(b.MaxBy(i->i.Count)); foreach var i in b do println(i.First);
var c:=arr(1,1,2,2,2,3,3).AdjacentGroup; c.Println; println(c.MaxBy(i->i.Count)); foreach var i in c do println(i.First); end.[/CODE] Подскажите пожалуйста. Что я делаю не так?
- Почему c.MaxBy выдает [3]
- При просмотре с, программа зацикливается.
Я думаю, всему виной ленивость. AdjacentGroup возвращает последовательность последовательностей, а это дополнительное усложнение. Так работает - я превратил последовательность последовательностей в последовательность массивов
var c:=arr(1,1,2,2,2,3,3).AdjacentGroup.Select(x->x.ToArray)
c.Println;
println(c.MaxBy(i->i.Count));
foreach var i in c do
println(i.First);
Я уж молчу, что бывает, когда под ленивость попадает read…
Обращаюсь за помощью по сетевому программированию с модулем clientserver.
Имеется две программы - клиент и сервер. По сути, это прототип чата клиент-сервер-клиент. Но проблемы начались при обратной связи (т.е. не клиент -> сервер, а сервер -> клиент). Выскакивает ошибка “Поток был недоступен для чтения.”.
Я так понимаю, что RunServer “настраивает” Сервер принимать “сообщения”, SendCommand и SendCommandAndReceiveAnwser отсылают эти сообщения. Но загвоздка в том, что SendCommandAndReceiveAnwser не настраивает Клиент принять сообщение.
Ближе к коду: выполняется процедура входа. В Клиенте вводятся данные и отсылаются на Сервер функцией clientserver.SendCommandAndReceiveAnswer('enter ‘+loginF.Text+’ '+password), которая же примет значение и запишет её в переменную s (строка с ответом - либо сигнал об ошибке, либо передача данных). Получается нечто такое:
Часть кода из Клиента:
procedure Enter;
begin
var s:=clientserver.SendCommandAndReceiveAnswer('enter ‘+loginF.Text+’ ‘+password);
case s of
’reg’:
if MessageBox(1,‘Нет пользователя’,‘Ошибка: такого пользователя нет. Хотите зарегистрировать его?’,0)=0 then ;//Не сделано до конца, да и то ли окошко выскочит, пока не знаю…
end;
end;
Часть кода из Сервера:
function Server (command:string):string;
begin
writeln(command);
writeln(command.ToWords(’ ‘)[0]);
case command.ToWords(’ ‘)[0] of
’enter’:begin
writeln(command.ToWords(’ ‘)[1]);
if (command.ToWords(’ ')[1] in d) then else result:=‘reg’;
end;
end;
end;
Поясню на всякий случай, что d - это словарь, где ключом является логин пользователя, а элементом вся остальная информация (в виде записи). А функция Server будет выполнять всю работу по обработке информации (поcему и начат case).
Так вот, в чем дело-то… При попытке принять Клиентом какой-то ответ от Сервера (в т.ч. пустую строку - т.к. ошибка происходит даже при существующем в базе логине), выскакивает ошибка “Ошибка времени выполнения: System.ArgumentException: Поток был недоступен для чтения.”. В качестве строки кода где эта ошибка была допущена приводится строка 81 модуля ClientServer.pas ( var br := new BinaryReader(stream); ) и строка моего кода, где использовалась SendCommandAndReceiveAnswer. Подскажите,что делать. Заранее спасибо.
from math import sin
s = '3+(1-sin(3.14))*2'
print(eval(s))
Есть ли подобная функция в PascalABC.NET для вычисления математических выражений как в Python или как воспользоваться внутренним парсером для этого. Хотелось бы пару примеров увидеть. Спасибо.
А самое главное, такое бывает крайне редко нужно.
Если без использования функций (только операции и скобки), то можно:
{$reference System.Data.dll}
uses System.Data;
begin
with new DataTable() do writeln(Compute(ReadString('Введите выражение:'), ''));
end.
Или вот так (@Admin не любит with ):
{$reference System.Data.dll}
uses System.Data;
begin
Writeln((new DataTable).Compute(ReadString('Введите выражение:'), ''));
end.
Надо же, в базах данных нашлась!
begin
var s := '(2+3)*6';
Print(System.Data.DataTable.Create.Compute(s,''))
end.
А кто минимальный парсер для такого напишет?
Парсер для (a+b)*c или парсер для произвольного арифметического выражения, включая унарные минусы?
Для произвольного, включая стандартные функции и, наверное, переменные
Если только парсинг, то достаточно иметь список имен функций и включать в них все, что идет после имени от первой открывающей скобки до соответствующей ей по уровню вложенности закрывающей. Подумать надо, как выделять операцию унарного минуса. А остальное - чем тот же алгоритм Дейкстры плох?
Не только парсинг, но и интерпретатор. А что такое алгоритм Дейкстры?