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

Преобразовать int в char

26.12.2016, 13:59. Показов 2989. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, пытаюсь разобраться с типами данных
Интересует конвертация массива int в массив char

уже часа с полтора сижу, постоянно какой либо варнинг присутствует, либо ошибка

Для начала первый варнинг:

C++
1
2
3
char* int2char(int* request[]) {
   char answer[sizeof(request)]; // вот тут
}
говорит что warning: 'sizeof' on array function parameter 'request' will return size of 'int**'
как то можно нормально получить размер массива ?

пример массива:
C++
1
int data[2][12] = {{ 0x01, 0x10, 0xDC, 0x5E, 0x81 }, { 0x11, 0x10, 0xDF, 0x55, 0x03, 0x88, 0xFE, 0x01, 0xC3, 0x8F, 0x8A, 0x7C }};
и сопутствующий вопрос, как то можно создать массив не фиксированной длины ? т.е. чтоб в data[0] байты после 0x81 не заполнялись нулями, а просто такого индекса как data[0][5] - вообще не существовало ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2016, 13:59
Ответы с готовыми решениями:

Преобразовать int в char *
Есть какое-то целое число. Допустим 12451243. Его необходимо преобразовать в строку. У меня есть поле TenString (десят. строка),...

Как преобразовать int в char
Подскажите пожалуйста как преобразовать int в char Есть код к примеру: #include<iostream> using namespace std; int main(){ ...

Как преобразовать int в char?
Прошу подсказать, как же все-таки преобразовывать int в char?

11
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
26.12.2016, 14:04
V2oD2o, в первом случае у вас значение будет равно 4 байтам на 32 разрядной машине и 8 на 64, т.к вы передаёте сайзоф указателя на указатель, размер нужно передавать в функцию вместе с массивом или использовать контейнеры.
Другой вопрос непонятен, выразитесь точнее
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.12.2016, 14:07
Цитата Сообщение от V2oD2o Посмотреть сообщение
говорит что warning: 'sizeof' on array function parameter 'request' will return size of 'int**'
Вы пытаетесь узнать размер указателя.
Цитата Сообщение от V2oD2o Посмотреть сообщение
как то можно нормально получить размер массива ?
Хранить его в отдельной переменной.
Цитата Сообщение от V2oD2o Посмотреть сообщение
а просто такого индекса как data[0][5] - вообще не существовало ?
Статический массив - нельзя. Можно извернуться на контейнерах, но в общем случае надо исходить из условий задачи. В С++ массивы устроены по другому, нежели, например, в JavaScript.
0
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
26.12.2016, 14:12  [ТС]
Цитата Сообщение от obivan Посмотреть сообщение
Другой вопрос непонятен, выразитесь точнее
C++
1
int data[2][12] = {{ 0x01, 0x10, 0xDC, 0x5E, 0x81 }, { 0x11, 0x10, 0xDF, 0x55, 0x03, 0x88, 0xFE, 0x01, 0xC3, 0x8F, 0x8A, 0x7C }};
вот массив, объявлен размер 2х12, т.е. 12 символов в строке, строк - 2

первая строка будет выведена:
0x01, 0x10, 0xDC, 0x5E, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

вместо:
0x01, 0x10, 0xDC, 0x5E, 0x81

вторая:
0x11, 0x10, 0xDF, 0x55, 0x03, 0x88, 0xFE, 0x01, 0xC3, 0x8F, 0x8A, 0x7C

т.е. мне нужен массив в котором будет запрос и ответ от устройства висящем на COM порте, длина запроса и ответа - разная, плодить тонну запрос\ответ отдельными массивами - не гуд имхо

вот хочу для начала один запрос\ответ сделать как массив, затем все запросы и ответы сделать как единый массив или класс - но надо понять с начала самые азы )

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
Статический массив - нельзя. Можно извернуться на контейнерах, но в общем случае надо исходить из условий задачи. В С++ массивы устроены по другому, нежели, например, в JavaScript.
Хм, я как раз "припёрся" к вам в эту ветку из php\js
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
26.12.2016, 14:12
V2oD2o, если возможности позволяют то храните вот так
C++
1
std::vector<std::string> myArray;
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.12.2016, 14:30
Цитата Сообщение от V2oD2o Посмотреть сообщение
первая строка будет выведена:
Сколько бы полей вы не инициализировали, размер обычного статического массива будет константным. Вы объявили набор из двух строк по 12 элементов в каждой. При использовании списка инициализации массива, все не инициализированные явно элементы заполняются нулями.
Вам нужен набор из динамических массивов, которые реализуются с помощью стандартного класса std::vector.
http://www.cplusplus.com/reference/vector/
Данный контейнер ведёт себя немного иначе, чем "обычный массив из PHP".
Вообще, стоит приготовиться к большому количеству проблем т.к. языки PHP и С++ диаметрально противоположные.
Советую приготовиться к чтению мануалов и принятию противоположной философии. Наверное, один из немногих случаев, когда лучше "забыть что вы знали до этого".

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> data[2] = {{ 0x01, 0x10, 0xDC, 0x5E, 0x81 }, { 0x11, 0x10, 0xDF, 0x55, 0x03, 0x88, 0xFE, 0x01, 0xC3, 0x8F, 0x8A, 0x7C }};
    // перебираем строки массива из двух элементов. Каждый элемент - "строка", набор элементов типа int произвольной длины
    for (int i=0; i < 2; i++)
    {
        // используем for цикл по коллекции. В PHP и JS он давно есть, так что думаю тут проблем с пониманием не выйдет
        for (const auto x : data[i])
            // используем флаги для манипуляции с потоками (hex выводит числа в 16-ричной форме, showbase заставляет добавлять 0x)
            std::cout << std::hex << std::showbase << x << " "; // выводим каждый элемент на экран
        std::cout << std::endl; // перевод строки
    }
}
Добавлено через 21 секунду
http://rextester.com/PDR2468
1
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
26.12.2016, 16:10  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Шаолинь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    bool ReadCOM(char cmd[], int countRequest, int countAnswer) {
        int i;
        DWORD iSize;
        char sReceivedChar;
        char answer[countRequest] = ""; // Если тут убрать = "", то мусор уже изначально там есть
        if (countAnswer>0) {
            for (i=0;i<=countAnswer;i++) {
                ReadFile(COMPort, &sReceivedChar, 1, &iSize, 0);
                if (countRequest>=i) { answer[i]=sReceivedChar; cout << answer << "\n";  }
            }
        } 
        cout << answer << " = " << strlen(answer) << "\n";
        cout << cmd << " = " << strlen(cmd) << "\n";
        if (answer==cmd) { return true; } else { return false; }
    };
Запрос функции выглядит так:
C++
1
cout << COMEngine.ReadCOM(COMEngine.startCommunication, 4, 11);
startCommunication в классе COMEngine:
C++
1
char startCommunication[5] = { '\x81', '\x10', '\xF1', '\x81', '\x03' };
суть - есть запрос и есть ответ от устройства, как проверка "правильности" ответа - в него в начале (в ответе от устройства) засовывается запрос, далее байты уже каких либо данных

т.е. запрос = 00 01 02 03
удачный ответ будет выглядеть так - 00 01 02 03 DE 7C B2 F1

т.е. на этапе заполнения answer, я вывожу в консоль что записалось..
и, почему то, массив наполняется мусором.. и длина его становится не 5, как он создан, а уже 7 байт..
Изображения
 
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.12.2016, 16:19
Цитата Сообщение от V2oD2o Посмотреть сообщение
if (answer==cmd)
Распространенные ошибки
Я же говорю,
Цитата Сообщение от MrGluck Посмотреть сообщение
стоит приготовиться к большому количеству проблем т.к. языки PHP и С++ диаметрально противоположные.
Нельзя просто так взять и сравнить два char массива.
И стоит помнить про ноль символ в конца строки.
1
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
26.12.2016, 16:58  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Я же говорю
Поковырялся, кое что подправил, но все равно не пойму откуда мусор берется..
Полученный символ выводится в консоль, то что сейчас в массиве тоже выводится в консоль, и собственно результат тоже в консоль..

добавляется как указано выше - answer[i]=sReceivedChar;

см скриншот
Изображения
 
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.12.2016, 17:03
В чём проблема?
Попробуйте выводить коды символов (при выводе кастуете в int).
0
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
26.12.2016, 17:18  [ТС]
-127, 16, -15, -127, 3

я что то запутался ASCII табличка оказывается не 0..255, а -127..127 ?
т.к. все что за 127, оно уже идет как минусовое значение кода

чтоб получить нужный символ из отрицательного кода, то -127+256=129 - код символа "Б"

а проблема в том что хз откуда взялись символы квадрат и скобка - два последних, и почему длина массива 7, а не 5 как создано?

ваще ничего не понял!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
26.12.2016, 20:12
Цитата Сообщение от V2oD2o Посмотреть сообщение
я что то запутался ASCII табличка оказывается не 0..255, а -127..127 ?
Это зависит от того как интерпретируется знаковый бит.
-127 и 129 в восьмибитной разрядной сетке имеет одно и то же представление - 10000001.

Добавлено через 5 минут
Цитата Сообщение от V2oD2o Посмотреть сообщение
и почему длина массива 7, а не 5 как создано?
Длина массива 5 байт. Функция strlen ничего ни про какие массивы не знает, она просто сканирует данную ей по указателю последовательность байт на предмет нуль-символа. Если этот самый нуль-символ отсутствует в выделенных 5 байтах, то она как ни в чём не бывало идет за пределы массива, до тех пор, пока ноль не встретит. В твоем случае это случилось на 7м байте от начала последовательности, а могло и вообще не случиться, и перебирала бы функция байты до тех пор, пока бы программа AV не словила, что неизменно закончилось бы ее крахом. Это не значит, что массив увеличился. Это значит, что в отсутствие нуля в выделенном диапазоне (5 байт) ты получил некорректную программу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.12.2016, 20:12
Помогаю со студенческими работами здесь

Как int преобразовать в char?
простите за глупый вопрос)) но у меня есть какое нибудь int x=1234 к примеру, как преобразовать это число в char s=&quot;1234&quot;

Как преобразовать Int в char*?
Доброго времени суток. У меня есть переменная int, в которой однозначное число, как его преобразовать в char*?

Число int в десятичной преобразовать в char - двоичной
Помогите пожалуйста. Ситуация похожа, код прилагается - нужно число int в десятичной преобразовать в char - двоичной, совсем запутался в...

Невозможно преобразовать параметр из int в const char
Приветствую, помогите пожалуйста исправить следующую ошибку: printf: невозможно преобразовать параметр 1 из &quot;int&quot; в &quot;const...

Преобразовать число int в строку прописью char
Например, вводим 40, 3 должно выдать sorok rubley tridcat kopeek. Пересмотрел много задач с похожей тематикой, но во-первых, ни одна не...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта 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 позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru