Форум программистов, компьютерный форум, киберфорум
Наши страницы

Не изменяется элемент вектора при работе с ним по указателю - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Функции работы с процессами, как осуществить возвражение результата? http://www.cyberforum.ru/cpp-beginners/thread894888.html
Например void main () { int res; /* запуск exe-шника , ниже*/ } дочерний
C++ Найти наиболее и наименее удаленные точки. Вычисление расстояния между парой точек оформить функцией Даны координаты N точек на плоскости в виде маccивов X и Y. Найти наиболее и наименее удаленные точки. Вычисление расстояния между парой точек оформить функцией. http://www.cyberforum.ru/cpp-beginners/thread894876.html
C++ 7.Дан список студентов. Общие поля: Ф.И.О., дата рождения, группа, средний балл. Если средний балл 4 и выше, то указать размер стипендии. Если средний
#include <stdio.h> #include <string.h> #include <clocale> int main() { setlocale(0,"Rus"); static char res; int res_top = 0; printf("Количество студентов: "); /*fflush...
C++ LPT порт, Ubuntu, code::blocks
Итак, название темы говорит само за себя. Нужно в консольном приложении code::blocks под Ubuntu читать и писать данные из/в LPT-порт. Если точнее, нужно не просто передать информацию, а "дергать...
C++ Самое начало http://www.cyberforum.ru/cpp-beginners/thread894844.html
Привет! Я пытаюсь проделать первые шажки в мире программистов.Можно ли найти литературу бесплатно ? :umnik:
C++ Составить программу и блок-схему Помогите, пожалуйста, кто чем сможет... Буду очень признательна! подробнее

Показать сообщение отдельно
qpMM
0 / 0 / 0
Регистрация: 03.08.2010
Сообщений: 31
07.06.2013, 23:25  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
кто скрин видит?
Да. В коде изменения переменной во время выполнения программы вы не увидите. На скриншоте идентичность показана розовой и оранжевой черточками. То, что указатель в запечатленный момент указывает на этот элемент показано красной и фиолетовой черточками. Плюс ко всему, проблемный участок кода также виден на скриншоте. Из остального кода к этой функции (помимо вызова) относится только то, что вектор nodes объявлен глобально, чтобы я мог просматривать его содержимое.

Добавлено через 9 минут
Ну, точнее розовая показывает как раз отличие. Вместо newByte сравните переменные freq.

Добавлено через 5 минут
Вектор nodes - изменяемый вектор.

Хотя, в любом случае я должен был сделать это раньше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <algorithm>
 
using namespace std;
 
struct byte
{
    char oldByte=0;
    char newByte=0;
    byte *left=NULL;
    byte *right=NULL;
    int freq=1;
} tempByte;
 
vector<byte> nodes;
 
bool find_match(vector<byte> &bytes, char symbol)
{
    for (auto &el: bytes)
    {
        if (el.oldByte == symbol)
        {
            el.freq++;
            return true;
        }
    }
    return false;
}
 
bool compareElem(byte first, byte second)
{
    return (first.freq > second.freq); // from higher to lower
}
 
void setNewByte(byte *node)
{
    static bitset<8> tempNewByte; // 00000000
 
    if (node->left && !node->left->newByte) // or newByte!=-1 (or isSet!=true)
    {
        tempNewByte<<=1;
        tempNewByte[0]=1;
 
        setNewByte(node->left);
    }
    else
    {
        node->newByte=(char)tempNewByte.to_ulong();
        tempNewByte>>=1;
    }
 
    if (node->right && !node->right->newByte)
    {
        tempNewByte<<=1;
        tempNewByte[0]=0;
 
        setNewByte(node->right);
    }
}
 
void printBinary(char num)
{
    int bits[8]={0}, i;
 
    for(i=7; i>=0; i--)
    {
        bits[i]=(num & 1 ? 1 : 0);
        num>>=1;
    }
 
    for(i=0; i<8; i++) cout << bits[i];
}
 
int main(int argc, char *argv[])
{
    ifstream input("/home/qpmmy/Coding/test", ios::binary);
 
    vector<byte> bytes;
    vector<byte>::iterator p;
    nodes.push_back(tempByte);
 
    if (!input)
    {
        cout << "Error while opening files. Press Enter to exit.";
        getchar();
        return 1;
    }
 
    while( (tempByte.oldByte=input.get()) != EOF )
    {
        if (!find_match(bytes, tempByte.oldByte)) bytes.push_back(tempByte);
    }
 
    for(p=bytes.end()-1; bytes.size()!=1; p=bytes.end()-1)
    {
        stable_sort(bytes.begin(), bytes.end(), compareElem);
 
        tempByte.oldByte=bytes.size()-5;
        tempByte.freq=p->freq+(p-1)->freq;
 
        nodes.insert(nodes.end(), bytes.end()-2, bytes.end());
        bytes.erase(bytes.end()-2, bytes.end());
 
        tempByte.left=&nodes[nodes.size()-2];
        tempByte.right=&nodes[nodes.size()-1];
 
        bytes.push_back(tempByte);
    }
 
    setNewByte(&bytes[0]);
 
    for(auto n: nodes)
    {
        if (!n.left)
        {
            cout << "oldByte is (" << n.oldByte << ") "; printBinary(n.oldByte); cout << endl;
            cout << "newByte is (" << n.newByte << ") "; printBinary(n.newByte); cout << endl;
            cout << "left is " << n.left << endl;
            cout << "right is " << n.right << endl;
            cout << "freq is " << n.freq << "\n\n";
        }
    }
 
    input.close();
 
    return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru