Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Gimer
1 / 1 / 0
Регистрация: 18.01.2009
Сообщений: 17
#1

Хранение в массиве данных разного типа - C++

14.04.2009, 01:44. Просмотров 1980. Ответов 10
Метки нет (Все метки)

Доброго времени суток. Возникла задача:
Имеем массив byte buffer[100], а также переменные char ch1,ch2; int x1,x2,y1,y2;
Нужно записать в ch1,x1,y1 в массив buffer и считать их из него в переменные ch2,x2,y2. С ch1 и ch2 то все просто, так как они занимают 1 байт, а вот как поступать с четырехбайтовыми x1,x2,y1,y2 ума не приложу. Готов рассмотреть разные варианты разные варианты, если такие есть
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2009, 01:44     Хранение в массиве данных разного типа
Посмотрите здесь:

Определения знака переменных разного типа C++
C++ Используя перегрузку функций, написать программу определения максимального значения элемента массива разного типа
C++ Хранение типа данных в переменной
C++ Использование принципов ООП для поиска в файлах разного типа
C++ Массив указателей на функции, возвращающие значения разного типа
C++ Можно ли в цикле for объявить две переменных разного типа?
Сортировка массивов разного типа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
14.04.2009, 01:54     Хранение в массиве данных разного типа #2
А так:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
    char c;
    int i = 4;
    c = i;
    cout<< (int)c <<endl;//out 4..
    return 0;
}
Gimer
1 / 1 / 0
Регистрация: 18.01.2009
Сообщений: 17
14.04.2009, 02:13  [ТС]     Хранение в массиве данных разного типа #3
Цитата Сообщение от ISergey Посмотреть сообщение
А так:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
    char c;
    int i = 4;
    c = i;
    cout<< (int)c <<endl;//out 4..
    return 0;
}
Не вижу тут массива. Значение переменной "c" урезается из-за того что размер char 1 байт, а int 4 байта. Попробуй тут поставь i=400, на экране отобразится "-112"
Gravity
558 / 552 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
14.04.2009, 02:25     Хранение в массиве данных разного типа #4
Можно разделить 4-байтный int на 4 ячейки по 1 байту и писать в массив. Поразрядные операции должны помочь.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.04.2009, 02:27     Хранение в массиве данных разного типа #5
Gimer, ты можешь буфер сделать не на byte, а на int и записывать туда char'ы
а вообще для таких случаев (когда в одном месте нужно хранить разные типы) юзают union, получится массив union'ов, где каждый union будет иметь размер самого большего типа в нём

когда char в int записываешь, если он отрицательный, то в int'е все левые биты заполнятся еденицами, потом при присваивании они отбросятся, но эти отбрасывания вроде не определены (то есть происходить-то они происходят, но вот будет ли так везде и всегда - неизвестно)
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
14.04.2009, 02:30     Хранение в массиве данных разного типа #6
Ну а вы что хотели в один символ строку впехнуть?!(не путайте)
для строки так нужно(примерно)
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
#include <iostream>
using namespace std;
 
void int_to_char(/*out string*/ char *str,  /* in data*/int number)
{
    unsigned len = 0;
    bool negative = false;
 
    if (number < 0)
    {
        number *= -1;
        negative = true;
    }
    char tmpbuf[16];
    tmpbuf[15] = 0x0;// '\0'
    unsigned idx = 15;
    if (!number)
    {
        tmpbuf[14] = '0';
        str[0] = tmpbuf[14];
                      return;
    }
 
    while(number && idx)
    {
        --idx;
        tmpbuf[idx] = (char)('0' + (number % 10));
        number /= 10;
        ++len;
    }
 
    if (negative)
    {
        --idx;
        tmpbuf[idx] = '-';
        ++len;
    }
    ++len;
    for(unsigned l = 0; l < len; ++l)
        str[l] = tmpbuf[idx + l];
}
int main()
{
    int x = -123456;
    char *str = new char[16];
 
    int_to_char(str,x);
    cout<<str<<endl;
 
    delete[] str;
 
    return 0;
}
Gimer
1 / 1 / 0
Регистрация: 18.01.2009
Сообщений: 17
14.04.2009, 03:34  [ТС]     Хранение в массиве данных разного типа #7
Цитата Сообщение от Gravity Посмотреть сообщение
Можно разделить 4-байтный int на 4 ячейки по 1 байту и писать в массив. Поразрядные операции должны помочь.
Была такая мысль, но код на то чтобы записать даже одно число в массив получается громоздким, а о том чтобы его прочесть из массива обратно я вообще не говорю
Цитата Сообщение от accept Посмотреть сообщение
Gimer, ты можешь буфер сделать не на byte, а на int и записывать туда char'ы
а вообще для таких случаев (когда в одном месте нужно хранить разные типы) юзают union, получится массив union'ов, где каждый union будет иметь размер самого большего типа в нём

