Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните плиз!!! / 22 сообщений из 22, страница 1 из 1
11.04.2007, 21:07
    #34454327
тот самый
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
Привет всем!

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

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

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

Сенкс.
...
Рейтинг: 0 / 0
11.04.2007, 21:18
    #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
11.04.2007, 21:47
    #34454371
тот самый
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
Да. но какого размера будет выделятся память под переменные данного типа,
...
Рейтинг: 0 / 0
11.04.2007, 21:52
    #34454378
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
тот самыйДа. но какого размера будет выделятся память под переменные данного типа,
Элементы структуры это просто указатели. Сама структура - два указателя.
На 32-х битной платформе указатели четырех байтовые. То есть переменные a и b из моего примера будут обе по восемь байт каждая.
...
Рейтинг: 0 / 0
11.04.2007, 23:48
    #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
12.04.2007, 00:10
    #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
12.04.2007, 01:02
    #34454557
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
тот самыйдопустимы ли следующие действия:?
pa=&b;
pb=&a
Нет. Не допустимы.
Структуры между собой конечно полностью идентичны, но без явного приведения типов их друг-другу присваивать нельзя.
Можно так:
Код: plaintext
1.
pa = (CvMemBlock*) &b;
pb = (another*) &a;
...
Рейтинг: 0 / 0
12.04.2007, 01:16
    #34454564
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
griegТак писать ни разу не лучше. Потому что
1. не надо использовать ведущие подчеркивания в идентификаторах. Они зарезервированы под нужды реализации.Ошибаешься. Никакой резервации нету. Зато в объявлении struct _MyType сразу видно что это вспогательное имя которое будет впоследствии перекрыто typedef'ом.

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

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

grieg4. Хорошо бы определить конструктор/деструктор. Запретить/определить конструктор копирования и оператор присваивания.да, обернуть это все формочкой, присобачить туда сиквелов парочку и еще какой-нибудь вебсайтик встроенный и будет зашибись.
...
Рейтинг: 0 / 0
12.04.2007, 14:25
    #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
12.04.2007, 15:28
    #34456459
тот самый
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
да, но чему будет равно выражение sizeof (CvMemBlock) ??? :)
...
Рейтинг: 0 / 0
12.04.2007, 15:31
    #34456468
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните плиз!!!
тот самыйда, но чему будет равно выражение sizeof (CvMemBlock) ??? :)

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

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

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

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

Сенкс.

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

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

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

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

Сенкс.

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

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

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

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

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

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

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


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

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

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

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


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