HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 15.09.2009, 00:11
Hiro Protagonist
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
С нами: 8795069

Репутация: 79
По умолчанию

Можно :
- visual studio c++
- gcc / MinGW
- lcc
- Intel C++ compiler
- TCC
- Watcom C++
- итд

Но нужно ли?

А вообще посмотри соседнюю тему )
 
Ответить с цитированием

  #2  
Старый 17.09.2009, 21:41
intNet
Познающий
Регистрация: 31.05.2009
Сообщений: 68
С нами: 8919750

Репутация: 19
По умолчанию

С delphi перехожу на си, и ксвоему огорччению не нашёл там привычных и удобных функций copy, delete, etc.
strstr(), strpos() и т.п. пока не приспособился к ним, по этому помогите, как например разделить список login;pass(т.е. занести в одну переменную login, в другую - pass) ?
 
Ответить с цитированием

  #3  
Старый 17.09.2009, 21:56
Hiro Protagonist
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
С нами: 8795069

Репутация: 79
По умолчанию

strtok() - http://msdn.microsoft.com/ru-ru/library/2c8d19sb.aspx

А вообще про CRT (RTL) слабо почитать? В том же K&R в приложении стандартная библиотека описывается.
 
Ответить с цитированием

  #4  
Старый 18.09.2009, 01:54
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
С нами: 9320830

Репутация: 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);
происходит утечка(или потеря данных)...
Вопрос, как решить эту проблему, или если я где-то допускаю ошибку - поправьте плз)

Заранее огромное спасибо =]
 
Ответить с цитированием

  #5  
Старый 18.09.2009, 02:23
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
С нами: 10386906

Репутация: 599


По умолчанию

std::stack<Tree> postfixTree;
tree.tree = &postfixTree.top();

ты возвращаешь указатель на локальный объект, который умирает при выходе из функции. вопрос - зачем все делать на указателях? это ж гемор. сделай на нормальных членах данных, сделай копирование и не морочь себе голову временем жизни объектов. или юзай умные указатели.
 
Ответить с цитированием

  #6  
Старый 18.09.2009, 02:39
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
С нами: 9320830

Репутация: 86
По умолчанию

Цитата:
Сообщение от Ra$cal  
std::stack<Tree> postfixTree;
tree.tree = &postfixTree.top();

ты возвращаешь указатель на локальный объект, который умирает при выходе из функции. вопрос - зачем все делать на указателях? это ж гемор. сделай на нормальных членах данных, сделай копирование и не морочь себе голову временем жизни объектов. или юзай умные указатели.
Можно пример, если не трудно?)
Если речь идет о ретурне в функц. то у меня такая-же ошибка потом выскакивает =/
 
Ответить с цитированием

  #7  
Старый 18.09.2009, 15:55
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
С нами: 10386906

Репутация: 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..
 
Ответить с цитированием

  #8  
Старый 18.09.2009, 16:15
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
С нами: 9320830

Репутация: 86
По умолчанию

Ааа понял, спасибо)))
Теперь все понятно, вотк ак я решил эту проблему
Код:
    Tree* tmp = new Tree;
    *tmp = postfixTree.top();
    tree.tree = tmp;
А насчет
Код:
std::stack<Tree*> tree;
спасибо, но это мне не нужно)
У меня в postfixTree стеке в конце функции(после всех операций) остается всего 1 елемент... так что мне нужно просто вытащить и присвоить этот елемент к другому tree.

Последний раз редактировалось rudvil; 18.09.2009 в 16:18..
 
Ответить с цитированием

  #9  
Старый 20.09.2009, 19:37
-m0rgan-
Постоянный
Регистрация: 29.09.2008
Сообщений: 553
С нами: 9270510

Репутация: 519


По умолчанию

re2all

Нужен класс для отправки сообщений на email и icq.

Пример:

...
char buff[SIZE];
...
Содержимое буффера необходимо отправить на мыло или асю.

Подскажите плз класс для этой цели.
Зарание благодарен!
 
Ответить с цитированием

  #10  
Старый 18.09.2009, 15:02
[R]eD
Познающий
Регистрация: 01.08.2006
Сообщений: 35
С нами: 10409033

Репутация: 3
По умолчанию

Дурацкий вопрос...

Как сделать цикл не в плюс а в минус, тоесть не с 1 до 100, а со 100 до 1 например?)))

Visual Basic
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.