когда char в int записываешь, если он отрицательный, то в int'е все левые биты заполнятся еденицами, потом при присваивании они отбросятся, но эти отбрасывания вроде не определены (то есть происходить-то они происходят, но вот будет ли так везде и всегда - неизвестно)
Идея того чтобы делать буффер не byte а int не подходящая так как в дальнейшем в buffer может храниться не только int но и float, long int и даже строки.

На счет union'ов, у меня программа клиент-сервер тоесть я на клиенте отсылаю серверу данный массив в котором записан 1 char и 2 int'a, и потом на сервере разбираю эту кучу(Отсылаемый массив должен быть равен 1+4+4=9 байтов). Но по моему при использовании union'ов не гарантируется что сервер их правильно прочитает, поскольку порядок следования данных в нем нигде не зафиксирован.
Цитата Сообщение от ISergey Посмотреть сообщение
Ну а вы что хотели в один символ строку впехнуть?!(не путайте)
не в один символ а в массив.

Неужели нет простых функций для работы с такими массивами, вот например как в нетипзированных файлах просто указываем тип переменной, записываем в файл, указываем другой тип переменной, записываем в этот же файл и т.д.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.04.2009, 05:25     Хранение в массиве данных разного типа #8
вот пример использования memcpy

union отвечает за правильное выравнивание (что будет прочитано обратно именно то, что записалось, и так для каждого типа в объединении)
Вложения
Тип файла: zip memcpy_float.zip (521 байт, 37 просмотров)
Gimer
1 / 1 / 0
Регистрация: 18.01.2009
Сообщений: 17
14.04.2009, 14:16  [ТС]     Хранение в массиве данных разного типа #9
Цитата Сообщение от accept Посмотреть сообщение
вот пример использования memcpy

union отвечает за правильное выравнивание (что будет прочитано обратно именно то, что записалось, и так для каждого типа в объединении)
Спасибо, memcpy действительно помог
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
14.04.2009, 14:35     Хранение в массиве данных разного типа #10
можно еще так
C++
1
2
new(&buffer[i]) int(x1);
x2=*(int*)(&buffer[i]);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2009, 23:18     Хранение в массиве данных разного типа
Еще ссылки по теме:

Написать программу определения знака переменных разного типа C++
Объединить данные разного типа в векторе C++
Создать функцию prompt и перегрузить её для параметра разного типа C++
C++ Реализовать сортировку и поиск данных в массиве структур типа School
C++ Реализовать сортировку и поиск данных в массиве структур типа School

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

Или воспользуйтесь поиском по форуму:
Mecid
678 / 227 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
14.04.2009, 23:18     Хранение в массиве данных разного типа #11
Цитата Сообщение от accept Посмотреть сообщение
Gimer, ты можешь буфер сделать не на byte, а на int и записывать туда char'ы
вот...вот....char можно в инте хранить но не наоборот
Yandex
Объявления
14.04.2009, 23:18     Хранение в массиве данных разного типа
Ответ Создать тему
Опции темы

Текущее время: 08:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru