Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
1

Инкремент byte и увеличение на 2

04.05.2015, 14:07. Просмотров 657. Ответов 11
Метки нет (Все метки)

Добрый день.
Есть массив
C++
1
BYTE Counter[4]  = { 0x00, 0x00, 0x00, 0x01 };
Мне необходимо инкрементировать последний элемент. Я пишу.
C++
1
Counter[3] += 0x01;
или
C++
1
Counter[3] ++;
А мне в ответ возвращается 00 00 00 04, если инкрементировать так много раз, то не по единице увеличивается, а по 2.
В чем может быть дело?
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2015, 14:07
Ответы с готовыми решениями:

Не работает инкремент
repeat: if(e<=mode){ cout << "\nИгрок №" << e << a << endl; ...

Инкремент структуры.
Всем привет. Мне нужно инкремент структуры, чтобы прочитать её дальше. Вот код:...

Инкремент и преинкремент
Здравствуйте. Я вот решил протестить в чем разница между инкрементом и...

Инкремент ссылки
int arr = {....} ; while(arr) // arr ссылка на начало массива то есть на 0...

Инкремент в рекурсии
Ребят, что-то не могу врубиться. Задача: используя рекурсию выводить введенный...

11
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
04.05.2015, 14:19 2
Цитата Сообщение от Костяныч Посмотреть сообщение
В чем может быть дело?
Явно не в этом коде.
Покажи как выводишь хотя бы.
0
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.05.2015, 14:28  [ТС] 3
DrOffset, там это дело присваивается ссылке, далее в Variant, из var в string для вывода на экран. Но я не думаю, что в этом дело.
0
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
04.05.2015, 14:30 4
Цитата Сообщение от Костяныч Посмотреть сообщение
Но я не думаю, что в этом дело.
Т.е. ты скорее поверишь в то, что BYTE неправильно инкрементируется, чем в то, что у тебя в программе может быть ошибка? Самоуверенно как-то слишком, не находишь?

Цитата Сообщение от Костяныч Посмотреть сообщение
там это дело присваивается ссылке, далее в Variant, из var в string для вывода на экран.
Вот и показывай это все.
0
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.05.2015, 14:32  [ТС] 5
А точнее так происходит по итерациям:
1) 00 00 00 01
2) 00 00 00 02
3) 00 00 00 04
4) 00 00 00 06
....
А если +=0x02 поставить, то
1) 00 00 00 01
2) 00 00 00 03
3) 00 00 00 07
4) 00 00 00 0A
...
0
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
04.05.2015, 14:39 6
Костяныч, это симптом, а не причина. Берем простой код, запускаем его и видим, что все нормально. Ошибка не в инкременте.
0
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.05.2015, 14:39  [ТС] 7
Ok
ClassOne.h
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
        BYTE Counter[4]  = { 0x00, 0x00, 0x00, 0x01 };
 
        HRESULT function(BYTE*& pBuffer)
    {   
        InxtementCounter();
        pBuffer = Counter;
 
        return S_OK;
    }
 
    HRESULT InxtementCounter() 
    {
        if (Counter[3] != 0xFF) Counter[3] += 0x01;
        else if (Counter[2] != 0xFF) {
            Counter[3] = 0x00;
            Counter[2]++;
        }
        else if (Counter[1] != 0xFF) {
            Counter[3] = 0x00;
            Counter[2] = 0x00;
            Counter[1]++;
        }
        else if (Counter[0] != 0xFF) {
            Counter[3] = 0x00;
            Counter[2] = 0x00;
            Counter[1] = 0x00;
            Counter[0]++;
        }
 
        return S_OK;
    }
ClassTwo.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
STDMETHODIMP ClassTwo::MainFunction(VARIANT* pVal)
{
    BYTE* pBuff = NULL;                     //Added
    ClassOne ClOne(Tags);
    ClOne.function(pBuff);
 
    _variant_t var;                 //осуществляет необходимые вызовы функций VariantInit и VariantClear
    var.vt = VT_ARRAY | VT_UI1;
 
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].cElements = 16;
    rgsabound[0].lLbound = 0;
 
    var.parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
 
    void * pArrayData = NULL;
    SafeArrayAccessData(var.parray, &pArrayData);
    memcpy(pArrayData, pBuff, 16);
    SafeArrayUnaccessData(var.parray);
    *pVal = var.Detach();
 
    return S_OK;
}
Ну и далее я этот pVal вывожу на экран, могу далее продолжить, как я это делаю, если тут все понятно и нет сомнений.
0
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
04.05.2015, 14:48 8
Костяныч, вопросы:
Counter - переменная класса ClassOne?
Цитата Сообщение от Костяныч Посмотреть сообщение
memcpy(pArrayData, pBuff, 16);
Почему здесь ты копируешь 16 байт, хотя в pBuff указатель только на 4?
0
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.05.2015, 14:51  [ТС] 9
DrOffset,
Counter - переменная класса ClassOne.
Надо было не 16, а 4 байта поставить (12 байт для другого дела использую). Там первые 4 мой Count, остальные 12 мусор, не критично.
0
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
04.05.2015, 14:57 10
Костяныч, так, ладно. Показывай вывод тогда. Здесь вроде бы все чисто (за исключением 16ти байт).
1
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.05.2015, 15:00  [ТС] 11
Ну и потом этот variant кидаем в эту функцию
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static string ByteArrayToHexString(byte[] bytes)
    {
      var result = new StringBuilder(bytes.Length * 2);
      const string hexAlphabet = "0123456789ABCDEF";
      foreach (var b in bytes)
      {
        result.Append(hexAlphabet[b >> 4]);
        result.Append(hexAlphabet[b & 0xF]);
        result.Append(' ');
      }
      
      return result.ToString();
    }
Ответ ложем в MessageBox. Все.

Добавлено через 32 секунды
В выводе все правильно, можно не смотреть.
0
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
04.05.2015, 15:26 12
Костяныч, Ну и тут похоже ошибок нет.
Итого, что мы имеем: фрагменты кода, который ты уже привел, ошибок не содержат (кроме той, с 16ю байтами).
Значит ошибка в том коде, который ты не показал. Либо ошибка в логике работы, что-то выполняется не так, как ты того ожидаешь.
Пока что больше нечего добавить. Нужно видеть всю картину, чтобы оценить, а не отрывками.
1
04.05.2015, 15:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2015, 15:26

Инкремент указателя
#include <iostream> using namespace std; class Student { public: ...

Инкремент в произведении
Друзья, на ерунде запнулся, допустим: n = 2000; тогда в какой...

Инкремент(Декремент)
Есть ли разница,какую употреблять форму:префиксную или постфиксную? Если на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru