Пишу на Visual С++ 2008 Конвертирую постфикс выражение в дерево. tree.cpp Code: struct Tree { tree_type treetype; int treesize; char* value; Tree* tree; Tree () { this->treesize = 0; this->value = 0; this->tree = 0; } }; void ParseAssigment (Tree& tree) { std::queue<Token> Postfix; // В нем хранится постфикс выражение например [1][2][3][*][+] std::stack<Tree> postfixTree; while (!Postfix.empty()) { if (Postfix.front().tokentype == token_type_numeric) { Tree* nodeTree = new Tree; nodeTree->treetype = tree_type_num_value; nodeTree->value = Postfix.front().value; Tree* childTree = new Tree[2]; nodeTree->tree = childTree; postfixTree.push(*nodeTree); } else if (isOperator(Postfix.front().tokentype)){ Tree* nodeTree = new Tree; nodeTree->treetype = tree_type_operator; nodeTree->value = strOperator(Postfix.front().tokentype); nodeTree->treesize = 2; Tree* childTree = new Tree[2]; nodeTree->tree = childTree; nodeTree->tree[1] = postfixTree.top(); postfixTree.pop(); nodeTree->tree[0] = postfixTree.top(); postfixTree.pop(); postfixTree.push(*nodeTree); } Postfix.pop(); } tree.treetype = tree_type_postfixexpr; tree.tree = &postfixTree.top(); postfixTree.pop(); std::cout << "[" << tree.tree->tree[1].value << "]\n"; // Тут все значения корректны... т.е. показывает * как и должно быть, с остальными тоже все ок } main.cpp Code: #include "tree.cpp" int main () { Tree* tree = new Tree; ParseAssigment(*tree); std::cout << "outside func[tree->tree->treetype][" << tree->tree->tree[1].value << "]\n"; // вот тут пишет "Unhandled exception. Access violation..." return 0; } Сразу после конвертации проверяю дерево ещё внутри функции - все значения совпадают т.е. все ок. Но после того как я возвращаю готовое дерево из функции и пытаюсь вывести содержимое мне пишет "Unhandled exception. Access violation...". То что отмечено желтым кудато пропадает... Насколько я понимаю тут Code: ParseAssigment(*tree); происходит утечка(или потеря данных)... Вопрос, как решить эту проблему, или если я где-то допускаю ошибку - поправьте плз) Заранее огромное спасибо =]
std::stack<Tree> postfixTree; tree.tree = &postfixTree.top(); ты возвращаешь указатель на локальный объект, который умирает при выходе из функции. вопрос - зачем все делать на указателях? это ж гемор. сделай на нормальных членах данных, сделай копирование и не морочь себе голову временем жизни объектов. или юзай умные указатели.
Можно пример, если не трудно?) Если речь идет о ретурне в функц. то у меня такая-же ошибка потом выскакивает =/
Дурацкий вопрос... Как сделать цикл не в плюс а в минус, тоесть не с 1 до 100, а со 100 до 1 например?))) Visual Basic
std::stack<Tree> postfixTree; Ты объявил стек локально. Значит после выхода из функции будет вызван деструктор, что должно удалить все записи в стеке. Поэтому индексация хоть и будет работать, но вот обращение будет по адресам типа fefefefe и прочими подобными. Ах да. Еще важнее момент, что ты объявил стек std::stack<Tree> а не std::stack<Tree*>. Таким образом элементы так же являются локальными для данной функции объектами. Починить можно так - в функции перед выходом ты должен сделать не просто tree.tree = &postfixTree.top(); Ты должен tree.tree = new Tree [postfixTree.size()]; И в цикле скопировать элементы. А для понимания проблемы сделай контсруктор и деструктор Tree, которые в консоль выводят сообщения и посмотри, что появится в консоли при выходе из функции... или другой враиант - делаешь типа такого: Code: struct Tree { tree_type treetype; int treesize; char* value; [B]std::stack<Tree*> tree;[/B] Tree () { this->treesize = 0; this->value = 0; this->tree = 0; } };
Ааа понял, спасибо))) Теперь все понятно, вотк ак я решил эту проблему Code: Tree* tmp = new Tree; *tmp = postfixTree.top(); tree.tree = tmp; А насчет Code: std::stack<Tree*> tree; спасибо, но это мне не нужно) У меня в postfixTree стеке в конце функции(после всех операций) остается всего 1 елемент... так что мне нужно просто вытащить и присвоить этот елемент к другому tree.
re2all Нужен класс для отправки сообщений на email и icq. Пример: ... char buff[SIZE]; ... Содержимое буффера необходимо отправить на мыло или асю. Подскажите плз класс для этой цели. Зарание благодарен!
MSDN: http://msdn.microsoft.com/ru-ru/library/system.net.mail.smtpclient.aspx .Net Framework 3.5 Пространство имён System.Net.Mail Класс SmtpClient ---------------------------- Если тебе нужен метод, чтобы тупо строку отправлять, то не знаю чем помочь. Ведь в реальных условиях нужно заполнять такие поля, как адрес получателя, тему письма, адрес отправителя и т.д.
Есть "tokenizer.h" и "tokenizer.cpp", хочу некоторые функции объявить как "inline"... Проблема в том что если прописать "inline" в "*.cpp" компилятор пишет если прописать "inline" в "*.h" пишет тоже-самое, пробовал прописать в *.h и в *.cpp всеравно вылетает эта ошибка =/ Прикол ещё в том, что если не вызывать эти заинлайненые функ. в "main.cpp" то все компилится на ура, но это не выход... Заранее спс, c меня +
Code: char str[256]; SYSTEMTIME systime; GetLocalTime(&systime); sprintf(str, "%d", systime.wHour, systime.wMinute, systime.wSecond); ShowMessage(str); //выводит 16 if(str=="16") //не выводит ничего ShowMessage("hello"); Почему условие str=="16" не срабатывает? c++
Код в студию ... Потому что ты сравниваешь адреса, а не содержимое. Либо _http://www.cplusplus.com/reference/clibrary/cstring/strcmp/ для С-строк либо юзай std strings
Пожалуйста помогите решить лабу и код выложите тут! http://letitbit.net/download/3251.39b07d0873b74fa9da9888096/lab3.doc.html Если можно объясните в комментариях что к чему! Жду... Очень срочно
Смог сам разобраться, оказывается если вызывать заинлайненую функц. из другово файла(не из того где прописан inline) то будет эта ошибка выскакивать... Решение - создать так сказать связную функцию)))
Структуры в СИ Доброго времени суток... Подкиньте пожалуйста статей пл структурам в языке СИ... Искал н могу ничего конкретного найти к сожалению сам.
http://phys.protres.ru/~mlobanov/c_lin/5.htm http://www.mir-koda.ru/full_leson_cpp.php?id=20 Bitte )))
Решаю задачу коммивояжера методом ветвей и границ. Нашел программу на паскале, переписал на си, вроде все правильно, но вываливает сегфолт на 146 строчки http://paste.org.ru/?asvtl7 Входной файл такой: Code: 4 0 6 1 5 6 0 3 1 1 3 0 2 5 1 2 0
при выделении 2-го и 3-го элемента записывает только второй если выделить нулевой или первый элемент и второй то не запишет ничего => почему-то запоминается номер только первого выделенного элемента а вторых какбы нет... что я делаю нетак