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

Вниз

Работа со звуком в Turbo Pascal 7.0   Найти похожие ветки 

 
Александиров   (2008-10-31 11:53) [0]

Нашёл в Интернете пример программы работы со звуком:

Program MusicColor;
 Uses Crt, Graph; {подключение к программе библиотек Crt и Graph}
 Var
   GrDriver, GrMode: Integer; {тип и режим работы графического драйвера}
BEGIN
 GrDriver := Detect; {автоопределение типа графического драйвера}
 InitGraph(GrDriver, GrMode, "C:\TP\BGI"); {установка графического режима}
 SetColor(White); {установка белого цвета рамки }
 Rectangle(130, 130, 460, 370); {рисование рамки }
 Randomize; {инициализация датчика случайных чисел}
 Repeat {цикл прерывается нажатием любой клавиши}
   Sound(Random(2000)); {изменение высоты звука }
   Delay(Random(1000)); {задержка }
   SetFillStyle(Random(4), Random(16)); {смена типа штриховки и цвета}
   Bar(140, 140, 450, 360); {рисование закрашенного прямоугольника}
 until KeyPressed;
 NoSound; {отмена звука }
 CloseGraph; ReadLn; {закрытие графического режима}
END.

Компилирию - всё нормально, запускаю на выполнение выдаёт ошибку: Error 200: Division by zero

Упрощаю программу:

Program Music;
 Uses Crt;
BEGIN
Sound(1000);
Delay(1000);
NoSound;
END.

Всё равно выдаёт туже ошибку. Подскажите почему, что я делаю не так?


 
Palladin ©   (2008-10-31 11:59) [1]

Все так. Только времена уже не те. Компьютеры очень быстрые. :)


 
Palladin ©   (2008-10-31 12:00) [2]

Где то видел лет 6-8 назад в инете "патч" модуля Crt. Поищи...


 
Александиров   (2008-10-31 12:01) [3]

А как можно это исправить? Какой компилятор нужно скачать, чтобы программа работала?


 
Александиров   (2008-10-31 12:03) [4]

Спасибо, поищу


 
Александиров   (2008-10-31 12:03) [5]

Спасибо, поищу


 
Vlad Oshin ©   (2008-10-31 12:06) [6]


> А как можно это исправить?



> "патч" модуля Crt
> Поищи...


или переписать delay процедуру
навроде
var=gettime;
repeat
until gettime>var+DelayVar;


 
Anatoly Podgoretsky ©   (2008-10-31 12:24) [7]

> Александиров  (31.10.2008 12:01:03)  [3]

Никакой, надо процедуры работы с таймером переводить на 32 бита. Все остальные патчи дают только частичные или вообще неверную работу. Надо просто сделать поиск по проблеме в Интернете и найти сайт, где собраны методы борьбы. Патчи используют если нет исходников, а при наличии исходников, просто переписывают модуль CRT

Division by zero - на самом деле реальная ошибка, это ошибка деления на 55. Цикл работы системного таймера = 55 мс.


 
Сергей М. ©   (2008-10-31 12:37) [8]


> Anatoly Podgoretsky ©   (31.10.08 12:24) [7]


> Division by zero - .. это ошибка деления на 55


Ну ты, Анатолий, и загнул)
Деление на ноль - это, оказывается, ничто иное как деление на 55)

Эдаким заявлением можно запросто кого-угодно поставить в ступор, ввергнуть в состояние глубокого травматического мозгового шока)


 
DrPass ©   (2008-10-31 12:48) [9]


> или переписать delay процедуру
> навроде
> var=gettime;
> repeat
> until gettime>var+DelayVar;

Не получится. Расчет интервалов для Delay производится в секции инициализации модуля Crt (естественно, не той, которая initialization, ее в Паскале не было). Т.е. чтобы получить эту ошибку, достаточно uses crt сделать


 
Vlad Oshin ©   (2008-10-31 13:13) [10]


> чтобы получить эту ошибку, достаточно uses crt сделать

согласен, забыл


 
Рамиль ©   (2008-10-31 13:46) [11]

DosBox не поможет?


 
Anatoly Podgoretsky ©   (2008-10-31 14:01) [12]

> Сергей М.  (31.10.2008 12:37:08)  [8]

Все претензии к Интел и ИБМ


 
Amoeba ©   (2008-10-31 14:31) [13]


