#define SIZELINE 40
#define PY LK/SIZELINE
#define KV LK/PY
Баг находится в четвертой строчке . Кто может обяснить этот баг.
Код: Выделить всё
#define LK 0x7FFF
#define SIZELINE 40
#define PY (LK/SIZELINE)
#define KV (LK/PY)
Насчет скобок правильно но не точно, а надо:DrWatson писал(а):не, препроцессор посчитает LK/LK/SIZELINE=0!!!
те сначала LK/LK=1 потом 1/SIZELINE=0
заимей привычку математические выражения в директивах #define всегда заключать в скобки:Вот здесь он посчитает как надо, т.е. KV=SIZELINEКод: Выделить всё
#define LK 0x7FFF #define SIZELINE 40 #define PY (LK/SIZELINE) #define KV (LK/PY)
Так что дело было не в бобине
ЗЫ: "баг" такой скорее всего будет в любом компиляторе С.
ЗЗЫ: в любом нормальном учебнике по Си настоятельно рекомендуется пользоваться а таких случаях скобками.
DrWatson как раз написал все правильно и точно, а у Вас до сих пор осталась неточность:FUZZY_ писал(а):Насчет скобок правильно но не точно,
в выделенном тексте: в общем случае LK и SIZELINE могут также быть выражениями, поэтому их по Вашему методу также придется брать в скобки (LK)/(SIZELINE). (Через полгода Вам придется изменить программу так, чтобы SIZELINE было выражением от каких-то параметров - и все посыпется, а Вы будете еще долго думать, что за фигня)а надо:
#define LK 0x7FFF
#define SIZELINE 40
#define PY LK/SIZELINE //тут вычисление идет правильно
//или так #define PY (LK/SIZELINE) // результат тот-же
#define KV (LK)/(PY) ( при #define KV (LK/PY) KV=0.)
Разрядность тут не при чем. Это скорее особенность какой-то конкретной реаизации компилятора; кстати, очень редкая особенность и, скорее, это даже ошибка (если Вы сами не ошиблись), поскольку define - это директива компилятору, он выполняет подстановку текста, а не вычисление выражений, поэтому в получившемся выражении LK/LK/SIZELINE действия, имеющие одинаковый приоритет, должны выполняться последовательно слева направо.но это только для 8 и 16 р компиляторов
для 32 р все работает и без ксобок
Проверено 4 (16 р) компилятора 3 -для МК (разные платформы ) , 1 - для РСtesterplus писал(а):DrWatson как раз написал все правильно и точно, а у Вас до сих пор осталась неточность:FUZZY_ писал(а):Насчет скобок правильно но не точно,в выделенном тексте: в общем случае LK и SIZELINE могут также быть выражениями, поэтому их по Вашему методу также придется брать в скобки (LK)/(SIZELINE). (Через полгода Вам придется изменить программу так, чтобы SIZELINE было выражением от каких-тоа надо:
#define LK 0x7FFF
#define SIZELINE 40
#define PY LK/SIZELINE //тут вычисление идет правильно
//или так #define PY (LK/SIZELINE) // результат тот-же
#define KV (LK)/(PY) ( при #define KV (LK/PY) KV=0.)
параметров - и все посыпется, а Вы будете еще долго думать, что за фигня)
Но брать в скобки каждый операнд - запарно (сейчас выражения простые, а бывают по десятку действий, и из-за скобок выражение потеряет наглядность), поэтому везде рекомендуют в скобки заключать все выражение при дефайне.
Разрядность тут не при чем. Это скорее особенность какой-то конкретной реаизации компилятора; кстати, очень редкая особенность и, скорее, это даже ошибка (если Вы сами не ошиблись), поскольку define - это директива компилятору, он выполняет подстановку текста, а не вычисление выражений, поэтому в получившемся выражении LK/LK/SIZELINE действия, имеющие одинаковый приоритет, должны выполняться последовательно слева направо.но это только для 8 и 16 р компиляторов
для 32 р все работает и без ксобок
Насчет "особенности" я погорячился. Это была бы не особенность, а ошибка. Директива define не делает вычислений. На место определеляемых идентификаторов подставляется текст определения (а не результат выражения). Компилятором идентификатор KV будет рассмотриваться как LK/LK/SIZELINE.FUZZY_ писал(а):Проверено 4 (16 р) компилятора 3 -для МК (разные платформы ) , 1 - для РС
Проверено 2 ( 32 р) компилятора GNU, Borlad - PC
С вышесказанным об особенностях компиляторов не согласен
(Нет программы без ошибок, постосто ошибки по разному проявляются !)
FUZZY_ писал(а):для 32 р все работает и без ксобок
Код: Выделить всё
//---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define LK 0x7FFF
#define SIZELINE 40
#define PY LK/SIZELINE
#define KV LK/PY
unsigned long A;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
A = KV;
}
Код: Выделить всё
#define LK 0x7FFF
#define SIZELINE 40
#define PY LK/SIZELINE
#define KV LK/PY
unsigned long A;
void main (void)
{
A = KV;
}Код: Выделить всё
#define LK 0x7FFF
#define SIZELINE 40
#define PY LK/SIZELINE
#define KV LK/PY
unsigned long A;
void main (void)
{
A = KV;
}Увлекся.urry писал(а):Виктор, Вы меня удивляете...Столько телодвижений, чтобы доказать, что 2+2=4
Если бы у меня были мегапрограммеры, то тестер был бы им не нужен. Но вера в их существование осталась.urry писал(а):Я фсе время думал, ну если у них такой ТЕСТЕР, то какие же там программеры, ну вообще звери наверное - рвут на части одним взглядом...
Потом думаю, ну - нет там ложки... как в матрице - нет этих сверхинтеллектуальных программеров - я так честно их в свое время пытался искать ...
Вот - разделите мой пессимизм - имхо, Вы там за них все пишете ?