Текущий архив: 2004.08.15;
Скачать: CL | DM;
Вниз
Подробный и понятный комментарий! Найти похожие ветки
← →
Юрий Зотов © (2004-07-23 17:27) [240]> ОДним словом - паразит, это когда живешь таким образом
> постоянно
Применительно к сабжу я бы сказал даже так: "Паразит - это образ жизни". И, учитывая, что под такой образ жизни еще и пытаются подвести базу, добавил бы: "А паразитизм - это мировоззрение".
← →
Суслик © (2004-07-23 17:28) [241]
> calm © (23.07.04 17:24) [238]
Для оптимизации есть специальные люди.
Ты, прикладной программист, пишешь суть запроса.
Он, спец, оптимизирует строго формально.
Другой вопрос, когда ты, прикладной программист (в данном контекстве скорее ламер), запуздырил такую структруру, что он,спец, ничего не может сделать. Это особый разговор.
Но вот знать планы запросов для прикладного программиста считаю не надо. Мы так работаем успешно не первый год. Все равно так зинасиловать запрос как это делает на Санек я не смогу. Мне надо несколько лет, заметьте не на чтение доки (books online я все читал), а на эксперитменты. Зачем? Есть он. Зато он не знает много, чего знаю я, зато я знаю, что есть он. В общем - все в порядке вещей - конвейер. :))))
← →
Суслик © (2004-07-23 17:29) [242]
> Юрий Зотов © (23.07.04 17:27) [240]
Ну вы согласны, что если иногда спрашиваешь Юрия Зотова о чем-то в чем тот хорошо разбирается, то это еще не паразитизм?
← →
Юрий Зотов © (2004-07-23 17:33) [243]> Суслик © (23.07.04 17:29) [242]
Дима, да бросьте Вы самоедством заниматься. Нет, естественно. Вы думаете, я никогда никому вопросов не задавал, что ли?
← →
ИдиотЪ (2004-07-23 17:36) [244]Суслик ©
хочешь сказать, админы должны потом репу чесать, а че за проблемы с базой
или мож прикрепить к каждому специалисту по специалисту-оптимизатору?
← →
Sandman25 © (2004-07-23 17:38) [245][244] ИдиотЪ (23.07.04 17:36)
У меня на старой работе так и было. Админы не пишут запросы, запросники не занимаются администрированием. И все довольны, между прочим
← →
Григорьев Антон © (2004-07-23 17:38) [246]
> Anatoly Podgoretsky © (23.07.04 17:04) [228]
> Просто объем знаний просто гигантский, даже общее представление
> только по технологиям очень много. Надо просто знать общие
> вещи и подробно изучать при необходимости. Это не относится
> к базовым знания, это просто обязательная необходимость.
> Правда и без знания основ трудно понять даже базисы.
> Вот я изучал АДА и APL сейчас уже не помню, зато знаю для
> чего они, что могут решать и если потребуется то освою в
> кратчайшии сроки и также знание базисов остальных языков
> позволит выбрать нужный для решения и освоения, не тратя
> много времени на поиски. И еще более важно это при выборе
> технологии. Иначе будут большие потери времени или хуже.
> Зато уж с чем работаешь надо знать очень уверено, что бы
> решения приходили на автомате, на основе шаблонов и знаний.
А по какому случаю вы изучали Аду? Просто меня в своё время заинтересовал этот язык, но я не нашёл никого, кто его реально использовал бы.
А по сути высказывания - совершенно согласен. После того как я стал не только изучать Delphi, но и читать книги, в которых обзорно рассматриваются самые разные языки программирования (включая ту же Аду и APL), я хорошо почувствовал, насколько шире я стал смотреть на практические задачи. Сам факт знания того, какая существует альтернатива тому, что я использую на практике, даёт какую-то гибкость мышления, позволяет не зацикливаться на существующих шаблонах. Это трудно выразить такими же ясными словами, как позицию "раз на практике не надо, то не буду тратить время". И я не знаю, как объяснить это тому, кто сам это ещё не почувствовал. Но сомневаться в полезности общетеоретической подготовки лично мне не приходится.
← →
Суслик © (2004-07-23 17:39) [247]
> ИдиотЪ (23.07.04 17:36) [244]
У нас есть набор программистов клиент+stored proc. Люди из этого набора (я например) обладают нормальными знаниями того и другого. Под нормальность понимается человеческое отношгение к серверу. Есть некий дядя (один), который чисто формально, не зная логики запроса (вернее все что он знает о запросе - это его код) он его оптимизирует. Часть перестраивая все на фиг.
← →
Anatoly Podgoretsky © (2004-07-23 17:40) [248]VMcL © (23.07.04 17:25) [239]
DDR 400*8=3200 + 3200 если есть второй канал памяти, но это только на чтение на запись 400*4
Это подтверждается тестами. Частота же типового процессора в 8 раз больше, вот где основной тормоз. Ситуацию могли бы спасти процессоры с гигантскими кешами 32 мб и более, или более широкие шины. Вот в выходом модели Prescott у Интела опять появилась возможно значительно ускорить работу, посколько ширина шины кэша 256 бит, вместо 128 у предыдущей модели, а это можно сделать с помощью 4 канальной памяти или разработки более широких модулей.
← →
Суслик © (2004-07-23 17:41) [249]Антон.
> даёт какую-то гибкость мышления, позволяет не зацикливаться
> на существующих шаблонах
А может оно иногда лишнее?
Часто замечал, что ту работу которую можешь сделать за час и забыть про нее на долгие годы (и продолжить делать то, что интересно в настоящий момент) делаешь день, зато гиииибко. Жуть.
← →
Григорьев Антон © (2004-07-23 17:42) [250]
> Юрий Зотов © (23.07.04 17:27) [240]
> > ОДним словом - паразит, это когда живешь таким образом
> > постоянно
>
> Применительно к сабжу я бы сказал даже так: "Паразит - это
> образ жизни". И, учитывая, что под такой образ жизни еще
> и пытаются подвести базу, добавил бы: "А паразитизм - это
> мировоззрение".
Лёгкий оффтопик :))
Припомадясь и прикрасясь,
Эту гадость вливши в стих,
Хочет он марксистский базис
Под жакетку подвести.
(с) Маяковский.
Просто музыка навеяла...
← →
Григорьев Антон © (2004-07-23 17:47) [251]
> Суслик © (23.07.04 17:41) [249]
> Антон.
>
> > даёт какую-то гибкость мышления, позволяет не зацикливаться
>
> > на существующих шаблонах
>
> А может оно иногда лишнее?
>
> Часто замечал, что ту работу которую можешь сделать за час
> и забыть про нее на долгие годы (и продолжить делать то,
> что интересно в настоящий момент) делаешь день, зато гиииибко.
> Жуть.
Интересно решать, конечно же, сложные задачи. А для сортировки массива из ста элементов я тоже не буду quicksort реализовывать, а возьму чего попроще. А вообще, я говорил не о гибкой реализации, а о гибком мышлении, позволяющием придумывать нестандартные решения. Разные это вещи.
← →
Юрий Зотов © (2004-07-23 17:48) [252]> VMcL © (23.07.04 17:20) [236]
> Мгновение, говоришь?
Я даже и отвечать не стал. Человек просто никогда не сталкивался с задачами, которые крутятся часами (а некоторые - сутками и даже неделями). Поэтому он уверен, что таких задач не существует вообще, а любой безграмотный код будет выполняться всего лишь на полсекунды дольше грамотного.
← →
Anatoly Podgoretsky © (2004-07-23 17:50) [253]Григорьев Антон © (23.07.04 17:38) [246]
Просто так, до того как стал профессональным программистом, для расширения кругозора, нельзя же иметь широкий, если знаешь только один язык, надо или знать другие или хотя бы иметь довольно широкое представление о других, достаточное, что бы понимать простой код.
Пример [248] демонстрирует, что вроде бы эти знания ни программисту, ни системному администратору вроде бы прямо не нужны, но зато эти знания позволяют мне выбрать машину и учитывать архитектуру даже при написании на языках высокого уровня, при выборе структуры данных, при написании вставок на ассемблере знание моделей процессора позволяет избежать использование не эффективных инструкций, которые выглядят привлекательно, а на самом деле очень медленные. В тоже время я не буду читать без особой нужды талмуд Интела по оптимизации, не те задачи и общих знаний хватит, что бы сделать процентов на 90-95 оптимальный выбор. А пока я этим не задумался, то удивлялся почему старый максимально оптимальный код, который очень хорошо работал на 86-486 плохо вел себя на пентиумах, особенно последних моделях. Кстати тоже самое сейчас происходит и на Прескот, то что хорошо работало на П3 стало плохо на Прескоте и наоборот.
← →
Anatoly Podgoretsky © (2004-07-23 17:52) [254]Григорьев Антон © (23.07.04 17:47) [251]
Поддерживаю мысль.
← →
Суслик © (2004-07-23 17:54) [255]В поддтверждение поста
> Юрий Зотов © (23.07.04 17:48) [252]
Когдя я был маленький лет 9-10, xt (или еще нет, не помню:))), басик - ну в общем совсем был начинающий. Один дядя (думаю примерно такого же возраста как Юрий, и такой же любитель педагогики) сказал - а вот посчитай сумму чисел от 1 до 10. Я сфорганил цикл. Он говорит, а до 100? Поменял константу. А до 10000? Опять поменял - опаньки - еле дождался конца:)))
А он говорит "А я быстрее" (как в мультике про кроликов и лиса). Задумался и говорит - столько-то. И точно!!! Он был прав.
Я неделю думал как такое может быть:)))
← →
VMcL © (2004-07-23 17:58) [256]>>Anatoly Podgoretsky © (23.07.04 17:40) [248]
Я очепятался. В том случае я имел в виду FSB.
>DDR 400*8=3200
Откуда взялось число 8?
P.S. AFAIK, все эти множители по типу 133 DDR -> 266 MHz явл. теретическими. На практике прирост в производительности памяти меньше, чем на половину. Хотя я могу и ошибаться. Давно на хардварные сайты не ходил.
← →
Огромное Кулясищще © (2004-07-23 17:58) [257]2 Юрий Зотов:
По повожу паразита. Скажем, если вопрос про проблему с числами с плавающей запятой возникнет, то ответ "Это не глюк, по-другому нельзя. Старайся обойти. Вот, как я сделал: заметл тут пэ на мэ и всё пашет" будет гораздо практичней, чем то, что вы себе представили. Никакого паразитизма. А статьи всегда будут, точне будут книги. Авторы получают за них деньги. Кстати, вот вам заработок.
← →
Григорьев Антон © (2004-07-23 18:08) [258]
> Огромное Кулясищще © (23.07.04 17:58) [257]
> А статьи всегда будут, точне будут книги. Авторы получают
> за них деньги.
За свою статью "Неочевидные особенности вещественных чисел", равно как и за другие статьи, опубликованные на программистских сайтах, я ни копейки не получил. И за свои ответы в конференциях тоже. Думаю, подавляющее большинство авторов статей и ответов скажет о себе то же самое.
← →
Юрий Зотов © (2004-07-23 18:36) [259]> Огромное Кулясищще © (23.07.04 17:58) [257]
> Скажем, если вопрос про проблему с числами с плавающей запятой
> возникнет, то ответ "Это не глюк, по-другому нельзя. Старайся
> обойти. Вот, как я сделал: заметл тут пэ на мэ и всё пашет"
> будет гораздо практичней, чем то, что вы себе представили.
Нет. Не будет такой ответ практичнее. Хуже того - он может и совсем не помочь, и даже может ухудшить ситуацию. С floating-point не существует стандартных готовых рецептов на все случаи жизни. И то, что было хорошим в одном месте, запросто может оказаться плохим в другом. Я уже приводил пример, когда замена Double на Extended способна, как это ни странно, даже ухудшить точность расчета. И ничего Вы не сможете сделать с плохо обусловленной численно задачей, если не разбираетесь в этих вопросах по-настоящему, а не на уровне "друган пасаветывал заменить, в натуре, пэ на мэ, кароче".
Боюсь, Вы все же не прочли статью Антона до конца - там ведь есть заключение, в котором все это уже сказано. Поэтому приходиться повторять. Да и - неужто Вы полагаете, что Антон в статье изложил все проблемы численных расчетов? На такие проблемы толстенные книги существуют.
> А статьи всегда будут, точне будут книги. Авторы получают за
> них деньги.
ОК. Вот прямо сейчас найдите и скажите - в каком Интернет-магазине я могу купить книгу, в которой изложено все то, о чем писал Антон? (и, желательно, еще то, о чем он не написал).
Думаю, не найдете. Нет сейчас таких. Раньше были, а сейчас нет. По крупицам собирать надо. Вот давайте спросим у Антона - как он собирал информацию для статьи?
Так что не положат Вам на блюдечке волшебную книжку "про все". Не ждите. Лучше ждите, когда Антон все раскопает и напишет статью. Правда, вот тогда-то Вы автоматически и окажетесь в отстающих.
Что поделаешь - какое мировоззрение, таков и образ жизни.
← →
KosilkA © (2004-07-23 19:01) [260]
> Глядя на константу WS_EX_TOPMOST: А какие ещё бывают? И
> так далее...
> В результате приходится сутками рыться в интернете и справочниках
> в поисках подробностей.
а не судьба нажать ctrl и кликнуть по этому самому WS_EX_TOPMOST? Думаю , есть некоторый шанс увидеть то ,какие еще бывают =))))
> Завалим толпою этого зверюгу - Delphi!
правильно , даешь комментарий к каждой строчке =)) гы.. а на самом деле идея не стоит и выеденного яйса =))
← →
Anatoly Podgoretsky © (2004-07-23 20:02) [261]VMcL © (23.07.04 17:58) [256]
Ширина шины памяти 64 бита, ширина шины кэша 128 (Prescot 256)
отсюда 3200 = 400 * 8 и умножить на два если память двухканальная.
← →
Черный дембель (2004-07-23 20:56) [262]И где только народ время находит читать и перечитывать форум и сколько времени на работу остается? :)
Вам всем хорошо © (Операция с новым годом)
← →
GrayFace © (2004-07-23 21:15) [263]> >Мне 27 лет. Я уже старый?
>
> Непонятно тогда, почему ты со мной споришь.
А мне 17 только что исполнилось (15 июля), но я так же спорил бы, если б не проговорили все это столько раз, что уже столько всего нападало !... Скажу вкратце.
>Точно такая же ситация с 3d-играми.
Их необходимо оптимизировать. Если оптимизация приводит к сложности изменения, то, имхо, руки кривые.
>Впрочем, все равно жизнь тебя научит.
Сомниваюсь. Если у человека нет желания сделать все красиво, то оно вряд ли появится.
Дайте ссылку на "Неочевидные особенности вещественных чисел", а то поиска в статьях я че-то не вижу.
Юрий Зотов
Вот. 3.5 часа. Только за безглючность не отвечаю - надо еще попроверять. Обработку ошибок не сделал, не ее легко будет прикрутить через exeption"ы.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
POperator=^TOperator;
TFunction=function(v:extended):extended;
PFunction=^TFunction;
TFunc=record
f:PFunction;
name:string;
end;
TOper=record
f:POperator;
name:string;
prior:integer;
end;
function Mul(v1,v2:extended):extended;
begin
Result:=v1*v2;
end;
function Div1(v1,v2:extended):extended;
begin
Result:=v1/v2;
end;
function Add(v1,v2:extended):extended;
begin
Result:=v1+v2;
end;
function Dec(v1,v2:extended):extended;
begin
Result:=v1-v2;
end;
function Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
const opers:array[0..3] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20));
funcs:array[0..0] of TFunc=((f:@sin1; name:"sin"));
var OpMul:TOper;
function IsDigit(c:char):byte;
begin
if (c=".") or (c="e") or (c="E") or ((ord(c)>=$30) and (ord(c)<=$39))
then result:=1 else if (c="-") or (c=" ") then Result:=2 else Result:=0;
end;
function DoString(From,Tom:PChar):string;
begin
SetLength(Result,integer(tom)-integer(from)+1);
CopyMemory(@Result[1],from,integer(tom)-integer(from)+1);
end;
function cmp(const s:string; p2:PChar):boolean;
var p1:PChar; i:integer;
begin
p1:=PChar(s);
Result:=true;
while p1^<>#0 do
if p1^<>p2^ then
begin
Result:=false;
exit;
end else
begin
inc(p1);
inc(p2);
end;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended; forward;
{----------------------------------------------}
function GetValue(var s:PChar; sep:Char; prior:integer; var done:byte):extended;
var s1:string; i:integer; fu:TFunction; Len:integer; from,tom:PChar;
dn:byte; step:integer;
begin
try
while s^=" " do inc(s);
if s^="(" then
begin
inc(s);
dn:=0;
Result:=GetValue(s,")",-MaxInt,dn);
exit;
end;
if s^="-" then
begin
inc(s);
dn:=0;
Result:=-GetValue(s,sep,MaxInt,dn);
exit;
end;
len:=0;
for i:=low(Funcs) to high(Funcs) do
begin
if (length(Funcs[i].name)>len) and (Funcs[i].name=s) then
begin
fu:=TFunction(Funcs[i].f);
len:=length(Funcs[i].name);
end;
end;
if len<>0 then
begin
dn:=0;
Result:=fu(GetValue(s,sep,MaxInt,dn));
end;
from:=s;
tom:=nil;
step:=0;
while true do
begin
if IsDigit(s^)=0 then break;
if (s^="e") or (s^="E") then if step=0 then step:=1 else break;
if (s^="-") then if step=1 then inc(step) else break;
if IsDigit(s^)=1 then tom:=s;
inc(s);
end;
if tom=nil then
begin
//raise
exit;
end;
s1:=DoString(from,tom);
Result:=StrToFloat(s1);
finally
dn:=0;
while dn=0 do
begin
Result:=GetOper(s,sep,prior,dn,Result);
end;
if dn=2 then done:=2 else done:=0;
end;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended;
var i:integer; op:TOper; Len:integer;
begin
while s^=" " do inc(s);
len:=0;
if (s^=sep) or (s^=#0) then
begin
inc(s);
done:=2;
Result:=v1;
exit;
end;
for i:=low(opers) to high(opers) do
begin
if (length(Opers[i].name)>len) and cmp(Opers[i].name,s) then
begin
op:=Opers[i];
len:=length(Opers[i].name);
end;
end;
if Len=0 then op:=OpMul;
if op.prior>=prior then
begin
if Len<>0 then inc(s);
Result:=TOperator(op.f)(v1,GetValue(s,sep,op.prior,done))
end else
begin
Result:=v1;
done:=1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OpMul:=opers[2];
end;
procedure TForm1.Button1Click(Sender: TObject);
var b:byte; p:PChar;
begin
b:=0;
p:=PChar(Edit1.text);
Edit2.Text:=FloatToStr(GetValue(p,#0,-MaxInt,b));
end;
end.
← →
}|{yk © (2004-07-23 21:47) [264]Я бы за одни Edit2,Edit1 поубивал бы...
Лучше бы ты поток данных анализировал, или сложно ?
← →
Огромное Кулясищще © (2004-07-23 22:09) [265]>Их необходимо оптимизировать. Если оптимизация приводит к сложности изменения, то, имхо, руки кривые.
Пардон, пардон. Тень от объекта создавалась полигоном. По нынешним меркам - некрасиво, нединамично. Нужно рейтрейсингом - так это всю тень заново писать, да ещё и старую удалять (выдирать). Поделили уровни на секторы. Отпала необходимость, но их же так просто не соединишь. А ведь это всё - оптимизация.
← →
Денис (2004-07-24 05:56) [266]
> Юрий Зотов © (23.07.04 17:27) [240]
>
> Применительно к сабжу я бы сказал даже так: "Паразит - это
> образ жизни". И, учитывая, что под такой образ жизни еще
> и пытаются подвести базу, добавил бы: "А паразитизм - это
> мировоззрение".
Не очень то Вы сильны в Биологии, знаток паразитизма!
Применительно к сабжу совершенно другое понятие - СИМБИОЗ.
Выглядеть может похоже, для пристрастного наблюдателя,
а разница - принципиальная.
А вообще, вас послушать, так нужно срочно форумы позакрывать, и статьи поотменять во имя полного искоренения Паразитизма из наших рядов!
Кстати, учебники пожечь и школы порушить - это уж само собой...
Разве кто учился не по чужим книгам?
Паразитиз, да и только!
← →
Думкин © (2004-07-24 06:19) [267]Насчет сортировки и отличия вдоли секунды.
Создается массив строк размером- ну хотя бы 100000. Безусловно не сортированный изначально. И сортируем их - пузырьком и быстрой.
Я думаю, все вопросы после рализации отпадают сами собой. Если вторая приемлемо будет работать на слабыхмашинах, то окончание первой можно ждать ну очень долго даже на хороших машинах.
> [246] Григорьев Антон © (23.07.04 17:38)
Ада - одна из рабочих лошадок Пентагона, детище однако.
← →
GrayFace © (2004-07-24 09:42) [268]>}|{yk © (23.07.04 21:47) [264]
>Я бы за одни Edit2,Edit1 поубивал бы...
>Лучше бы ты поток данных анализировал, или сложно ?
Зачем? Для счета выражений из файла? Вообще-то это писалось с целью быстро сделать алгоритм и выложить его.
← →
Григорьев Антон © (2004-07-24 09:49) [269]
> GrayFace © (23.07.04 21:15) [263]
> Дайте ссылку на "Неочевидные особенности вещественных чисел",
> а то поиска в статьях я че-то не вижу.
Она вообще на другом сайте лежит :))
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
> Вот. 3.5 часа.
А теперь, ради интереса, сравните с анализатором, построенным на базе той самой теории, о которой говорил Юрий:
http://www.delphikingdom.com/treasury/s003.htm#link7
Кстати, алгоритм, приведённый там, достаточно универсален. Его можно использовать не только для вычисления выражений, но и везде, где нужен синтаксический разбор выражения. Посмотрите, например, http://www.delphikingdom.com/asp/viewitem.asp?catalogid=718 - тот же самый алгоритм реализован в модуле ExprMake.
> Думкин © (24.07.04 06:19) [267]
> Ада - одна из рабочих лошадок Пентагона, детище однако.
Да, я в курсе. Но меня интересуют те области применения Ады, куда я мог бы дотянуться, а работа в Пентагоне мне не светит.
> Денис (24.07.04 05:56) [266]
Просто обучение - это ещё не есть паразитизм. Паразитизм - это когда ученик не хочет предпринимать никаких усилий для того, чтобы получить знания, и считает, что учитель обязан вложить их в него. Очень хороший пример паразитизма можно увидеть на странице http://www.delphikingdom.com/asp/answer.asp?IDAnswer=23431 Там некий Денис Орлов :)) задаёт вопросы, а если ответы недостаточно разжёваны для того, чтобы он мог проглотить их без усилий, то начинает откровенно хамить отвечающим. Ещё он там требует, чтобы специально для него написали статью о таком простом и неинтересном предмете как WinSigth32. Сам же Денис при этом не проявляет никакого напряжения мозгов. Когда, например, он видит два числа: 40045 и 40045Dh, он считает, что это одно и то же число. Ему и в голову не приходит задуматься о том, зачем во втором случае нужны два лишних символа "Dh". И, несмотря на своё собственное хамство, этот Денис крайне болезненно реагирует на ответную грубость, не понимая, что он же её и спровоцировал своим эгоистичным поведением. Это - настоящий паразитизм, и никаким симбиозом там и не пахнет.
← →
GrayFace © (2004-07-24 09:58) [270]Денис
Вот, кстати, и првые сорсы в твоей теме(не считая самых первых), хоть и без комментариев.
Симбиоз - это взоимовыгодные отношения профи и использующих труд профи, но иногда бывает и паразитизм. Только неправильная картина вырисовывается. Наша радость была бы неполной, если бы среди создателей компонент, и т.п. не было все тех же ламеров, часть из которых лепят много ошиок и в итоге тоже занимаются паразитизмом.
Итого: Теперь мы валим толпой Юрия Зотова и Огромное Кулясищще(самая что ни на есть зверюга, судя по нику).
← →
Nous Mellon © (2004-07-24 10:22) [271]
> http://www.delphikingdom.com/asp/answer.asp?IDAnswer=23431
> Там некий Денис Орлов :))
:O Ужас! Антон, тебе времени не жаль?
> Итого: Теперь мы валим толпой Юрия Зотова и Огромное Кулясищще(самая
> что ни на есть зверюга, судя по нику).
Это ты то собрался Зотова валить? Хех.... Мал еще...
← →
Думкин © (2004-07-24 11:51) [272]> [269] Григорьев Антон © (24.07.04 09:49)
Я понимаю. :-) У нас вроде тоже применялось, правда жестких примеров привести здесь не могу. Но поискать можно, но ... конечно вряд ли это естественное использование.
А вот к сортировке еще одно тут придумалось. Предистория:
у нас был создан комп с такой же архиттектурой как П-166 ММХ, но вот молния шарахнула и он стал выполнять 1 Гугол станд. операций в секунду. шустрявый такой получился.
Вот Поступило задание от узнавших:
"Мы долгими усилиями получили в рез. экспериментов такое число: 12345678912345678912,1234567". Это было рез. очень длительных вычислений. У вас такой комп!!!. Можете ли вы дать ответ на такой вопрос:
есть функция дающая результат в диапазонеке от 1 до 2. ее вызывают 10^20 раз и результаты складывают с исхдным(данным вам) числом, на каждой итерации. Код функции прилагается. Можете ли вы сообщить результат?"
Теперь как вы видите решение человека не знающего много из того что "новая молодежь" списала на свалку?
Это надуманный пример. Но пепроблема зачастую встречается в реальности. Можно дать, да и что есть реальность?
А вот еще к вопросу сортировки, а если функция сравнения дорога во времени. То как организовать поиск в данных, ну если приемлимо будет, не во время поиска? Про Кнута не зря говорят.
← →
Думкин © (2004-07-24 12:02) [273]Имеется в виду что исходное число изменяется на каждой итерации на получаемую вличину, и на следующей итерации выступает именно измененное.
← →
Юрий Зотов © (2004-07-24 13:13) [274]> GrayFace © (23.07.04 21:15) [263]
> Только за безглючность не отвечаю - надо еще попроверять.
ОК. Я попроверял. Привожу пару глюков, найденных не более, чем за пару минут. Компилировал программу в D7 под XP Pro. Проверка результатов производилась с помощью стандартного калькулятора Windows.
Глюк № 1а.
Выражение: (2+1)*5/7*2
Ваш результат: 1.07142857142857
Правильный результат: 4.2857142857142857142857142857143
Причина: видимо, не обеспечена правильная последовательность выполнения операций с одинаковым приоритетом (по крайней мере, умножения и деления: похоже, что у Вас сначала выполняется 7*2, а уж потом - деление).
Глюк № 1б.
Выражение: 2/(7 - 2)*2
Ваш результат: 0.2
Правильный результат: 0.8
Причина: вероятно, та же самая, что и в глюке 1а - сначала выполняется 5*2, а уж потом - деление.
Глюк № 2.
Выражение: sin(любое_число) или Sin(любое_число)
Ваш результат: Stack overflow
Правильный результат: синус этого числа
Причина: видимо, бесконечная рекурсия.
Итак, за пару минут была обнаружена пара ПРИНЦИПИАЛЬНЫХ глюков. Дальше я тестировать не стал - нет смысла. Потому что достаточно уже и этого - любой из этих двух глюков сводит всю Вашу работу к абсолютному нулю, поскольку пользоваться такой программой просто нельзя. Совсем нельзя. Сорри, но пока что Вы родили еще одну "автосхему".
Делаем вывод - за 3,5 часа калькулятор не написан (поскольку то, что написано, калькулятором НЕ является). Значит, к этим 3,5 часам требуется дополнительное время. Если хотите доказать мне, себе и другим, что все-таки МОЖНО написать НОРМАЛЬНО работающий строчный калькулятор БЕЗ привлечения теории языков - что ж, дорабатывайте программу и будем вести учет СУММАРНОГО затраченного времени.
Хотите - пробуйте. Только уверяю Вас, что это совершенно бесполезно. БЕЗ теории языков ни Вы, ни кто-либо другой не напишет НОРМАЛЬНО работающий строчный калькулятор ни за 3,5 часа, ни за 3,5 года, ни даже за 3,5 жизни. Потому что сделать это невозможно В ПРИНЦИПЕ - до тех пор, пока не будет привлечена теория, ВСЕГДА найдется выражение, которое такой калькулятор правильно распознать и вычислить не сможет.
А вот с теорией я напишу его примерно за пару дней. Причем он будет ГАРАНТИРОВАННО БЕЗГЛЮЧНО распознавать и вычислять ГАРАНТИРОВАННО ЛЮБОЕ выражение и выдавать ГАРАНТИРОВАННО ПОЛНУЮ и ГАРАНТИРОВАННО ТОЧНУЮ диагностику ошибок пользователя (слово "безглючно" здесь, естественно, означает "без ПРИНЦИПИАЛЬНЫХ глюков", а незначительные и устраняющиеся за пару минут мелкие ошибки кодинга, конечно, возможны в любой программе).
Почему я так смело и много раз пишу слово "ГАРАНТИРОВАННО"? Потому что знаю, что как раз теория все эти гарантии и обеспечит. Причем сама собой - мне даже не придется прилагать совершенно никаких дополнительных усилий.
Итак, есть 3 пути:
1. Можно потратить полжизни на написание программы БЕЗ теории, но все же ее НЕ написать.
2. Можно потратить несколько дней, недель или месяцев на изучение теории, а потом написать программу за пару дней (причем попутно научившись писать ЛЮБУЮ программу подобного класса - а таких совсем немало).
3. Теорию можно изучать "впрок" и без лишних затрат времени (в метро, в электричке и пр.), а потом, когда возникнет ЛЮБАЯ относящаяся к ней задача, СРАЗУ же решить ее за пару дней. Кстати, как раз вот этот путь я уже многие годы и использую.
Ну так что - Вы еще не убедились, хотите продолжить спор и будете пытаться доработать калькулятор? Или уже достаточно?
← →
GrayFace © (2004-07-24 13:46) [275]Вот. 5 минут правки + 5 минут - время, предположительно потраченное Вами на тестирование. Итого: 3 ч 45 мин (еще 5 минут - ошибра округления до 3,5 ч).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
POperator=^TOperator;
TFunction=function(v:extended):extended;
PFunction=^TFunction;
TFunc=record
f:PFunction;
name:string;
end;
TOper=record
f:POperator;
name:string;
prior:integer;
end;
function Mul(v1,v2:extended):extended;
begin
Result:=v1*v2;
end;
function Div1(v1,v2:extended):extended;
begin
Result:=v1/v2;
end;
function Add(v1,v2:extended):extended;
begin
Result:=v1+v2;
end;
function Dec(v1,v2:extended):extended;
begin
Result:=v1-v2;
end;
function Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
const opers:array[0..3] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20));
funcs:array[0..0] of TFunc=((f:@sin1; name:"sin"));
var OpMul:TOper;
function IsDigit(c:char):byte;
begin
if (c=".") or (c="e") or (c="E") or ((ord(c)>=$30) and (ord(c)<=$39))
then result:=1 else if (c="-") or (c=" ") then Result:=2 else Result:=0;
end;
function DoString(From,Tom:PChar):string;
begin
SetLength(Result,integer(tom)-integer(from)+1);
CopyMemory(@Result[1],from,integer(tom)-integer(from)+1);
end;
function cmp(const s:string; p2:PChar):boolean;
var p1:PChar; i:integer;
begin
p1:=PChar(s);
Result:=true;
while p1^<>#0 do
if p1^<>p2^ then
begin
Result:=false;
exit;
end else
begin
inc(p1);
inc(p2);
end;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended; forward;
{----------------------------------------------}
function GetValue(var s:PChar; sep:Char; prior:integer; var done:byte):extended;
var s1:string; i:integer; fu:TFunction; Len:integer; from,tom:PChar;
dn:byte; step:integer;
begin
try
while s^=" " do inc(s);
if s^="(" then
begin
inc(s);
dn:=0;
Result:=GetValue(s,")",-MaxInt,dn);
exit;
end;
if s^="-" then
begin
inc(s);
dn:=0;
Result:=-GetValue(s,sep,MaxInt,dn);
exit;
end;
len:=0;
for i:=low(Funcs) to high(Funcs) do
begin
if (length(Funcs[i].name)>len) and (Funcs[i].name=s) then
begin
fu:=TFunction(Funcs[i].f);
len:=length(Funcs[i].name);
end;
end;
if len<>0 then
begin
dn:=0;
Result:=fu(GetValue(s,sep,MaxInt,dn));
end;
from:=s;
tom:=nil;
step:=0;
while true do
begin
if IsDigit(s^)=0 then break;
if (s^="e") or (s^="E") then if step=0 then step:=1 else break;
if (s^="-") then if step=1 then inc(step) else break;
if IsDigit(s^)=1 then tom:=s;
inc(s);
end;
if tom=nil then
begin
//raise
exit;
end;
s1:=DoString(from,tom);
Result:=StrToFloat(s1);
finally
dn:=0;
while dn=0 do
begin
Result:=GetOper(s,sep,prior,dn,Result);
end;
if dn=2 then done:=2 else done:=0;
end;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended;
var i:integer; op:TOper; Len:integer;
begin
while s^=" " do inc(s);
len:=0;
if (s^=sep) or (s^=#0) then
begin
inc(s);
done:=2;
Result:=v1;
exit;
end;
for i:=low(opers) to high(opers) do
begin
if (length(Opers[i].name)>len) and cmp(Opers[i].name,s) then
begin
op:=Opers[i];
len:=length(Opers[i].name);
end;
end;
if Len=0 then op:=OpMul;
if op.prior>prior then
begin
inc(s,Len);
Result:=TOperator(op.f)(v1,GetValue(s,sep,op.prior,done))
end else
begin
Result:=v1;
done:=1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OpMul:=opers[2];
end;
procedure TForm1.Button1Click(Sender: TObject);
var b:byte; p:PChar;
begin
b:=0;
p:=PChar(Edit1.text);
Edit2.Text:=FloatToStr(GetValue(p,#0,-MaxInt,b));
end;
end.
← →
GrayFace © (2004-07-24 13:56) [276]ОЙ! Не смотрите это - оно совсем не верно.
← →
GrayFace © (2004-07-24 14:05) [277]ОЙ! ОЙ! И еще раз ОЙ! Это было верно!!!
← →
Юрий Зотов © (2004-07-24 14:07) [278]> GrayFace © (24.07.04 13:46) [275]
Выражение: sin(любое_число)
Результат: Invalid floating point operation
Выражение: (+7)/2*5-7
Результат: Invalid floating point operation
:о)
← →
Anatoly Podgoretsky © (2004-07-24 14:19) [279]И чего так и будешь до бесконечности кидать большие и кривые куски кода сюда?
← →
GrayFace © (2004-07-24 14:38) [280]Еще 10 мин. sin сделал, "+" - нет. Вот в чем проблема: при обращении сделал
try
var b:byte; p:PChar; s:string;
begin
b:=0;
s:=Edit1.text;
p:=PChar(s);
Edit2.Text:=FloatToStr(GetValue(p,#0,-MaxInt,b));
except
on E: Exception do
begin
Edit1.SelStart:=integer(p)-integer(@s[1]);
Edit1.SelLength:=0;
Edit1.SetFocus;
E.Message:=E.Message+" at offset "+IntToStr(Edit1.SelStart);
raise;
end;
end;
Почему-то не работает: передаваемый по var параметр p не изменяется, Division by zero не ловится... В чем проблема?
Страницы: 1 2 3 4 5 6 7 8 9
вся ветка
Текущий архив: 2004.08.15;
Скачать: CL | DM;
Память: 1.16 MB
Время: 0.124 c