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

bool + int + char в одну переменную

09.03.2011, 14:03. Показов 4753. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскаждите кто может, как три разных значения, к примеру : "ВАСЯ", 123, false закинуть

в область памяти, на которую указывает указатель. Я делал так:

void * p = malloc (sizeof(int)+sizeof(bool)+sizeof(char));

(int*)p=123;
p=p+4;
(char*)p="Vasya";
p=p+1;
(bool*)p=true;


Но это, все неработате, может кто-то подскажет как, и какие ошибки?
За ранее благодарен за ответ!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2011, 14:03
Ответы с готовыми решениями:

Объединение символьных типов в одну переменную (char)
Возник вопрос. Можно ли как-то объеденить несколько символьных типов к примеру, что-то...

Сложение массива типа char в одну переменную
Здравствуйте, уважаемые форумчани, помогите разобраться с такой простой задачей. Есть массив...

Можно ли преобразать переменную bool в переменную int, short. И переменную string в переменную short, int и
И переменную string в переменную short, int и т.д.

Конвертировать массив string в переменную char, либо в переменную int
помогите. ошибка вылетает в строке if (s == w), а именно "не удаётся применить индексование через...

17
Заблокирован
09.03.2011, 14:17 2
Создайте структуру "бомжик"

C++
1
2
3
4
5
6
struct outcast
{
   char* name;
   int age;
   bool money;
}Vasya;
Имя - Вася, возраст - 123, деньги - йок.
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.03.2011, 17:28 3
bigxman, union посмотри
sizeof(char) размер одного символа, а не строки к тому же
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.03.2011, 17:31 4
Цитата Сообщение от IrineK Посмотреть сообщение
Создайте структуру "бомжик"
Не совсем канает, ибо требуется ещё одна область памяти для хранения строкового значения

Цитата Сообщение от KuKu Посмотреть сообщение
bigxman, union посмотри
Ему надо хранить все три значения одновременно, а не по очереди
1
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.03.2011, 17:39 5
C++
1
2
3
4
5
6
 
char[] b="aaa";    
void* a=malloc(sizeof(int)+sizeof(bool)+strlen(b)*sizeof(char));
*((int*)a)=4;
*((bool*)(int(a)+sizeof(int)))=true;
*((char*)(int(a)+sizeof(int)+sizeof(bool)))=b;
может так, но не уверен )
0
Заблокирован
09.03.2011, 17:42 6
Тогда жестко:
C++
1
2
3
4
5
6
struct outcast
{
   char name [20];
   int age;
   bool money;
}Vasya;
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.03.2011, 17:49 7
Цитата Сообщение от KuKu Посмотреть сообщение
может так, но не уверен )
Идея понятна, но есть три ошибки:
1. strlen не учитывает хвостовой ноль.
2. Преобразование указателя к int'у - есть плохой способ программирования
3. Строку ты не скопировал, а в память поместил лишь указатель на неё

Добавлено через 1 минуту
Цитата Сообщение от IrineK Посмотреть сообщение
Тогда жестко
В частных случах такое решение сойдёт (когда ты наверняка знаешь, что есть ограничение на размер строки).

Вы пока подумайте, а потом скину одно очень хитрож..ое решение, которое тем не менее является стандартной практикой и видел во многих gnu'тых программах
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.03.2011, 17:51 8
Первое это да ... промашка вышла вышла, третье через strcopy можно(или как там копировать). А вот по второму пункту как иначе ?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.03.2011, 17:54 9
Цитата Сообщение от KuKu Посмотреть сообщение
А вот по второму пункту как иначе ?
Преобразовывать надо к char*, а не к int'у
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.03.2011, 18:16 10
Цитата Сообщение от Evg Посмотреть сообщение
Преобразовывать надо к char*, а не к int'у
А какая разница ? указатель к число преобразовывать некрасиво или инт может быть не по размеру к указателю или в другом?

C++
1
2
3
4
5
    char b[] = "aaa";
    void* a=malloc(sizeof(int)+sizeof(bool)+strlen(b)*sizeof(char));
    *((int*)a)=4;
    *((bool*)((char*)(a)+sizeof(int)))=true;
    strcpy((char*)((char*)(a)+sizeof(int)+sizeof(bool)), b);
вродь так
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.03.2011, 18:36 11
Цитата Сообщение от KuKu Посмотреть сообщение
инт может быть не по размеру к указателю
Оно самое. И он обычно не равен при компиляции 64-битного и 16-битного кода.
1
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
09.03.2011, 18:46 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
union U
{
    int i;
    char c[5];
    bool b;
};
///////////////////////////////////////////////////////////
int main()
{
    U un;
    un.i=98;
    cout<< un.i <<endl;    //98
    cout<< un.c <<endl;   //b
    cout<< un.b <<endl;   //1
}
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
09.03.2011, 19:36 13
dimon1984,
C++
1
 cout<< un.b <<endl;   //1
у меня выводит 98. (code::blocks & mingw)
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.03.2011, 19:39 14
Цитата Сообщение от Evg Посмотреть сообщение
Вы пока подумайте, а потом скину одно очень хитрож..ое решение, которое тем не менее является стандартной практикой и видел во многих gnu'тых программах
а что за способ то ?
C++
1
2
3
4
    void** a=new void*[3];
    a[0]=new int();
    a[1]=new bool();
    a[2]=new char[10];
По сути можно же или хранить в структурах(классах) или выделять самому память ... Можно еще так, но принципиально от маллока не отличается. Хотя тут хранятся указатели, а не сами переменные.
0
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
09.03.2011, 19:39 15
у меня выводит 98
как может тип bool вывести 98?
Вообще да. То я проверял на VS 6
а на VS 2008 тоже 98
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.03.2011, 19:51 16
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от KuKu Посмотреть сообщение
а что за способ то ?
Спрятал под cut, мало ли кому-то интересно покумекать. Объяснять не буду, опять-таки из тех соображений, что полезно будет самому понять

Вотъ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct str
{
  int i;
  bool b;
  char s[1];
};
 
struct str*
func (int i, bool b, const char *s)
{
  struct str *p;
 
  p = malloc (sizeof (struct str) + strlen (s));
  p->i = i;
  p->b = b;
  strcpy (p->s, s);
 
  return p;
}


Только автору не рекомендую такое показывать преподавателю, ибо средний тупой преподаватель такое не осилит, а потому не примет
5
silent_1991
09.03.2011, 19:57
  #17

Не по теме:

Evg, а смысл только в том, чтобы все данные располагались в одной непрерывной области памяти (а не раздельно, в структуре указатель на char, а сама строка отдельным куском)?

0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.03.2011, 20:02 18
Лучший ответ Сообщение было отмечено как решение

Решение

silent_1991, так удобнее. Один malloc вместо двух. Когда у тебя миллион экземпляров, это может оказаться существенным. Плюс отсутствие памяти для хранения указателя. Таким способо можно хранить не только строки, но и любые данные. Это некий вариант реализации экземпляров разной длины но одного и того же типа. Понятно, что такое будет работать только при динамическом выделении памяти
4
09.03.2011, 20:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2011, 20:02
Помогаю со студенческими работами здесь

Как достать из массива char переменные типа double, int, bool
Имеется массив char temp. в этот массив записана переменная double (начинается ,например, с temp),...

Запись двух чисел в одну переменную int
Необходимо считать два числа и при помощи логических операций записать в int двух составляющих...

Ошибка: cannot convert 'int (*)[50]' to 'int*' for argument '1' to 'void vvod2m(int*, int*, int*, char)'Х2
Матрицы An1*m1 и Bn2*m2 вводить с клавиатуры (размерности &gt;3, m1=n2). Выполнять через подпрограммы....

Надо перевести переменную типа unsigned char* в signed int и обратно
у меня есть переменная типа unsigned char*, мне нужно перевести ее в signed int , провести...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru