Текущий архив: 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.53 MB
Время: 0.044 c