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

Сообщение перенесено в тему Помощь новичкам

Я хочу получить информацию о 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

1 лайк

остальное железо

https://msdn.microsoft.com/en-us/library/aa389273(v=vs.85).aspx

1 лайк

[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] Подскажите пожалуйста. Что я делаю не так?

  1. Почему c.MaxBy выдает [3]
  2. При просмотре с, программа зацикливается.

Я думаю, всему виной ленивость. 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);
1 лайк

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

1 лайк
from math import sin
s = '3+(1-sin(3.14))*2'
print(eval(s))

Есть ли подобная функция в PascalABC.NET для вычисления математических выражений как в Python или как воспользоваться внутренним парсером для этого. Хотелось бы пару примеров увидеть. Спасибо.

Нет. Такое делается только для интерпретаторов. А PascalABC.NET - компилятор

А самое главное, такое бывает крайне редко нужно.

Если без использования функций (только операции и скобки), то можно:

{$reference System.Data.dll}
uses System.Data;
begin
  with new DataTable() do writeln(Compute(ReadString('Введите выражение:'), ''));
end.
2 лайка

Или вот так (@Admin не любит with :smile:):

{$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.

А кто минимальный парсер для такого напишет?

2 лайка

Парсер для (a+b)*c или парсер для произвольного арифметического выражения, включая унарные минусы?

Для произвольного, включая стандартные функции и, наверное, переменные

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

Не только парсинг, но и интерпретатор. А что такое алгоритм Дейкстры?