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


Автор: Athlete 8.3.2006, 18:51
У меня вводится число k, при нажатии какого-либо знака (кнопки) происходит выполнение действия с числом q. За действие отвечает znak. Как только вводишь q отрицательным, то k становится равным -q. Ничего не пойму. Ему должно же быть всеравно. smile

Код

q=atof(&(Edit1->Text[1]));
switch (znak)
{
case 1:Edit1->Text=k+q;break; // сложение
case 2:Edit1->Text=k-q;break; // вычитание
case 3:Edit1->Text=k/q;break;  // деление
case 4:Edit1->Text=q*k;break;   // умножение
case 5:Edit1->Text=pow(k,q);break;  // возведение в степень
}

Автор: sergejzr 8.3.2006, 18:59
А k то, чему равно?

Автор: Athlete 9.3.2006, 02:27
k - положительное, разве это имеет значение?
Добавлено @ 02:28
k - положительное, разве это имеет значение?

Автор: sergejzr 9.3.2006, 02:39
мало кода привёл всмысле. Ошибка в другом месте.

Автор: Athlete 9.3.2006, 06:19
Ну это главная часть.Расскажу по действиям:
1. В k вбивается первое число (глобальная переменная)
2. При нажатии кнопки действия, обнуляется Edit1.
3. Ввожу q (второе число).
4. Нажимаю знак равно (где расположен switch). Он, вбивает второе число (тоже с edit1) в q, распознает знак, выполняет действие

Автор: Lotrex 9.3.2006, 08:24
Вот это:
Код

q=atof(&(Edit1->Text[1]));

не совсем правильно (или совсем не правильно smile ).
Вот так лучше будет:
Код

q=atof(Edit1->Text[1]->c_str());

P.S.Athlete, судя по тому, что Вы говорите, у Вас где-то в другом месте программы все-таки есть глюк какой-то... Возможно, выход за границы динамического массива. А проблемы с atof и Edit лишь следствие. Вы выкладывайте сюда код своего калькулятора, не стесняйтесь! smile

Автор: Athlete 9.3.2006, 09:24
У калькулятора 4 вкладки, поэтому все выкладывать не вижу смысла. Может быть лучше тогда по мылу кинуть проект? проще будет.

Автор: Romikgy 9.3.2006, 11:31
Имхо лучше юзать StrToInt & StrToFloat

Автор: Adil' 9.3.2006, 14:11
q=atof(&(Edit1->Text[1]));
совсем неправильно, впрочем, как и
q=atof(Edit1->Text[1]->c_str()); - это даже не скомпилится
Если уж хочется atof импользовать, то
q=atof(Edit1->Text.c_str());

Автор: Lotrex 9.3.2006, 15:02
Цитата

q=atof(&(Edit1->Text[1]));
совсем неправильно, впрочем, как и
q=atof(Edit1->Text[1]->c_str()); - это даже не скомпилится
Если уж хочется atof импользовать, то
q=atof(Edit1->Text.c_str());


Да, верно, тут я поторопился и лажанулся.. smile

Цитата

Имхо лучше юзать StrToInt & StrToFloat


А чем лучше? Тем что исключения выбрасывают? Я их поэтому и не использую smile

Цитата

У калькулятора 4 вкладки, поэтому все выкладывать не вижу смысла. Может быть лучше тогда по мылу кинуть проект? проще будет.

А сколько места проект занимает?
Можно только *.cpp файлы послать. (Да их и тут можно выложить, я думаю.)

Автор: sergejzr 9.3.2006, 15:04
Досьтаточно будет кода всей функции в которой эти 9 строк находятся. что ты в первом ссобщении привёл.

Автор: Romikgy 9.3.2006, 15:27
Цитата(Lotrex @ 9.3.2006, 14:02 Найти цитируемый пост)
А чем лучше? Тем что исключения выбрасывают? Я их поэтому и не использую

Тем что эта фича именно борланда, а исключения и обработать можно , ведь не просто так их придумали smile

Автор: Lotrex 10.3.2006, 10:55
Цитата(sergej.z @ 9.3.2006, 15:04 Найти цитируемый пост)
Досьтаточно будет кода всей функции в которой эти 9 строк находятся. что ты в первом ссобщении привёл.


Я думаю, что нет, потому что ежели разрушена куча, то последствия этого могут вылезти совсем не там, где произошло это разрушение. В сях на деле не работает принцип "разделяй и властвуй" smile ИМХО, там на деле работает принцип "разделяй, тестируй, отлаживай, а потом властвуй" smile

Автор: Lotrex 10.3.2006, 15:19
Athlete, вот тут у Вас в том коде, что Вы прислали:
Код

double coss,k,q,M;
int znak,d,e,p;

Эти переменные объявлены глобальными.

Имхо, глобальные они тут нафиг не нужны. Я бы объявил вот так:
Код

static double coss,k,q,M;
static int znak,d,e,p;

Тогда область видимости этих переменных будет - файл, в котором они объявлены, а не вся программа. На худой конец, их в приватную часть объявления класса можно засунуть.
И потом, таким переменным надо бы имена давать более заметные - хотя бы подлиннее и с "верблюжими горбами" : ТакИхБудетЛучшеВидно smile

К примеру, k переименовать в FirstValue, а q переименовать в SecondValue.
Но это так, на будущее совет. И ставьте отступы, а то Ваш код читать - можно сломать и мозги и глаза. smile

Автор: Lotrex 13.3.2006, 10:03
К сожалению, не смог откомпилить Ваш проект - у меня C++ Builder 5.0 стоит, 6-ым пока не пользуюсь smile .
Единственное, что могу присоветовать - поставьте во все обработчики событий бряки. Возможно, что при нажатии кнопки-арифм. действия (+, -, *, /) или кнопки-равенства, или при вводе числа помимо нужных обработчиков этих событий вызываются еще какие-то "левые", или нужные обработчики вызываются не один раз.

Автор: Athlete 13.3.2006, 12:38
Перевод не столь важен был в этой теме. Но спс за поправление. В ближайшее время все советы попробую реализовать, времени сейчас просто не хватает.

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