- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
static class MathParser
{
static double getFunc(char op, double a, double b)
{
switch (op)
{
case '+': return a + b; case '-': return a - b;
case '*': return a * b; case '/': return a / b; case '%': return a % b;
case '^': return Pow(a, b); default: return double.NaN;
}
}
static char[][] ops = { new char[] { '+', '-' }, new char[] { '*', '/', '%' }, new char[] { '^' } };
public static double Eval(string str) => Eval(ref str, 0, str.Length);
private static double Eval(ref string str, int z, int l, int i = 0)
{
for (; i < 3; i++)
for (int v = l - 1; v >= z; v--)
for (int j = ops[i].Length - 1; j >= 0; j--)
if (str[v] == ops[i][j])
return getFunc(str[v],
Eval(ref str, z, v, i),
Eval(ref str, v + 1, l, i + 1));
return double.Parse(str.Substring(z, l - z));
}
}
Какой-то укуренный калькулятор получился...
MathParser.Eval("3,1346") => 3.1346
MathParser.Eval("3+2*5") => 13
MathParser.Eval("2^5-1") => 31
MathParser.Eval("1/2^3") => 0.125
MathParser.Eval("2^2^2^2") => 256
MathParser.Eval("7,2%3") => 1.2
Пользуйтесь константными констукторами.
Везде идёт подмена блока.
Но ничего, с выходом бесплатной делфи этому уёбищё настал конец. Я верю в это.
Вдруг замычали тоже отчего-то,
За ними львы, жирафы, кашалоты,
Орлы, гориллы, крокодилы — все твердили «Му»!
Иначе строка превращается в какой-то ебучий god object.
std::begin(str) же! Чтобы для массивов тоже работало.
К слову “low” антоним “high”.
С точки зрения Руби всё правильно (принцип наименьшей неожиданности или как там).
Какая неконсистентность (((
Поскольку длина ограничена, реаллокация не нужна.
Правда, толку от таких коротеньких строк немного...
Это при чтении из файловой переменной типа Text файл разбивался на строки по CRLF, но так и было задумано. Для произвольных файлов были типы file и file of byte.
#13#10 вне апострофов –— это и есть вставка CRLF.
Это будет означать передачу по указателю. Счётчик ссылок при этом не работает и память не выделяется. Короче, чисто для оптимизации.
Для параметров без var и const вызывается «копирующий конструктор»: скалярные значения пушатся в стек (или передаются через регистры в случае fastcall), для структурированных же в стеке создаётся копия, а потом отправляется указатель на копию.
С const всё ясно: поскольку запретили изменять, то и указатель не будет изменяться.
Интереснее, что происходит со строками в случае var и в случае передачи по значению.
Оставили бы просто PChar - и горя б не знали.
1. В нём нельзя хранить байт с кодом 0 (ноль).
2. Как следствие, в нём нельзя хранить строки в кодировке UCS-2 (хотя это не проблема, ведь существует PWideChar).
3. Операция определения длины строки очень медленная, ведь требуется каждый раз сканировать всю строку в поисках байта с кодом 0.
Как следствие возможны утечки памяти, если случайно в строку поместить байт с кодом 0. Значит, при получении данных из сторонних источников нужно проверять содержимое строки.
Пиздец, какой недостаток, особенно для делфи под Windows! О-о-о! Всё, выбрасываем делфи.
@2
...
@3. Операция определения длины строки очень медленная, ведь требуется каждый раз сканировать всю строку в поисках байта с кодом 0.
Длину можно хранить по отрицательному смещению. см.
Года два-три назад я долго вникал в смысл этого черезжопия, пока не додуплил, что на выходе будет совместимый PChar, и для определения длины необязательно искать нулевой символ.
Зря смеёшься. У некоторых программ были уязвимости, связанные с особой трактовкой байта, равного нулю.
«Длинные строки» стали называться AnsiString и WideString (разница между AnsiString и WideString в логике работы функций стандартной библиотеки, выделяющих подстроку по позиции символа, а не байта). У них индикатор длины вроде бы не два байта, а четыре, т. е. длина строки ограничена четырьмя гигами. Надо добыть исходники SYSTEM.PAS и посмотреть.
В «Си» аналогичная ситуация: там тоже пустая строка занимает один байт: в нём хранится терминатор, по нелепому совпадению тоже равный 0.
Им бы справку читать, а не выпендриваться.
Какой БАГОР)))
Возможно, тип string[0] объявить нельзя, но мы об этом и не говорили. Мне такой тип данных ни разу не понадобился.
Вот пустые записи (структуры) обычное дело, когда нужно застолбить указатель на конец чего-то крупного:
• пишешь небольшую функцию
• компилируешь
• смотришь результат дизассемблирования
Когда в конце 5 курса медынститута я начал учить делфи ради забавы, то и представить не мог, что мне придется впахивать сисадминцем в какой-то гнилой больнице.
Самое смешное, что зав. главного врача в нашей гнилушке- тоже гамсик. Не зная моего бравого прошлого, он пытался брызгать на меня слюной как на простого опа, а когда получил отповедь - заткнулся, спеси поубавилось.
Ты поди ещё не знаешь, что такое евроремонт?
Ты никак не можешь понять, что вреда от тебя ничуть не меньше, ноешь, флудишь, срешь где попало. Мудак ты.