Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 233
от 18.01.2004, 17:00

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 404
Отправлено ответов: 1431
Активность: 354.2 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

sir henry
Статус: Профессиональный
Общий рейтинг: 159.9
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 116.49
[Подробней >>]
Tancho
Статус: Профессиональный
Общий рейтинг: 152.02
Телефон: сл. 0359 0391 65 631; 0359 0391 53 105
[Подробней >>]
 
Boriss
Статус: Профессиональный
Общий рейтинг: 149.86
URL: Программирование на Паскале
[Подробней >>]
Strory
Статус: Начальный
Общий рейтинг: 137.5
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 402. Братья, Други! Помогите, пожалуйста! Хотел написать программку... результат получался очень странный... (ответов: 4)
Вопрос № 403. Братья, Други! Снова я! :) Я нашел решение (см. приложение). Не знаю, насколько оно правильное, но р... (ответов: 4)

Вопросов: 2, ответов: 8


 Вопрос № 402

Братья, Други!
Помогите, пожалуйста!
Хотел написать программку... результат получался очень странный. Убирал букву за буквой, строчку за строчкой. Упрощал, изменял... в итоге пару строчек кода, а результат все равно полнейший бред! :((
При изменении типа результата функции меняется значение!!! (при включенном Range Cheking). Для данного варианта значения следующие:
byte - 24; integer, word - 5966; longint - 390922260; Откуда такие значения!!!???!!! При изменении N с 1 на 12, значения такие:
byte - 35; integer, word - 5977; longint - 390922271; Т.е. больше на 11...
Не дайте сойти с ума...
Vitally.


Приложение:


Вопрос отправлен: 15.01.2004, 10:54
Отправитель: Vitally (vitally@inbox.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает sir henry

Здравствуйте, Vitally!
Не совсем понятен смысл Вашей программы :)).
Совет только общий:
Если у Вас стоит BP/TP7 на ХР/2000/МЕ, то поменяйте его на FreePascal, TMT Pascal и т.п. В Виндах они работают намного лучше, чем "классика жанра" :)). FreePascal - практически брат близнец ВР по процедурам и функциям, только написан он с учетом 32-х разрядов ОС.
Я запустил Вашу программу (с удалением лишних палок, видимо синтаксическая ошибка :), ответ получился 1. Так и должно быть?

Ответ отправлен: 15.01.2004, 12:12
Отправитель: sir henry


Отвечает Ayl

Здравствуйте, Vitally!
Потому что при i >= N значение функции не определено.
Смотри, что у тебя получается по шагам:
N = 1
i = 0
summa = Fsum (1);
Fsum:
i < N ? да (0 < 1)
i = 1
Fsum = Fsum (1) + 1;
Fsum:
i < N ? нет (1 = 1)
возврат - не определен (фактически возвращается то, что на текущий момент будет находится в регистре AX процессора (для типа возвращаемого значения Word; для Byte используется регистр AL, для LongInt - DX:AX)

Т.о., нельзя определить, какой результат будет на выходе.

Для исправления этого нужно твою функцию написать примерно так:
Function FSum(g:byte):word;
Begin
Fsum := 0;
if i begin
i:=i+1;
Fsum:=Fsum(g)+1;
end;
end;
либо так:
Function FSum(g:byte):word;
Begin
if i begin
i:=i+1;
Fsum:=Fsum(g)+1;
end
else Fsum := 0;
end;


Ответ отправлен: 15.01.2004, 12:20
Отправитель: Ayl


Отвечает Tancho

Приветствую Вас, Vitally!
Надо иметь в виду что функция ВСЕГДА!! должна принимать
какая либо стойност и если ты ее не придаешь того что надо,
то она САМА!(Т.Е. Операционная с-ма под каторая выполняется прога даеть ее) будеть принять что угодно!
А если i >= n твоя функция что будет принимать?
Вот смотри мой варианть, если Fsum := 0, тебе не устраивать
то давай Fsum того что хочешь.

Приложение:

Ответ отправлен: 15.01.2004, 12:49
Отправитель: Tancho


Отвечает Boriss

Приветствую Вас, Vitally!
При значении аргумента g =1 имени функции ничего не присвается, по этой причинеи ерунда. То есть, в той области памяти, где summa:=Fsum(1); ищет результат, находится НЕЧТО

Ответ отправлен: 15.01.2004, 13:21
Отправитель: Boriss


 Вопрос № 403

Братья, Други!
Снова я! :)
Я нашел решение (см. приложение). Не знаю, насколько оно правильное, но работает! Тем не менее буду очень признателен за любые полезные комментарии. т.к. ничего подобного в учебниках я не встречал!
Vitally.


Приложение:


Вопрос отправлен: 15.01.2004, 11:02
Отправитель: Vitally

[Следующий вопрос >>] [Список вопросов]

Отвечает sir henry

Добрый день, Vitally!
Я понял Вашу проблему :)). Видимо, при некоторых условиях, Ваша функция FSum возвращает не результат вычислений, а некоторое случайное значение, т.к. условие вычисления (if iНасчет "ничего подобного в учебниках" Вы неправы :). Там как раз часто предупреждают насчет опасности начальной неинициализации переменных (или результатов функций).

Ответ отправлен: 15.01.2004, 12:21
Отправитель: sir henry


Отвечает Tancho

Доброе время суток, Vitally!
Вот Правилно - я уже сказал : "Функция всегда должна принимать, какая либо стойтость"! Сега ты придаешь ее всегда
0( ...Begin Fsum := 0), а потом проверяешь если i < n,
то меняешь стойтост ф-ии , иначе остаеться в начале присвоенная стойность и это правилно!Другое дело что ты в самом деле хочешь!

Ответ отправлен: 15.01.2004, 13:03
Отправитель: Tancho


Отвечает Boriss

Здравствуйте, Vitally!
Да нет, встречали Вы это в учебниках, только внимания не обратили. ВО ВСЕХ учебниках отмечается, что в Паскале имени функции внутри тела функции обязательно нужно что-то присвоить, иначе ВОЗВРАЩАЕМОЕ ею значение неопределенное

Ответ отправлен: 15.01.2004, 13:23
Отправитель: Boriss


Отвечает Strory

Здравствуйте, Vitally!
А в чём собственно состояла задача?
Во-первых вы сотворили одноэтажную рекурсию.
В первом варианте у Вас значением функции становился адрес этого самого значения в памяти:
Fsum:=Fsum(g)+1;
А во втором варианте всё тоже самое, но вы значение функции просто обнуляете, а прибавление единицы и даёт ваш результат:
Vsego = 1
Хотелось бы узнать, что эта программа должна была делать...
Удачи :)

Ответ отправлен: 17.01.2004, 12:25
Отправитель: Strory



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (24)
C / C++ (17)
Perl (4)
Builder / Delphi (18)
Pascal (19)
Basic / VBA (5)
Java / JavaScript (5)
PHP (13)
Криптография (5)
WinAPI (12)
Пользователю
Windows 95/98/Me (40)
Windows NT/2000/XP (58)
"Железо" (30)
Поиск информации (20)
Администратору
Windows NT/2000/XP (28)
Linux / Unix (10)
Юристу
Гражданское право (14)
Семейное право (10)
Трудовое право (11)
КоАП (10)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное