ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

17.09.2009, 21:41
|
|
Познающий
Регистрация: 31.05.2009
Сообщений: 68
Провел на форуме: 1271980
Репутация:
19
|
|
С delphi перехожу на си, и ксвоему огорччению не нашёл там привычных и удобных функций copy, delete, etc.
strstr(), strpos() и т.п. пока не приспособился к ним, по этому помогите, как например разделить список login;pass(т.е. занести в одну переменную login, в другую - pass) ?
|
|
|

17.09.2009, 21:56
|
|
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме: 193434
Репутация:
79
|
|
strtok() - http://msdn.microsoft.com/ru-ru/library/2c8d19sb.aspx
А вообще про CRT (RTL) слабо почитать? В том же K&R в приложении стандартная библиотека описывается.
|
|
|

18.09.2009, 01:54
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Пишу на Visual С++ 2008
Конвертирую постфикс выражение в дерево.
tree.cpp
Код:
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
Код:
#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...".
То что отмечено желтым кудато пропадает...
std::cout << "[" << tree->tree->tree[1].value << "]\n";
Насколько я понимаю тут
Код:
ParseAssigment(*tree);
происходит утечка(или потеря данных)...
Вопрос, как решить эту проблему, или если я где-то допускаю ошибку - поправьте плз)
Заранее огромное спасибо =]
|
|
|

18.09.2009, 02:23
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
std::stack<Tree> postfixTree;
tree.tree = &postfixTree.top();
ты возвращаешь указатель на локальный объект, который умирает при выходе из функции. вопрос - зачем все делать на указателях? это ж гемор. сделай на нормальных членах данных, сделай копирование и не морочь себе голову временем жизни объектов. или юзай умные указатели.
|
|
|

18.09.2009, 02:39
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Сообщение от Ra$cal
std::stack<Tree> postfixTree;
tree.tree = &postfixTree.top();
ты возвращаешь указатель на локальный объект, который умирает при выходе из функции. вопрос - зачем все делать на указателях? это ж гемор. сделай на нормальных членах данных, сделай копирование и не морочь себе голову временем жизни объектов. или юзай умные указатели.
Можно пример, если не трудно?)
Если речь идет о ретурне в функц. то у меня такая-же ошибка потом выскакивает =/
|
|
|

18.09.2009, 15:02
|
|
Познающий
Регистрация: 01.08.2006
Сообщений: 35
Провел на форуме: 94171
Репутация:
3
|
|
Дурацкий вопрос...
Как сделать цикл не в плюс а в минус, тоесть не с 1 до 100, а со 100 до 1 например?)))
Visual Basic
|
|
|

18.09.2009, 15:10
|
|
Участник форума
Регистрация: 05.06.2009
Сообщений: 127
Провел на форуме: 1313455
Репутация:
249
|
|
Dim i As Integer
For i = 100 To 1 Step -1
Print i
Next i
|
|
|

18.09.2009, 15:55
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
Сообщение от rudvil
Можно пример, если не трудно?)
Если речь идет о ретурне в функц. то у меня такая-же ошибка потом выскакивает =/
std::stack<Tree> postfixTree;
Ты объявил стек локально. Значит после выхода из функции будет вызван деструктор, что должно удалить все записи в стеке. Поэтому индексация хоть и будет работать, но вот обращение будет по адресам типа fefefefe и прочими подобными. Ах да. Еще важнее момент, что ты объявил стек std::stack<Tree> а не std::stack<Tree*>. Таким образом элементы так же являются локальными для данной функции объектами.
Починить можно так - в функции перед выходом ты должен сделать не просто
tree.tree = &postfixTree.top();
Ты должен tree.tree = new Tree [postfixTree.size()];
И в цикле скопировать элементы.
А для понимания проблемы сделай контсруктор и деструктор Tree, которые в консоль выводят сообщения и посмотри, что появится в консоли при выходе из функции...
или другой враиант - делаешь типа такого:
Код:
struct Tree {
tree_type treetype;
int treesize;
char* value;
std::stack<Tree*> tree;
Tree () {
this->treesize = 0;
this->value = 0;
this->tree = 0;
}
};
Последний раз редактировалось Ra$cal; 18.09.2009 в 16:01..
|
|
|

18.09.2009, 16:15
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Ааа понял, спасибо)))
Теперь все понятно, вотк ак я решил эту проблему
Код:
Tree* tmp = new Tree;
*tmp = postfixTree.top();
tree.tree = tmp;
А насчет
Код:
std::stack<Tree*> tree;
спасибо, но это мне не нужно)
У меня в postfixTree стеке в конце функции(после всех операций) остается всего 1 елемент... так что мне нужно просто вытащить и присвоить этот елемент к другому tree.
Последний раз редактировалось rudvil; 18.09.2009 в 16:18..
|
|
|

20.09.2009, 19:37
|
|
Постоянный
Регистрация: 29.09.2008
Сообщений: 553
Провел на форуме: 2584134
Репутация:
519
|
|
re2all
Нужен класс для отправки сообщений на email и icq.
Пример:
...
char buff[SIZE];
...
Содержимое буффера необходимо отправить на мыло или асю.
Подскажите плз класс для этой цели.
Зарание благодарен!
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|