Главная страница
    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.53 MB
Время: 0.044 c
15-1185568307
Kostafey
2007-07-28 00:31
2007.09.16
С днем рождения ! 28 июля


15-1187542819
Сатир
2007-08-19 21:00
2007.09.16
Прога редактирования mp3


15-1187576510
>>DEATH<<
2007-08-20 06:21
2007.09.16
распознование текста


8-1164920705
DevilDevil
2006-12-01 00:05
2007.09.16
IBasicAudio, put_Volume - реальная граница?


2-1187850968
aalex
2007-08-23 10:36
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский