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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
bigxman
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 10
#1

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

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

Подскаждите кто может, как три разных значения, к примеру : "ВАСЯ", 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;


Но это, все неработате, может кто-то подскажет как, и какие ошибки?
За ранее благодарен за ответ!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2011, 14:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос bool + int + char в одну переменную (C++):

Сложение массива типа char в одну переменную - C++
Здравствуйте, уважаемые форумчани, помогите разобраться с такой простой задачей. Есть массив char Arr={'1','a','3','b','5','c'}....

Надо перевести переменную типа unsigned char* в signed int и обратно - C++
у меня есть переменная типа unsigned char*, мне нужно перевести ее в signed int , провести арифметические вычисления и затем перевести ее...

Реализация функции char *padl(const char *string, int len, int c=' ') - C++
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

Как превести из char* в int и наоборот из int в char*? - C++
Как превести из char* aa='123' в int aa=123 и наоборот из int в char* . Понимаю что самому написать функцию не сложно, но наверняка это...

Форматирование строк, char to int & int to char - C++
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот всё просто в pawn str_to_num(const str) // Тупо...

Есть переменная типа char содержащая цифру; как записать это значение в переменную типа int? - C++
Пожалуйста, напомните стандартную функцию

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IrineK
Заблокирован
09.03.2011, 14:17 #2
Создайте структуру "бомжик"

C++
1
2
3
4
5
6
struct outcast
{
   char* name;
   int age;
   bool money;
}Vasya;
Имя - Вася, возраст - 123, деньги - йок.
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
09.03.2011, 17:28 #3
bigxman, union посмотри
sizeof(char) размер одного символа, а не строки к тому же
Evg
Эксперт CАвтор FAQ
17627 / 5851 / 376
Регистрация: 30.03.2009
Сообщений: 16,137
Записей в блоге: 26
09.03.2011, 17:31 #4
Цитата Сообщение от IrineK Посмотреть сообщение
Создайте структуру "бомжик"
Не совсем канает, ибо требуется ещё одна область памяти для хранения строкового значения

Цитата Сообщение от KuKu Посмотреть сообщение
bigxman, union посмотри
Ему надо хранить все три значения одновременно, а не по очереди
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
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;
может так, но не уверен )
IrineK
Заблокирован
09.03.2011, 17:42 #6
Тогда жестко:
C++
1
2
3
4
5
6
struct outcast
{
   char name [20];
   int age;
   bool money;
}Vasya;
Evg
Эксперт CАвтор FAQ
17627 / 5851 / 376
Регистрация: 30.03.2009
Сообщений: 16,137
Записей в блоге: 26
09.03.2011, 17:49 #7
Цитата Сообщение от KuKu Посмотреть сообщение
может так, но не уверен )
Идея понятна, но есть три ошибки:
1. strlen не учитывает хвостовой ноль.
2. Преобразование указателя к int'у - есть плохой способ программирования
3. Строку ты не скопировал, а в память поместил лишь указатель на неё

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

Вы пока подумайте, а потом скину одно очень хитрож..ое решение, которое тем не менее является стандартной практикой и видел во многих gnu'тых программах
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
09.03.2011, 17:51 #8
Первое это да ... промашка вышла вышла, третье через strcopy можно(или как там копировать). А вот по второму пункту как иначе ?
Evg
Эксперт CАвтор FAQ
17627 / 5851 / 376
Регистрация: 30.03.2009
Сообщений: 16,137
Записей в блоге: 26
09.03.2011, 17:54 #9
Цитата Сообщение от KuKu Посмотреть сообщение
А вот по второму пункту как иначе ?
Преобразовывать надо к char*, а не к int'у
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
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);
вродь так
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
09.03.2011, 18:36 #11
Цитата Сообщение от KuKu Посмотреть сообщение
инт может быть не по размеру к указателю
Оно самое. И он обычно не равен при компиляции 64-битного и 16-битного кода.
dimon1984
40 / 38 / 0
Регистрация: 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
}
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
09.03.2011, 19:36 #13
dimon1984,
C++
1
 cout<< un.b <<endl;   //1
у меня выводит 98. (code::blocks & mingw)
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
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];
По сути можно же или хранить в структурах(классах) или выделять самому память ... Можно еще так, но принципиально от маллока не отличается. Хотя тут хранятся указатели, а не сами переменные.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
09.03.2011, 19:39 #15
у меня выводит 98
как может тип bool вывести 98?
Вообще да. То я проверял на VS 6
а на VS 2008 тоже 98
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 19:39
Привет! Вот еще темы с ответами:

Подскажите пожалуйста с int main(int argc, char*argv[]) - C++
Если я правильно понимаю, то int argc это передача аргумента программе, т. е если argc&gt;1 то программе передан хотя бы один аргумент, если...

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*) - C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа Помогите...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

Типы bool и int - C++
Зачем использовать тип bool если можно сделать тоже самое с помощью типа int Например объявляем переменую типа int если ее значение равно...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.03.2011, 19:39
Ответ Создать тему
Опции темы

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