Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

Разминка для мозгов   Найти похожие ветки 

 
Ricks ©   (2007-07-07 18:30) [0]

Как в Delphi 7 (но не выше) сделать такую штуку:

дана точность

const
prec = -2;


то есть считаем что это степень десятки 10^(-2)

как не используя динамические массивы объявить массив:


var
a : array [0..?] of ...


содержащий столько элементов, сколько при заданной точности будет содержать отрезок [0..1]. В нашем случае 100


 
Тень отца Гамлта   (2007-07-07 18:33) [1]

через указатели, как в турбо паскале


 
Kerk ©   (2007-07-07 18:33) [2]

а в чем проблема?


 
Германн ©   (2007-07-07 18:34) [3]

Указатель на массив с макс. возможным количеством элементов.
GetMem(Столько сколько реально нужно)


 
Тень отца Гамлта   (2007-07-07 18:37) [4]

хотя не, требуется придумать метод, который работает в d7 но не выше, а это вроде должно и дальше работать


 
Dib@zol ©   (2007-07-07 18:41) [5]


> но не выше


А собсно КАК? Это невозможно в принципе - всё что пашет под Д7, прокатит и в более поздних версиях.

И вообще мож динамические массивы?


 
Anatoly Podgoretsky ©   (2007-07-07 18:41) [6]

> Ricks  (07.07.2007 18:30:00)  [0]

И нафига при наличии динамических массивов.


 
Тень отца Гамлта   (2007-07-07 18:41) [7]


> А собсно КАК?

заморочиться как-нибудь под дот нет, наверное


 
Ricks ©   (2007-07-07 18:42) [8]


> через указатели, как в турбо паскале


КАК?


> а в чем проблема?


проблем нет, просто интересно.
что надо поставить в
array [0..?] of
вместо ?


 
Dib@zol ©   (2007-07-07 18:43) [9]


> a : array [0..?] of ...

И кстати правда, такой массив как не старайся динамически не объявишь. Используй связанные списки.


 
Тень отца Гамлта   (2007-07-07 18:44) [10]


> КАК?

пишешь типизированный указтель, напр ^integer

потом говоришь ему getmem (p, sizeof()*n)

обращаться p^[i], индексируется с нуля

освободиться - freemem


 
Ricks ©   (2007-07-07 18:44) [11]


> И нафига при наличии динамических массивов.

Для интереса, блин!


> Dib@zol

Так что, по вашему, решения нет?


 
Тень отца Гамлта   (2007-07-07 18:46) [12]


> Так что, по вашему, решения нет?

если только дот нет см [4] и [7]


 
Dib@zol ©   (2007-07-07 18:46) [13]


> что надо поставить в
> array [0..?] of
> вместо ?


Тут можно проставить только константу. Фсё больше ничего. переменная - не прокатит. => [10].


 
Ricks ©   (2007-07-07 18:49) [14]

.NET я не знаю
а варианты типа getmem — это обман. :) не то, что нужно


 
Ricks ©   (2007-07-07 18:53) [15]

На самом деле решение есть!
Математики должны знать.
Еще могу сказать что в выражениях const
можно использовать как минимум + - * / и round


 
Тень отца Гамлта   (2007-07-07 19:00) [16]


> На самом деле решение есть!
> Математики должны знать.
> Еще могу сказать что в выражениях const
> можно использовать как минимум + - * / и round

а в восьмерке уже запретили ???


 
Ricks ©   (2007-07-07 19:04) [17]

Короче я решение нашел, только остается найти идиота, который этим решением будет пользоваться :)
Сразу скажу, что решение находил не в delphi, a в Mathcad"e! :)

Объясняю:
10^x = exp(x * ln(10))
теперь раскладываем экспоненту в ряд
и пишем константу

const
ln10 = 2.3025850929940456840179914546844
val1 = prec * ln10;
value = 1 + val1 + val1*val1/2 + val1*val1/6 + ...

и так до 170-ой степени в маткаде :)
работает до -7 ой степени!


 
Ricks ©   (2007-07-07 19:06) [18]


> а в восьмерке уже запретили ???


Не, я писал что "не выше D7" потому что не знал какие там есть новые возможности...
может там можно
array [0..round(1/power(10, prec))] of ...
или хотя бы
array [0..round(1/exp(prec * ln(10)))] of ...


 
ferr ©   (2007-07-07 19:09) [19]

Тогда уж сделать precalc массив-отображение prec => 10^(-prec).


 
Ricks ©   (2007-07-07 19:14) [20]


> Тогда уж сделать precalc массив-отображение prec => 10^(-
> prec).


Вот это действительно хорошее предложение!!


 
Vendict ©   (2007-07-07 22:48) [21]

неужели все стебаются ?

ответ уже дали в [6]

var
a:array of Integer;
Begin
....
setLength(a,<нужная длина>);


 
Dib@zol ©   (2007-07-07 22:50) [22]


> Vendict ©   (07.07.07 22:48) [21]

Глянь [0].

не используя динамические массивы


 
Vendict ©   (2007-07-07 22:59) [23]

пропустил ...
только вот вопрос, если она константа на этапе компиляции, что мешает сделать так:


Uses Math;
const
prec=-2;
m=Trunc(1/Power(10,prec));
var
a:array [1..m] of Integer


только я не проверял в Дельфи, запускать лень.


 
Юрий Зотов ©   (2007-07-07 23:41) [24]

> Vendict ©   (07.07.07 22:59) [23]

m = IntPower(10, -prec) + 1; // Именно +1, в сабже ошибка.

Только это вряд ли сработает. IntPower не является функцией компилятора.


 
Ricks ©   (2007-07-08 10:45) [25]


> Только это вряд ли сработает. IntPower не является функцией
> компилятора.


Да. Так не работает. Иначе вопроса не было бы :)


 
Dib@zol ©   (2007-07-08 11:15) [26]

Епт а ведь если это константа то неужели нельзя воспользоваться КАЛькулятором и пошшитать заранее самостоятельно???


 
Ricks ©   (2007-07-08 11:28) [27]


> Епт а ведь если это константа то неужели нельзя воспользоваться
> КАЛькулятором и пошшитать заранее самостоятельно???


Так вопрос стоял о том что нам задана (или мы задаем) точнось, а оно само должно высчитывать.


 
Юрий Зотов ©   (2007-07-08 12:20) [28]

> Ricks ©   (08.07.07 11:28) [27]

А почему не пойти обратным путем - задаем размер и объявляем массив, а точность высчитывается?

uses Math;

const
 m = 100;

var
 a: array [0..m] of ...;
 prec: integer;

begin
 prec := -Trunc(Log10(m));
 ...


 
Ricks ©   (2007-07-08 12:46) [29]


> А почему не пойти обратным путем


Обратный путь не подходит. Нужно по заданной точность определить кол-во точек, а не наоборот.

Вот програмка, для которой мне это было нужно (програма про случайные числа).
http://www.ricks.pisem.net/sl.zip


 
Dib@zol ©   (2007-07-08 13:08) [30]


> Так вопрос стоял о том что нам задана (или мы задаем) точнось,
>  а оно само должно высчитывать.

Понимаешь, динамически ты точность так или иначе не задашь. То есть только при компиляции. Используй тогда макрокоманды чтоль, чтоб само тебе вычислялось.


 
Vlad Oshin ©   (2007-07-08 13:41) [31]


> var
> a : array [0..?] of ...

a : array of ...
setlength в зависимости от константы и т.д.
имхо так.
советовали же уже, чем не нравится..


 
Dib@zol ©   (2007-07-08 13:42) [32]


> Dib@zol ©   (07.07.07 22:50) [22]

Вот чем.


 
Vlad Oshin ©   (2007-07-08 14:06) [33]


>  [32]

да почему?
какой случай может потребовать их запрет, просто теоретически..


 
Ricks ©   (2007-07-08 14:50) [34]


> какой случай может потребовать их запрет


АВТОРСКИЙ! :)


 
Юрий Зотов ©   (2007-07-08 16:05) [35]

> Ricks ©   (08.07.07 14:50) [34]

Если кол-во точек Вы хотите вычислять на этапе компиляции, то никто не мешает сделать это руками и прописать константу. А если на этапе выполнения, то без динамического массива не обойтись.

PS
Зачем хотеть странного?


 
Ricks ©   (2007-07-08 18:11) [36]


> Юрий Зотов

Да я уже давно разобрался и использую динамические массивы (см програму выше)

А тема называется "Разминка для мозгов"... :)



Страницы: 1 вся ветка

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.027 c
15-1185534931
Hadroran
2007-07-27 15:15
2007.09.16
Скачать файл с narod.ru


15-1187703680
Бася
2007-08-21 17:41
2007.09.16
Покритикуйте и научите :)


6-1169490868
Khabibulin
2007-01-22 21:34
2007.09.16
Авторизация с помощью idHTTP


15-1185015273
Иксик
2007-07-21 14:54
2007.09.16
Лисички


2-1187691079
Daedr
2007-08-21 14:11
2007.09.16
профессионалам отдельная просьба - быть снисходительными.