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

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

11.10.2024, 10:30. Показов 1132. Ответов 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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
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
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
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
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,693
11.10.2024, 15:45
leproza, на картинку посмотрите, там выравнивание двухбайтовое
0
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
11.10.2024, 19:58
Annemesski,
Да, проглядел. Но для этого достаточно offset округлять
0
 Аватар для sporta1982
213 / 59 / 7
Регистрация: 05.10.2023
Сообщений: 507
12.10.2024, 06:57
я человек темный , я пытался это запихать в Visual Studio , но маленькую n вы не заметили.

Добавлено через 31 минуту
да еще ; после завещающей юнион} , да еще какое то двухбайтовое выравнивание, то в одной области лежат, короче темнота
0
 Аватар для sporta1982
213 / 59 / 7
Регистрация: 05.10.2023
Сообщений: 507
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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
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
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru