Member 14767000 Ответов: 1

Возникли проблемы с visual stuio 2019


Я только что начал использовать Visual Studio в первый раз. Я хотел попробовать использовать свои знания C++ для создания простого приложения windows. Предполагается, что приложение вычисляет простую производную от одного выражения, такую как 4x^2, 2x^3, 24x^5 и т. д. (Я собирался заставить его сделать больше, но сначала должен был убедиться, что это сработает) Однако это, похоже, не работает (по крайней мере, не в Visual Studio).

Что я уже пробовал:

Это код кнопки, которую пользователь будет нажимать для вычисления. Ответ должен быть отображен в label4:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

		std::string expression;
		msclr::interop::marshal_context context;
		expression = context.marshal_as<std::string>(textBox1->Text);

		std::string firstNum;
		std::string firstExpr;

		for (int i = 0; i < expression.size(); ++i)
		{
			if (isdigit(expression.at(i)) == true)
			{
				firstNum = firstNum + expression.at(i);
			}
			else
			{
				int num = atoi(firstNum.c_str());
				std::string powNum;
				powNum = powNum + expression.at(i + 2);
				int pow = atoi(powNum.c_str());
				num = num * pow;
				--pow;
				firstExpr = std::to_string(num) + "x^";
				firstExpr = firstExpr + std::to_string(pow);
				break;
			}
		}
		label4->Text = context.marshal_as<String^>(firstExpr);
	
	}

at first I used stoi() instead of atoi() but I kept getting an exception thrown saying stoi(out of range). I Copied and pasted the code to Notepad++ (with very minor tweaks) and compiled it on the GNU compiler through the Putty terminal and it worked just fine. I gave up with using stoi() and tried using atoi() and c_str() to first turn the string into a c string then convert it to an int. However, although I no longer get an exception, the output is always 0x^-1. I tried as much as possible to use the C++ stuff I am familiar with (hence why I did everything using C++ strings instead of Microsoft's String ^) since I am new to this but It's just not working in Visual Studio for some reason. Could I please get some help with this, I would greatly appreciate it. Thank you.

Rick York

Важно отметить, что это управляемый C++, а не стандартный C++. Я подозреваю, что это большая часть вашей проблемы. Я очень мало знаю об этом, поэтому ничем не могу вам помочь.

Member 14767000

Спасибо Вам за Ваш вклад!

jeron1

Можете ли вы установить точку останова и шагнуть через нее?

Member 14767000

Я пытался, но уже нашел правильное решение. Оказывается, что делать if(isdigit(...) == true) не очень хорошая идея, и что я должен на самом деле просто делать if((isdigit(...)). Спасибо, что откликнулись!

1 Ответов

Рейтинг:
11

KarstenK

избежать такой код лик

if (isdigit(expression.at(i)) == true)
используйте более явный код, например
CHAR c = expression.at(i);
if( isdigit(c) ) //no need to check for true
чтобы лучше видеть, что происходит.

Один очень важный момент заключается в том, что вы используете версию ANSI, но ваш класс string может работать с unicode. Читайте подробности о компании Атой, _atoi_l, _wtoi, _wtoi_l Мой совет заключается в том, что вам лучше использовать _ttoi.

Научитесь использовать отладчик, потому что я уверен, что эти исключения ОШИБКИ в КОР-коде.


Member 14767000

Хорошо, так что... делай то, что ты сказал, и меняйся:

if (isdigit(expression.at(i)) == верно)

к:

Типа char с = выражение.в(я);
if( isdigit(c) )

кажется, он все исправил. Теперь он дает мне правильный выход. Большое вам спасибо, но не могли бы вы объяснить мне, почему делать первое нехорошо, потому что я много раз делал это в прошлом, прежде чем начал использовать visual. Спасибо.