Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2

Массив памяти (стек). Определение переменной из данной памяти

11.10.2024, 10:30. Показов 1116. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Стоит задача организовать память и из нее выделять переменные для дальнейшего использования.
Массив Char[N]. Переменные могут быть bool,Word,DWord, Float.

пример дальнейшего использования

bool B_1;
word variable_w1;

B_1 = true;
variable_w1 = 10;

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.10.2024, 10:30
Ответы с готовыми решениями:

Стек, куча, хранение в памяти, динамическое выделение памяти, указатели в чем отличие?
Здравствуйте. Прочитал кучу определений но никак не пойму вообще что к чему. 1)Стек - это якобы кусок оперативной памяти который...

Определение объема памяти занимаемой переменной
как определить сколько памяти занимает переменная?

В поле дампа памяти вывести на экран содержимое данной памяти [bx+di]
Имеется функция IDIV word ptr . Но предварительно мы записываем значение в данную область памяти т.е mow ,0005. вопрос,как мне в поле...

8
Заблокирован
11.10.2024, 11:46
Судая по картинке, bool будет занимать два байте?

Цитата Сообщение от maximus1991 Посмотреть сообщение
Стоит задача организовать память и из нее выделять переменные для дальнейшего использования.
С этим отлично справляется компилятор.

Добавлено через 3 минуты
И почему в одном байте вдруг 9 битов ?

Добавлено через 1 минуту
Вы же понимаете что архитектура подавляющего большинства ПК позволяет адресовать лишь байт ?
0
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
11.10.2024, 14:21  [ТС]
Да там ошибка.извините. 0-7 должно быть.
На си организовывал через union. Битовый массив приходилось создавать отдельно.
Пример на си
C
1
2
3
4
5
6
7
8
9
10
11
12
#define N 8
union ram
{
 uint8_t byte[N*2];
 uint16_t word [N];
 uint32_t Dword[N/2];
 float Real[n/2];
} 
 ram buffRam;
 
#define var1 buffRam.word[0];
#define var2 buffRam.Dword[1];
0
97 / 73 / 27
Регистрация: 30.03.2023
Сообщений: 201
11.10.2024, 15:14
Эм...
Во-первых, разве решение через union не работает на С++?
Во-вторых, оно неверно, т.к. не дает строку 10 из примера - в юнионе все поля лежат в одном куске памяти, а не друг за другом.
Чем тебя placement new не устраивает?

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
using namespace std;
 
int main()
{
  unsigned char* pBuff = new unsigned char[ 512 ];
  size_t offset = 0;
  int* a = new( pBuff + offset ) int;
  offset += sizeof( int );
  double* b = new( pBuff + offset ) double;
  offset += sizeof( double );
  char* c = new( pBuff + offset ) char;
  offset += sizeof( char );
  *a = 12;
  *b = 0.25;
  *c = 'x';
  cout << "Values:\n";
  cout << *a << endl << *b << endl << *c << endl;
  cout << "Adresses:\n";
  cout << a << endl << b << endl << (void*)c << endl;
  cout << "Sizes:\n";
  cout << (unsigned)b - (unsigned)a << endl << (unsigned)c - (unsigned)b << endl;
  cout << "Available " << (unsigned)( pBuff + 511 ) - (unsigned)c << " bytes\n";
  delete[] pBuff;
  return 0;
}
Добавлено через 7 минут
Добавил чутка шаблонов:

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
#include <iostream>
using namespace std;
 
template< typename T >
T* allocate( unsigned char* pBuffer, size_t& offset )
{
  T* pRes = new( pBuffer + offset )T;
  offset += sizeof( T );
  return pRes;
}
 
int main()
{
  unsigned char* pBuff = new unsigned char[ 512 ];
  size_t offset = 0;
  int* a = allocate< int >( pBuff, offset );
  double* b = allocate< double >( pBuff, offset );
  char* c = allocate< char >( pBuff, offset );
  *a = 12;
  *b = 0.25;
  *c = 'x';
  cout << "Values:\n";
  cout << *a << endl << *b << endl << *c << endl;
  cout << "Adresses:\n";
  cout << a << endl << b << endl << (void*)c << endl;
  cout << "Sizes:\n";
  cout << (unsigned)b - (unsigned)a << endl << (unsigned)c - (unsigned)b << endl;
  cout << "Available " << (unsigned)( pBuff + 511 ) - (unsigned)c << " bytes\n";
  delete[] pBuff;
  return 0;
}
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
11.10.2024, 15:45
leproza, на картинку посмотрите, там выравнивание двухбайтовое
0
97 / 73 / 27
Регистрация: 30.03.2023
Сообщений: 201
11.10.2024, 19:58
Annemesski,
Да, проглядел. Но для этого достаточно offset округлять
0
 Аватар для sporta1982
211 / 56 / 7
Регистрация: 05.10.2023
Сообщений: 474
12.10.2024, 06:57
я человек темный , я пытался это запихать в Visual Studio , но маленькую n вы не заметили.

Добавлено через 31 минуту
да еще ; после завещающей юнион} , да еще какое то двухбайтовое выравнивание, то в одной области лежат, короче темнота
0
 Аватар для sporta1982
211 / 56 / 7
Регистрация: 05.10.2023
Сообщений: 474
12.10.2024, 15:40
да мне да кул хацкеров далеко,но так то

C++
1
2
3
4
char a = 1;                           /// 01 00 00 00 b4 05
uint32_t b = 1;                    ///  01 00 00 00 16
uint64_t c = 3;                    /// 03 00 00 00 00 00 00 00 00 00 00 00 78 02 0
printf("%d %d,%d,a,b,c");
кто знает тот поймет, кому не надо и не надо
0
Заблокирован
12.10.2024, 19:13
Я вообще в шоке зачем такое делать на С++.
Брал с этого примера. Но убрал использование штатной функции выравнивания.
А значит будет скорее всего непереносимо.
Брал пример отсюда ▼▼▼▼▼
std::align

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <memory>
#include <bitset>
#include <climits>
#include <cstdint>
 
template<std::size_t N>
struct MyAllocator
{
    static constexpr const std::size_t align_to = 2;
    char data[N]{}; // cleared for visual effect
    static_assert(N%align_to == 0);
    void* p;
    std::size_t sz;
    MyAllocator() : p(data), sz(N) {}
    template<typename T>
    T* aligned_alloc()
    {
        std::size_t a = (sizeof(T) % align_to);
        if (sz >= a + sizeof(T))
        {
            p   = (char*)p + a;
            sz -= a;
            T* result = reinterpret_cast<T*>(p);
            p = (char*)p + sizeof(T);
            sz -= sizeof(T);
            return result;
        }
        return nullptr;
    }
    std::string bin_dump(){
      std::string res;
      for(std::size_t i = 0; i != N; ++i){
         (res += std::bitset<CHAR_BIT>(*(data+i)).to_string()) += ' ';
      }
      return res; 
    }
};
 
int main()
{
    constexpr size_t N{12};
    MyAllocator<N> a;
    using BOOL  = bool;
    using WORD  = uint16_t;
    using DWORD = uint32_t;
    using FLOAT = float;
 
    std::cout << "allocated a.data at " << (void*)a.data
              << " (" << sizeof a.data << " bytes)\n";
 
    // allocate a char
    if (WORD* p = a.aligned_alloc<WORD>())
    {
        *p = 1;
        std::cout << "allocated a WORD at " << (void*)p << '\n';
        std::cout << *p << std::endl;
    }
 
    // allocate an int
    if (DWORD* p = a.aligned_alloc<DWORD>())
    {
        *p = 5;
        std::cout << "allocated an DWORD at " << (void*)p << '\n';
        std::cout << *p << std::endl;
    }
    // allocate an int, aligned at 32-byte boundary
    if (BOOL* p = a.aligned_alloc<BOOL>())
    {
        *p = true;
        std::cout << "allocated an BOOL at " << (void*)p << '\n';
        std::cout << *p << std::endl;
    }
    // allocate an int, aligned at 32-byte boundary
    if (FLOAT* p = a.aligned_alloc<FLOAT>())
    {
        *p = 1.1;
        std::cout << "allocated an FLOAT at " << (void*)p << '\n';
        std::cout << *p << std::endl;
    }
    
    std::cout << "\nDUMP : \n" << a.bin_dump() << std::endl;
}
Code
1
2
3
4
5
6
7
8
9
10
11
allocated a.data at 0x7ffd7db337c0 (12 bytes)
allocated a WORD at 0x7ffd7db337c0
1
allocated an DWORD at 0x7ffd7db337c2
5
allocated an BOOL at 0x7ffd7db337c7
1
allocated an FLOAT at 0x7ffd7db337c8
1.1
 
DUMP : ]n00000001 00000000 00000101 00000000 00000000 00000000 00000000 00000001 11001101 11001100 10001100 00111111
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2024, 19:13
Помогаю со студенческими работами здесь

Какой объем памяти необходим для хранения данной информации в памяти компьютера
1.2 Дано высказывание: Под один символ в памяти компьютера выделяется 8 битов. Оно истинно. Какой объем памяти необходим для хранения...

Подсистема хранения данных состоит из памяти северного , памяти южного моста и памяти винчестера?
Подсистема хранения данных состоит из памяти северного , памяти южного моста и памяти винчестера? А где можно узнать быстродействие всех...

Запись адреса переменной как массив char (или повторное обращение за выделением памяти)
Здравствуйте формучане, встала такая задача, есть структура определяющая &quot;мой тип&quot;, для нее был создан свой конструктор, который...

Стек и освобождение памяти
Пишу класс стека, реслизую в виде односвязного списка. stack.h #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED template...

Стек и динамическое распределение памяти
Здравствуйте, кто может объяснить что и как происходит в куске кода: liststruct *newnode; newnode = new liststruct; cout...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru