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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2009, 20:11   #1
androidvsu
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 39
По умолчанию OC Windows инициировала точку останова в ...

Не могу найти ошибку, может кто подскажет...
Код:
#include "stdafx.h"
#include <iostream>
#include <stack>
#include <mbstring.h>
#include <shlwapi.h>
#include <string.h>
#include <process.h>//подключается exit

using namespace std;

int wmain(int argc, wchar_t* argv[])
{
	stack<wchar_t*> myStack;
	wchar_t input[1024];
	wcout << _TEXT("input equation:")<<endl;
	wcin.getline(input,1023);
	wchar_t* token;
	token = wcstok(input, _TEXT(" "));
	while (token != NULL)
	{
		if (wcschr(_TEXT("+-/*"), token[0]) != NULL)
		{
			if (myStack.empty())
			{
				wcout << _TEXT("Error! ") << endl;
				system("pause");
				exit(1);
			}
			wchar_t* d1 = new wchar_t(wcslen(myStack.top())+2);
			wcscpy(d1, myStack.top());
			myStack.pop();
			if (myStack.empty())
			{
				wcout<<_TEXT("Error2!") << endl;
				system("pause");
				exit(1);
			}
			wchar_t* d2 = new wchar_t(wcslen(myStack.top())+2);
			wcscpy(d2, myStack.top());
			myStack.pop();
			int size = 100;
			wchar_t* temp = new wchar_t(size);
			wcscpy(temp, token);
			wcscat(temp, _TEXT(" "));
			wcscat(temp, d2);
			wcscat(temp, _TEXT(" "));
			wcscat(temp, d1);	
			myStack.push(temp);
		}
		else
		{
			myStack.push(token);
		}
		token = wcstok(NULL, _TEXT(" "));
	}
	if (myStack.size() != 1){
		cout << "Error! Not all argument used!" << endl;
	}
	wcout << endl << "RESULT: " << myStack.top() << endl;
	system("pause");
	myStack.pop();
	return 0;
}

Последний раз редактировалось androidvsu; 16.09.2009 в 20:14.
androidvsu вне форума Ответить с цитированием
Старый 16.09.2009, 20:20   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

А где падает не подскажешь? Продебагить никак?
mMAg вне форума Ответить с цитированием
Старый 16.09.2009, 20:27   #3
androidvsu
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 39
По умолчанию

падает в самом конце, т.е. все что нужно делает, а при самом выходе выкидывает сообщение. для теста можешь попробовать ввести: 2 3 + 2 * 12 2 - +. Мне кажется, что ошибка возникает из-за этого кода
Код:
int size = 100;
wchar_t* temp = new wchar_t(size);
wcscpy(temp, token);
wcscat(temp, _TEXT(" "));
wcscat(temp, d2);
wcscat(temp, _TEXT(" "));
wcscat(temp, d1);	
myStack.push(temp);
но как ее избежать не знаю
androidvsu вне форума Ответить с цитированием
Старый 16.09.2009, 21:03   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Падает в самом конце? У меня вот на этой строке улетела один раз:
Код:
wchar_t* d1 = new wchar_t(wcslen(myStack.top())+2);
И два раза в самом конце. Скорее всего вылетает из-за неправильного алгоритма на какой-то дурацкой ошибке. Если бы падала в конкретном месте, намного проще было бы устранить.
mMAg вне форума Ответить с цитированием
Старый 16.09.2009, 21:20   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У меня вот такой вывод:
Цитата:
Сообщение от cmd.exe
input equation:
2 3 + 2 * 12 2 - +

RESULT: + * + 2 3 2 - 12 2
Кстати, может быть вылетает из-за неверного использования new
Код:
wchar_t* d1 = new wchar_t(wcslen(myStack.top())+2); // Ваш код выделяет память под wchar_t и инициализирует его
// значением wcslen(myStack.top())+2.
...
wchar_t* d1 = new wchar_t[wcslen(myStack.top())+2]; // а так надо(квадратные скобки указывают, что надо создать
// массив типа wchar_t

Последний раз редактировалось netrino; 16.09.2009 в 21:22.
netrino вне форума Ответить с цитированием
Старый 16.09.2009, 21:23   #6
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Код:
wchar_t* d1 = new wchar_t(wcslen(myStack.top())+2); // Ваш код
...
wchar_t* d1 = new wchar_t[wcslen(myStack.top())+2]; // а так надо(квадратные скобки)
Концептуальная ошибка, не те скобочки.
Я вот только в толк не могу взять, почему вообще с круглыми скобками работает? И как это интерпретируется?
А не, стоп, разве это не простое приведение типа? Вроде ж так и надо, как написано. С круглыми скобками. Здесь не память под массив выделяется.

//Что-то я тупить начал, надо закругляться

Последний раз редактировалось mMAg; 16.09.2009 в 21:29.
mMAg вне форума Ответить с цитированием
Старый 19.09.2009, 14:14   #7
androidvsu
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 39
По умолчанию

Всем большое спасибо!
androidvsu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
tchart - Как при наведении курсора на определенную точку сериэса узнать точку наведения и отобразить её xaero93 Помощь студентам 0 22.04.2009 19:28
как создать точку востановления на xp gaka1995 Windows 3 05.02.2009 19:29
Не работает точка останова в Дельфи grenles Общие вопросы Delphi 4 17.12.2008 11:26
рисовать точку по центру стола? 4elovek Мультимедиа в Delphi 2 28.11.2008 20:21
Поменять точку на запятую Romuald Microsoft Office Excel 7 17.12.2007 18:55