[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Пишу на 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);
    происходит утечка(или потеря данных)...
    Вопрос, как решить эту проблему, или если я где-то допускаю ошибку - поправьте плз)

    Заранее огромное спасибо =]
     
  2. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    std::stack<Tree> postfixTree;
    tree.tree = &postfixTree.top();

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

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Можно пример, если не трудно?)
    Если речь идет о ретурне в функц. то у меня такая-же ошибка потом выскакивает =/
     
  4. [R]eD

    [R]eD Elder - Старейшина

    Joined:
    1 Aug 2006
    Messages:
    72
    Likes Received:
    1
    Reputations:
    0
    Дурацкий вопрос...

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

    Visual Basic
     
  5. Dosia

    Dosia Member

    Joined:
    5 Jun 2009
    Messages:
    118
    Likes Received:
    81
    Reputations:
    6
    Dim i As Integer
    For i = 100 To 1 Step -1
    Print i
    Next i
     
    2 people like this.
  6. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    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;
        }
    };
     
    #3746 Ra$cal, 18 Sep 2009
    Last edited: 18 Sep 2009
    1 person likes this.
  7. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Ааа понял, спасибо)))
    Теперь все понятно, вотк ак я решил эту проблему
    Code:
        Tree* tmp = new Tree;
        *tmp = postfixTree.top();
        tree.tree = tmp;
    А насчет
    Code:
    std::stack<Tree*> tree;
    спасибо, но это мне не нужно)
    У меня в postfixTree стеке в конце функции(после всех операций) остается всего 1 елемент... так что мне нужно просто вытащить и присвоить этот елемент к другому tree.
     
    #3747 rudvil, 18 Sep 2009
    Last edited: 18 Sep 2009
    1 person likes this.
  8. -m0rgan-

    -m0rgan- Elder - Старейшина

    Joined:
    29 Sep 2008
    Messages:
    514
    Likes Received:
    170
    Reputations:
    17
    re2all

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

    Пример:

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

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

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    MSDN: http://msdn.microsoft.com/ru-ru/library/system.net.mail.smtpclient.aspx

    .Net Framework 3.5
    Пространство имён System.Net.Mail
    Класс SmtpClient


    ----------------------------

    Если тебе нужен метод, чтобы тупо строку отправлять, то не знаю чем помочь. Ведь в реальных условиях нужно заполнять такие поля, как адрес получателя, тему письма, адрес отправителя и т.д.
     
    #3749 herfleisch, 20 Sep 2009
    Last edited: 20 Sep 2009
    1 person likes this.
  10. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Есть "tokenizer.h" и "tokenizer.cpp", хочу некоторые функции объявить как "inline"...
    Проблема в том что если прописать "inline" в "*.cpp" компилятор пишет
    если прописать "inline" в "*.h" пишет тоже-самое, пробовал прописать в *.h и в *.cpp всеравно вылетает эта ошибка =/

    Прикол ещё в том, что если не вызывать эти заинлайненые функ. в "main.cpp" то все компилится на ура, но это не выход...
    Заранее спс, c меня + :)
     
    #3750 rudvil, 21 Sep 2009
    Last edited: 21 Sep 2009
  11. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    _http://www.chilkatsoft.com/email-library.asp
    _http://www.vmime.org/
     
  12. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    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++
     
  13. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Код в студию ...

    Потому что ты сравниваешь адреса, а не содержимое.
    Либо _http://www.cplusplus.com/reference/clibrary/cstring/strcmp/ для С-строк
    либо юзай std strings
     
    2 people like this.
  14. seregkaz

    seregkaz Elder - Старейшина

    Joined:
    7 Aug 2009
    Messages:
    104
    Likes Received:
    49
    Reputations:
    15
  15. seregkaz

    seregkaz Elder - Старейшина

    Joined:
    7 Aug 2009
    Messages:
    104
    Likes Received:
    49
    Reputations:
    15
    я не вижу ответа, что тут некто не знает с++ ? не верю
     
  16. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Смог сам разобраться, оказывается если вызывать заинлайненую функц. из другово файла(не из того где прописан inline) то будет эта ошибка выскакивать...
    Решение - создать так сказать связную функцию)))
     
  17. Chrek625

    Chrek625 Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    143
    Likes Received:
    13
    Reputations:
    -7
    Структуры в СИ

    Доброго времени суток...
    Подкиньте пожалуйста статей пл структурам в языке СИ...
    Искал н могу ничего конкретного найти к сожалению сам.
     
  18. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    1 person likes this.
  19. n4e/\@

    n4e/\@ Elder - Старейшина

    Joined:
    6 May 2008
    Messages:
    138
    Likes Received:
    17
    Reputations:
    0
    Решаю задачу коммивояжера методом ветвей и границ. Нашел программу на паскале, переписал на си, вроде все правильно, но вываливает сегфолт на 146 строчки http://paste.org.ru/?asvtl7
    Входной файл такой:
    Code:
    4
    0    6    1    5
    6    0    3    1
    1    3    0    2
    5    1    2    0
     
  20. ICQ Hool

    ICQ Hool Elder - Старейшина

    Joined:
    31 Mar 2008
    Messages:
    175
    Likes Received:
    25
    Reputations:
    0



    при выделении 2-го и 3-го элемента записывает только второй

    если выделить нулевой или первый элемент и второй то не запишет ничего => почему-то запоминается номер только первого выделенного элемента а вторых какбы нет...
    что я делаю нетак
     
Thread Status:
Not open for further replies.