Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Границы допустимых значений переменных


Автор: Ner-zul 26.1.2004, 14:49
Пусть у меня есть переменная типа long int t; exclamation.gif
Допустим я выщитываю расстояния от заданной точки до второй движущейся в плоскости размером 600 на 400 пикселей(и где-то у себя в программе использую это расстояние ) по формуле:
t=dx*dx+dy*dy (ну то есть t- это квадрат расстояния) И вот в процессе движения у меня получается что переменная t принимает черт знает какие значения, в том числе и отрицательные exclamation.gif Из - за этого у меня вся программа глючит!
Сначала у меня t - было типа int и я исправил на long int, что-то изменилось но в целом это не помогло!??
Помогите пожалуйста!!!Бьюсь головой о клаву уже второй день!!!
(P.S. если хотите я выложу код своей программки)

Автор: bel_nikita 26.1.2004, 14:52
используй unsigned int или unsigned long и твои отрицательные числа пропадут

Автор: Paradox 26.1.2004, 14:55
Цитата
600 на 400 пикселей(и где-то у себя в программе использую это расстояние ) по формуле:
t=dx*dx+dy*dy
максимум получится 500000 в long int вхоит, если получается отрицаткльное ты где то напортачил
Код в студию

Автор: Ner-zul 26.1.2004, 15:11
1)Я использовал и int и long int и unsigned long int (можно правда long double еще попробовать!!!)-во всех случаях прога глючит!!!
2)Я знаю и сам проверял что все значения "влезают" в long int, но почему-то все равно отрицательные вылезают!!!


unsigned long int a;
unsigned long int b;
unsigned long int a2;
unsigned long int b2;
unsigned long int kkk;
...


int x=320;
int y=240;

int dxp=300;
int dyp=400;


...

a=dxp-x;

b=dyp-y;

a2=a*a;

b2=b*b;

t=a+b;
kkk=600*400;

...

printf("%li %li %li %li %li %li ",a,b,a2,b2,t,kkk);

...
Точка с координатами x,y - движется;стока переменных создал чтобы проверит где именно глючит;переменная kkk- просто так для проверки(она кстати равна - 2****- ну то есть отрицательная)


HELP!!! HELP!!! HELP!!!

Автор: bel_nikita 26.1.2004, 15:28
Цитата
int x=320;
int y=240;

int dxp=300;
int dyp=400;

в этой сточке утебя проблема
Цитата
a=dxp-x;

у тебя получается -20, но так как unsigned, то а=FFFFFFECh.

вроде бы такsmile.gif

Автор: bel_nikita 26.1.2004, 15:30
что значит %li?
%i - знаю.

Автор: Ner-zul 26.1.2004, 15:46
1)да но когда было все просто long int точно так же глючило!
2)%li - вроде так надо писать в printf когда хочешь вывести переменную типа long int( я в учебнике смотрел) %i - просто int.

Автор: bel_nikita 26.1.2004, 16:11
Ner-zul
все правильно, мне кажется, у тебя ошибка в самом алгоритме вычисления
я не знаю, что ты вычесляешь, но кажется тебе надо добавить деление по модулю 2 (%320)
это, типа, если у тебя точка вылезает за границу (у тебя эта граница= 320) и ты хочешь отобразить ее вновь
вообщем у тебя движется точка в право. дошла до границы 320 и ты должен отобразить ее, но так как ты уже вылез за границу видимости ты должен отобразить ее уже с нуля. если это так то добавь a=(dxp-x)%320 или a=(dxp-x)&320, что выглядет красивее
понял? аль нет? smile.gif

Автор: Ner-zul 26.1.2004, 17:01
Я понял что ты мне предлагаешь! и это хорошо но у меня дело в другом:
Я хочу написать подобие арканоида... И щас у меня решается вопрос как отработать соударения шарика с углами и о концы управляемой перекладины(а в углах и на концах точки) и чтобы оnследить момент ударения я рассчитываю расстояние от центра шара до той точки о которую он ударится и отобьется, и когда расстояние между этими точками равно радиусу то я зоставляю шарик двигаться в обратном напрвлении ... вот такое простое условие и такая неразрешимая проблема... как я уже говорил это расстояние глючит по страшному и шарик начинает отражаться от всего чего только хочет!!! забавно и грустно....

Автор: bel_nikita 26.1.2004, 17:30
ну, это надо на код смотреть, точнее на алгоритм вычисления
вычесление:
Цитата
a=dxp-x;
некорректное
у тебя число отрицательное получается
вообще, что такое а?

Автор: Ner-zul 26.1.2004, 17:42
1)Ну формула такая : r*r=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)
2)а = x1-x2(это я формулу на несколько переменных разделил чтобы найти где глючит)
3)Даже если разность отрицательная то а*а всегда положительное!==> r*r всегда положительное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)