Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 12.08.2013
Сообщений: 23

Передача массива в stl::queue

27.12.2014, 17:09. Показов 1151. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Не могу разобраться с типами.
Суть: надо в stl::queue отправить массив из 8 байт, и потом из этой очереди его вытащить.

Если делаю так:
C++
1
2
3
4
std::queue<char*> serialQueue;
char byteIO[8]={0x01, 0x02, 0x00, 0x00, 0x00, 0x10,0x79, 0xc6};
serialQueue.push(byteIO);
char cmd[8]= serialQueue.front();
Выдает ошибку cannot convert 'char * &' to 'char[8]'

Если делаю так:
C++
1
2
3
4
std::queue<char*> serialQueue;
char byteIO[8]={0x01, 0x02, 0x00, 0x00, 0x00, 0x10,0x79, 0xc6};
serialQueue.push(byteIO);
char *cmd= serialQueue.front();
в cmd оказывается мусор.

Если делаю так:
C++
1
2
3
4
5
6
7
    
std::queue<AnsiString> serialQueue;
AnsiString cmdIO;
    char byteIO[8]={0x01, 0x02, 0x00, 0x00, 0x00, 0x10,0x79, 0xc6};
    cmdIO=(AnsiString)byteIO;
    serialQueue.push(byteIO);
AnsiString cmd= serialQueue.front();
то уже при конвертации в строку в cmdIO оказываются первые три байта, т.к. строка заканчивается завершающим нулем (0x00).

Если я все правильно понимаю, то косяк в объявлении очереди, а именно в её типе. Как мне быть?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2014, 17:09
Ответы с готовыми решениями:

Библиотека стандартных шаблонов (STL) queue
Добрый вечер , нужна помощь с реализацией STL шаблона queue . Задание состоит в том что нужно вывести информацию о деталях. Не могу...

STL, Queue (в очереди изменить один элемент на другой?)
Реально ли в очереди изменить один элемент на другой? Использовать другую очередь естественно разрешено и не одну, если да - подскажите...

Реализация stl-ной queue с объектами своего класса, вылетает программа
не могу разобраться, в чем проблема. необходимо реализовать очередь и запихивать туда объекты из своего класса, дело в том, что при...

6
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.12.2014, 17:12
Опиши структуру (struct) с массивом и используй.
Или используй vector.
1
0 / 0 / 1
Регистрация: 12.08.2013
Сообщений: 23
27.12.2014, 18:17  [ТС]
C++
1
2
3
std::vector<char*> serialQueue;
char byteIO[8]={0x01,0x02,0x00,0x00,0x10,0x79,0xc6};
serialQueue.push_back(byteIO);
в векторе оказываются первые три байта, как при работе со строкой...
А как через структуру сделать?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.12.2014, 18:25
Ты неправильно вектор задаёшь, просто char, без указателя.

Добавлено через 1 минуту
Ты хочешь, чтобы каждый элемент массива был отдельным элементом очереди или всё вместе как один?
0
0 / 0 / 1
Регистрация: 12.08.2013
Сообщений: 23
28.12.2014, 14:03  [ТС]
Все вместе как один, это modbus команда. Сделал так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct
{
char stBytes[8];
} qStr;
stl::queue<qStr> serialQueue;
qStr serialStr;
//почему-то когда сделал serialStr.stBytes={0x01,0x02,0x00,0x00,0x00,0x10,0x79,0xc6} компилятор заругался
serialStr.stBytes[0]=0x01;
serialStr.stBytes[1]=0x02;
serialStr.stBytes[2]=0x00;
serialStr.stBytes[3]=0x00;
serialStr.stBytes[4]=0x00;
serialStr.stBytes[5]=0x10;
serialStr.stBytes[6]=0x79;
serialStr.stBytes[7]=0xc6;
serialQueue.push(serialStr);
qStr cmdStr=serialQueue.front();
char cmd[8]=cmdStr.stBytes;
И в cmd оказались первыве три байта

Добавлено через 16 минут
Решено
Надо было просто вместо char везде написать byte:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct
{
byte stBytes[8];
} qStr;
stl::queue<qStr> serialQueue;
qStr serialStr;
serialStr.stBytes[0]=0x01;
serialStr.stBytes[1]=0x02;
serialStr.stBytes[2]=0x00;
serialStr.stBytes[3]=0x00;
serialStr.stBytes[4]=0x00;
serialStr.stBytes[5]=0x10;
serialStr.stBytes[6]=0x79;
serialStr.stBytes[7]=0xc6;
serialQueue.push(serialStr);
qStr cmdStr=serialQueue.front();
byte cmd[8]=cmdStr.stBytes;
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.12.2014, 14:22
Так попробуй:
C++
1
serialStr.stBytes={ {0x01,0x02,0x00,0x00,0x00,0x10,0x79,0xc6} };
Что касается замены char на byte, разве массивы вообще можно присваивать? Я бы применил что-нибудь типа memcpy().
0
0 / 0 / 1
Регистрация: 12.08.2013
Сообщений: 23
28.12.2014, 21:14  [ТС]
это странно, но копирование массивов работает. Может, из-за одинакового типа и размера, не знаю. Спасибо за идею со структурой)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2014, 21:14
Помогаю со студенческими работами здесь

Передача Queue, как параметра метода
Подскажите пожалуйста, как нужно писать параметр метода для коллекции Queue. К примеру коллекция Queue&lt;String&gt; q = new...

Передача параметров в методе Queue или Synchronize класса TThtread
Доброго времени суток! Пожалуйста, помогите разобраться с принципами работы лямбда функций или функторов с точки зрения потоков...

Разница между queue.synchronized и concurrent queue
По сути 2 коллекции потокобезопасные, что лучше использовать? Queue que = Queue.Synchronized(new Queue()); // или...

Разница между finalization queue и freachable queue
Всем привет, все как-то никак не могу понять, в чем разница

Переполнение Queue, методы оптимизации Queue
Доброго времени суток. Я тут планирую пенгатон взять под контроль.:- StreamReader sr = new StreamReader(road); ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru