Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.07 c
15-1187538724
Piter
2007-08-19 19:52
2007.09.16
Очень классная иллюзия


2-1187597172
tomkat
2007-08-20 12:06
2007.09.16
Компоненты в консольном приложении


3-1179423532
Lavrenty
2007-05-17 21:38
2007.09.16
Log, debug или что-то вроде этого?


15-1187298274
Petr V. Abramov
2007-08-17 01:04
2007.09.16
дайте урок англицкого


2-1187604955
JetuS
2007-08-20 14:15
2007.09.16
Как получить имя и класс компонента, имеющего фокус?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский