Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2013, 16:50   #1
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию Не могу понять приведение типа в Turbo Pascal

Добрый день. Например, есть код на С++
Код:
#define maxUnsigned(bits)	(mostSignBit(bits) | (mostSignBit(bits) - 1))

for(i = 0; checkgray(i,BITS) && i < (unsigned)maxUnsigned(BITS); i++);
При попытки сделать, почти тоже самое, выводит на i < maxUnsigned(BITS) о несоответствие типа. Хотя вроде как они оба должны быть одного типа integer.
Вот часть кода на паскале
Код:
function maxUnsigned(bits:integer):integer;
begin
maxUnsigned:=(mostSignBit(bits) Or (mostSignBit(bits) - 1));
end;

var i,BITS:integer;
begin
writeln('Vvedite bits: ');
readln(BITS);
for i:=0 to (checkgray(i,BITS) and i < maxUnsigned(BITS)) do
i:=i+1;
Буду благодарен за помощь

Последний раз редактировалось ~Sл@\/яH~; 10.11.2013 в 16:53.
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 18:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Приведение тут ни при чем. в For нельзя условия писать.
Используй while
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2013, 20:22   #3
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Приведение тут ни при чем. в For нельзя условия писать.
Используй while
Если через цикл while, то будет либо зацикливаться, либо будет выводить не все что нужно
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 20:25   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

А вы условие нормально поставьте, чтобы не было зацикливания или вывода лишней информации
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 10.11.2013, 20:25   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Откуда такая инфа?
Код:
for i:=0 to (checkgray(i,BITS) and i < maxUnsigned(BITS)) do
i:=i+1;
Плавно переходит в
Код:
i := 0; while (checkgray(i,BITS) and i < maxUnsigned(BITS)) do
   Inc (i)
Poma][a вне форума Ответить с цитированием
Старый 10.11.2013, 20:48   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

И скобочки попробуйте поставить:
Код:
while checkgray(i,BITS) and (i < maxUnsigned(BITS)) do
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2013, 20:50   #7
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Откуда такая инфа?
Код:
for i:=0 to (checkgray(i,BITS) and i < maxUnsigned(BITS)) do
i:=i+1;
Плавно переходит в
Код:
i := 0; while (checkgray(i,BITS) and i < maxUnsigned(BITS)) do
   Inc (i)
вот в таком цикле, как раз зацикливается. Поидее должно выводить 8 значений, если BITS задать 3. т.е. 2^3=8.

Цитата:
Сообщение от BDA Посмотреть сообщение
И скобочки попробуйте поставить:
Код:
while checkgray(i,BITS) and (i < maxUnsigned(BITS)) do
Если так, то он пишет о несоответствие типа

Последний раз редактировалось Stilet; 10.11.2013 в 21:19.
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 20:54   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Просто Вы неправильно реализовали checkgray. В Паскале и Си разный приоритет операций.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2013, 20:58   #9
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Просто Вы неправильно реализовали checkgray. В Паскале и Си разный приоритет операций.
Ну вот функция в С++
Код:
int checkgray(unsigned i,int BITS){
	printf("%4u", i); printbits(i,BITS); printbits(bin2gray(i,BITS),BITS); printf("\n");
	if(i != gray2bin1(bin2gray(i,BITS),BITS) ||
	  i != gray2bin2(bin2gray(i,BITS),BITS) ||
	   i != gray2bin3(bin2gray(i,BITS),BITS)){
	printf("%u: ошибка перевода из кода Грея!\n", i);
		return 0;
	}
	return 1;
}
А вот на Pascal

Код:
function checkgray(i,BITS:integer):integer;
begin
write(i);
printbits(i,BITS);
printbits(bin2gray(i,BITS),BITS);
writeln(' ');
if ((i <> gray2bin1(bin2gray(i,BITS),BITS)) Or
(i <> gray2bin2(bin2gray(i,BITS),BITS)) Or
(i <> gray2bin3(bin2gray(i,BITS),BITS))) then begin
writeln('ohibka perevoda iz koda grayя!');
checkgray:=0;
end;
checkgray:=1;
end;
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 21:06   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
function checkgray(i, BITS: integer): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;
В Си число тоже может считаться логическим выражением.
if (a) {} - ложь, если a = 0, истина, если a <> 0.
Даже если сделать преобразование числа в булево выражение, Ваша реализация содержит ошибку (всегда возвращает 1).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.11.2013 в 21:08.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое приведение типа the_deer_one C# (си шарп) 9 25.08.2012 20:59
не могу понять несколько строчек в pascal в простом исходнике zhenka619 Помощь студентам 7 30.12.2011 14:06
Сумма ряда (Pascal). Не могу понять смысл задачи :( DsDevis Помощь студентам 9 26.03.2009 01:16
Нужна библиотека для turbo pascal не могу нигде найти Dimanw92 Паскаль, Turbo Pascal, PascalABC.NET 1 01.10.2008 21:18
Не могу решить программу в Turbo Pascal помогите пожалуйста! Заранее благодарен... dolbi Помощь студентам 5 01.04.2008 08:26