> Компилирию - всё нормально, запускаю на выполнение выдаёт
> ошибку: Error 200: Division by zero

Объяснение причины и решение найдешь здесь:
http://www.brain.uni-freiburg.de/~klaus/pascal/runerr200/


 
Сергей М. ©   (2008-10-31 14:55) [14]


> Anatoly Podgoretsky ©   (31.10.08 14:01) [12]


> претензии к Интел и ИБМ
>


Довольно странно пенять на железных брендов, в то время как видимая часть проблемы в элементарном ляпе софтового бренда)

Нет бы написать, мол, приключилось переполнение)


 
Jeer ©   (2008-10-31 15:03) [15]

Как быстро все забывается, а ведь десять лет - не такое уж большое время.
Вспомнить, хотя бы, примерно аналогичную проблему на Clipper-e.


 
Anatoly Podgoretsky ©   (2008-10-31 16:21) [16]

> Сергей М.  (31.10.2008 14:55:14)  [14]

А мне непорятно зачем они назвали Division by zero/Divide by zero
Когда это частный случай, в данном случае ошибка возникает при деление на 55 (пятьдесят пять)


 
Германн ©   (2008-10-31 16:22) [17]


> Сергей М. ©   (31.10.08 14:55) [14]
>
>
> > Anatoly Podgoretsky ©   (31.10.08 14:01) [12]
>
>
> > претензии к Интел и ИБМ
> >
>
>
> Довольно странно пенять на железных брендов, в то время
> как видимая часть проблемы в элементарном ляпе софтового
> бренда)
>
+1
Вот в TpCrt такого ляпа нет и не было, а он более старый, чем Crt от ТР7.


 
Palladin ©   (2008-10-31 16:23) [18]

Насколько я помню, ошибка возникает не в результате деления на 55, а в результате деления на результат деления на 55. :) Нехватило там точности для результата деления на 55 :)... и, конечно, вполне могу и ошибаться...


 
Anatoly Podgoretsky ©   (2008-10-31 16:30) [19]


> Amoeba ©   (31.10.08 14:31) [13]

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


 
Сергей М. ©   (2008-10-31 16:30) [20]


> мне непорятно зачем они назвали Division by zero/Divide
> by zero


Мне тоже.
Поэтому и предполагаю, что это банальный ляп.


> это частный случай


Это как ?

Ошибка деления на ноль есть частный случай ошибки переполнения, ты это имел ввиду ?

Ну дальнее родство тут, конечно, имеется, но ошибка-то возбуждается не по родству, а конкретно либо по прерыванию (причина - деление на ноль) либо по анализу установленного флага OF (как результат переполнения при выполнении арифм.инструкции)


 
Anatoly Podgoretsky ©   (2008-10-31 16:57) [21]

> Palladin  (31.10.2008 16:23:18)  [18]

Вообще то ошибаешсь, именно происходит деление на 55 накопленного за 55 мсек счетчика.
В результате деления долно получиться меньше или равно 65535, а счетчик много больше 65536*55

У меня претензии не к реализации, а к сообщению об ошибке. И к этому приложили руку два этих гиганта, Интел более виноват.


 
Palladin ©   (2008-10-31 16:58) [22]


> Вообще то ошибаешсь

так и знал, значит воспоминания из какой то другой оперы...


 
Anatoly Podgoretsky ©   (2008-10-31 17:04) [23]

> Palladin  (31.10.2008 16:58:22)  [22]

Я уверено говорю, потому что тот код у меня как перед глазами, на всю жизнь запомнил.
Алгоритм там простой, в цикле, в течение 55 мсек (полный оборот таймера и прерывание) на каждой итеррации наращивается счетчкик, по окончанию счетчик делится на 55, для получения интервала в 1 мсек, что далее используется в функции Delay. По мере роста частот, счетчик стал переполняться.



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

Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
2-1225654671
KTA
2008-11-02 22:37
2008.12.14
Создание таблицы в Word


15-1223957719
Slider007
2008-10-14 08:15
2008.12.14
С днем рождения ! 14 октября 2008 вторник


15-1223637417
NailMan
2008-10-10 15:16
2008.12.14
нужна прога несколько странного назначения


1-1204138664
POP
2008-02-27 21:57
2008.12.14
SHA-1


9-1176042275
Cerberus
2007-04-08 18:24
2008.12.14
Что лучше для создания 3д моделей Maya или 3D Max





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский