powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните плиз!!!
22 сообщений из 22, страница 1 из 1
Объясните плиз!!!
    #34454327
тот самый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Немогу понять описание данной структуры

typedef struct CvMemBlock
{
struct CvMemBlock* prev;
struct CvMemBlock* next;
} CvMemBlock;

Буду рад услышать объяснения :)

Сенкс.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454339
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле это кривое описание структуры. Лучше описывать так:
Код: plaintext
1.
2.
3.
4.
typedef struct _CvMemBlock
{
  struct _CvMemBlock* prev; 
  struct _CvMemBlock* next;
} CvMemBlock;

А чтобы понять как это работет, разбей описание на две части:
Код: plaintext
1.
2.
3.
4.
5.
6.
struct _CvMemBlock
{
  struct _CvMemBlock* prev; 
  struct _CvMemBlock* next;
};
//////////
typedef struct _CvMemBlock CvMemBlock;
Первая часть описывает структуру с двумя членами - указателями на объекты точно такого же типа.
Вторая - задает для struct _CvMemBlock псевдоним CvMemBlock

Дальше в программе уже можно создавать переменные, причем через любое из имен структуры:
Код: plaintext
1.
CvMemBlock a;
struct _CvMemBlock b;
Переменные a и b здесь одного и того же типа.
Ну и их можно связывать между собой:
Код: plaintext
1.
a.next = &b;
b.prev = &a;
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454371
тот самый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. но какого размера будет выделятся память под переменные данного типа,
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454378
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тот самыйДа. но какого размера будет выделятся память под переменные данного типа,
Элементы структуры это просто указатели. Сама структура - два указателя.
На 32-х битной платформе указатели четырех байтовые. То есть переменные a и b из моего примера будут обе по восемь байт каждая.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454502
тот самый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо, если я в добавок определю следующюю структуру:

typedef struct another
{
struct another* prev;
struct another* next;
} another;


Затем создам указатели и переменные на описанную ранее структуру и новую. Например:

CvMemBlock* pa;
another* pb;

CvMemBlock a;
another b;

допустимы ли следующие действия:?

pa=&b;
pb=&a

???????
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454525
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНа самом деле это кривое описание структуры. Лучше описывать так:
Код: plaintext
1.
2.
3.
4.
typedef struct _CvMemBlock
{
  struct _CvMemBlock* prev; 
  struct _CvMemBlock* next;
} CvMemBlock;



Так писать ни разу не лучше. Потому что
1. не надо использовать ведущие подчеркивания в идентификаторах. Они зарезервированы под нужды реализации.
2. Не надо реализовывать связанный список, надо использовать std::list

Если уж так хочется самому список воять:
3. Магия со словами typedef и struct для совместимости с Си. Пишите проще
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct myStruct
{
        myStruct *next, *prev;
};

int main(int,char**)
{
        myStruct a;
        return  0 ;
}
4. Хорошо бы определить конструктор/деструктор. Запретить/определить конструктор копирования и оператор присваивания.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454557
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тот самыйдопустимы ли следующие действия:?
pa=&b;
pb=&a
Нет. Не допустимы.
Структуры между собой конечно полностью идентичны, но без явного приведения типов их друг-другу присваивать нельзя.
Можно так:
Код: plaintext
1.
pa = (CvMemBlock*) &b;
pb = (another*) &a;
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34454564
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griegТак писать ни разу не лучше. Потому что
1. не надо использовать ведущие подчеркивания в идентификаторах. Они зарезервированы под нужды реализации.Ошибаешься. Никакой резервации нету. Зато в объявлении struct _MyType сразу видно что это вспогательное имя которое будет впоследствии перекрыто typedef'ом.

grieg2. Не надо реализовывать связанный список, надо использовать std::listТак уж прямо и "не надо"? Правильно, зачем учится ходить если можно на автобусе доехать.

grieg3. Магия со словами typedef и struct для совместимости с Си.Магия? Ну да, ну да... мудрецы древности заклинания умели придумывать а колдуны современности зубрят заклинания на непонятных языках.

grieg4. Хорошо бы определить конструктор/деструктор. Запретить/определить конструктор копирования и оператор присваивания.да, обернуть это все формочкой, присобачить туда сиквелов парочку и еще какой-нибудь вебсайтик встроенный и будет зашибись.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34456166
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
typedef struct CvMemBlock
{
struct CvMemBlock* prev; 
struct CvMemBlock* next;
} CvMemBlock;

Вышеприведенная структура есть ни что иное, как элемент двусвязанного списка, используеый для того, чтобы реализовать алгоритм динамического выделения памяти небольшими кусками. Здесь prev - это указатель на предыдущий выделенный блок (для первого блока prev = NULL), next - указатель на следующий блок (для последнего блока next = NULL).

Размер блока в байтах можно вычислить как
Код: plaintext
1.
(next - prev) * sizeof (CvMemBlock)

Структура может использоваться, например, в реализации функции malloc ().
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34456459
тот самый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, но чему будет равно выражение sizeof (CvMemBlock) ??? :)
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34456468
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тот самыйда, но чему будет равно выражение sizeof (CvMemBlock) ??? :)

Откомпелируй и посмотри. :)
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34457034
aak__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тот самыйПривет всем!

Немогу понять описание данной структуры

typedef struct CvMemBlock
{
struct CvMemBlock* prev;
struct CvMemBlock* next;
} CvMemBlock;

Буду рад услышать объяснения :)

Сенкс.

это классический двусвязный список :)
условно - цепочка, каждое звено которой содержит указатели на предыдущий и последующий элемент.
для первого элемента списка prev == null, для последнего next == null
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34457053
aak__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, здесь расписано с картинками
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34457055
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aak__ тот самыйПривет всем!

Немогу понять описание данной структуры

typedef struct CvMemBlock
{
struct CvMemBlock* prev;
struct CvMemBlock* next;
} CvMemBlock;

Буду рад услышать объяснения :)

Сенкс.

это классический двусвязный список :)
условно - цепочка, каждое звено которой содержит указатели на предыдущий и последующий элемент.
для первого элемента списка prev == null, для последнего next == null

Уже второй человек пишет одно и то же

А если это циклический двунаправленный список? ;)
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34457074
aak__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, извиняюсь, написал и только потом увидел аналогичный пост ))
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34457768
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlОшибаешься. Никакой резервации нету. Зато в объявлении struct _MyType сразу видно что это вспогательное имя которое будет впоследствии перекрыто typedef'ом.
"Никогда, никогда, вы слышите? -- никогда! -- не используйте имена, которые начинаются с подчеркивания или содержат двойное подчеркивание; эти имена зарезервированы для исключительного использования вашим компилятором и разработчиками стандартной библиотеки, чтобы избежать столкновения с такими же именами в вашем коде. ... Если быть более точным, то правило гласит, что любое имя с двойным подчеркиванием в любом месте ... или начинающееся с подчеркивания и прописной буквы ... являются зарезервированными. Если хотите, запомните это правило, на мой взгял проще просто полностью избегать двойных подчеркиваний и имен, начинающихся с подчеркивания."
(С) Герб Саттер
"Новые сложные задачи на С++", стр 236

Так уж прямо и "не надо"? Правильно, зачем учится ходить если можно на автобусе доехать.
Зависит от целей. Если цель сугубо учебная, то можно и пореализовывать.

Магия? Ну да, ну да... мудрецы древности заклинания умели придумывать а колдуны современности зубрят заклинания на непонятных языках.

Магия не в смысле непонятности, а в смысле ненужного усложения. Пиши проще.

да, обернуть это все формочкой, присобачить туда сиквелов парочку и еще какой-нибудь вебсайтик встроенный и будет зашибись.
Это лишнее. Тем более, что это уже выйдет за рамки стандартного С++. Совет тоже списан у Саттера. Обоснование: это простой способ предохранить себя от ошибок.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34458160
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg White OwlОшибаешься. Никакой резервации нету. Зато в объявлении struct _MyType сразу видно что это вспогательное имя которое будет впоследствии перекрыто typedef'ом.
"Никогда, никогда, вы слышите? -- никогда! -- не используйте имена, которые начинаются с подчеркивания или содержат двойное подчеркивание; эти имена зарезервированы для исключительного использования вашим компилятором и разработчиками стандартной библиотеки, чтобы избежать столкновения с такими же именами в вашем коде. ... Если быть более точным, то правило гласит, что любое имя с двойным подчеркиванием в любом месте ... или начинающееся с подчеркивания и прописной буквы ... являются зарезервированными. Если хотите, запомните это правило, на мой взгял проще просто полностью избегать двойных подчеркиваний и имен, начинающихся с подчеркивания."
(С) Герб Саттер
"Новые сложные задачи на С++", стр 236


Да, ты что! И что случиться?
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34459546
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh
Да, ты что! И что случиться?
Ничего не случится, если этого правила придерживаться.
В противном случае есть шанс, что на каком-то компиляторе программа не собирется. В данном примере вероятность этого мала. Для имени типа _List вероятность высока.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34459598
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg Akh
Да, ты что! И что случиться?
Ничего не случится, если этого правила придерживаться.
В противном случае есть шанс, что на каком-то компиляторе программа не собирется. В данном примере вероятность этого мала. Для имени типа _List вероятность высока.

А если придержиться, то обязательно соберется? :)
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34459632
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg Akh
Да, ты что! И что случиться?
Ничего не случится, если этого правила придерживаться.
В противном случае есть шанс, что на каком-то компиляторе программа не собирется. В данном примере вероятность этого мала. Для имени типа _List вероятность высока.
На это случай есть один хороший совет не надо в глобальном namespace писать, а так же в std и прочих, оперделяемых средой разработки. Пиши в своем
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34460213
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg Akh
Да, ты что! И что случиться?
Ничего не случится, если этого правила придерживаться.
В противном случае есть шанс, что на каком-то компиляторе программа не собирется. В данном примере вероятность этого мала. Для имени типа _List вероятность высока.Хочешь, я тебе тайну открою? С++ сочиняли теоретики а не практики, они не делали компиляторов сами. Все что они писали о реализациях - можешь смело забыть.
В каждом языке, в каждом компиляторе есть кучка так называемых "зарезервированых" слов и далеко не все они начинаются с подчеркивания. Многие зарезервированые слова состоят из обычных латинских букв. Давай теперь запретим писать переменные латинскими буквами, а то вдруг случайно имя переменной совпадет с именем какой-нибудь конструкции (if например), вот здрово будет!
Страуструп когда-то глупость сказанул, и теперь все около-плюс-плюсные писатели ее повторяют.
...
Рейтинг: 0 / 0
Объясните плиз!!!
    #34460321
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlХочешь, я тебе тайну открою? С++ сочиняли теоретики а не практики,
Утверждение неверно. С++ сочинял в первую очередь Страуструп. Он же и писал первые компиляторы. К тому же Страуструп не только теоретик, но и практик безотносительно этого факта. Источник: Страуструп, "Эволюция С++".

Список зарезервированных слов публикуется в каждом учебнике и в стандарте. Слово if туда входит, этого знания достаточно, чтоб не называть свои переменные этим именем.

Использование других слов под нужды реализации свидетельствует об ошибке компилятора. Использование программистом зарезервированных слов под свои нужды говорит об ошибке программы.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните плиз!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]