Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно
заполнить её нулями вроде бы стандартная задача(использую memset),но делая
sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
указатель, но просто из-за sizeof он у меня часто используется проблемы
возникают ,что мне делать подскажите ,как получить правильный размер ,так
как если это с то всё пучком если C++ проблемы.
и такое дело объявляю
struct {
unsigned char ver:4;
unsigned char len:4;
}
в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
было бы прваильно если это был бы один байт ,что мне делать ?
--
mailto: leon@ic.kharkov.ua
Re: очень хитрый вопрос
От:
Аноним
Дата:
20.05.01 11:14
Оценка:
Здравствуйте Молочный Леонид Николаевич, вы писали:
МЛН>struct { МЛН>unsigned char ver:4; МЛН>unsigned char len:4; МЛН>}
Здравствуйте Молочный Леонид Николаевич, вы писали:
МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так МЛН>как если это с то всё пучком если C++ проблемы. МЛН>и такое дело объявляю МЛН>struct { МЛН>unsigned char ver:4; МЛН>unsigned char len:4; МЛН>} МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это МЛН>было бы прваильно если это был бы один байт ,что мне делать ?
На C++Builder...
Октеты действительно меняет...
Но размер — 1 байт. И всё вроде даже логично.
Кстати о каком this идёт речь. Что это такое? (в данном контексте)
Вроде не класс. Обычная структура.
Почему ж тогда на Си++ проблемы (повторяю — у меня всё нормально)
Если проблемы с размером не связаны с описанной структурой, то...
Компиляторы имеют свойство... эээ... забыл как это по-русски...
Alignment что-ли.
Короче выравнивание происходит по размеру int'а (т.е. в Win32 на 4 байта).
Причём каждого параметра структуры (если их нельзя объединить).
struct st {
char v1;
char v2;
int v3;
};
Енто будет 8 байт (а не 6)
Первые 4 — char v1 и v2
Последние — int v3
struct st {
char v1;
int v3;
char v2;
};
А вот енто... ни за что не угадаешь — будет 12 байт (и не 6, и не 8)
Первые 4 — char v1
Вторые — int v3
Последние — char v2
Ээээ... такие фокусы нам ещё Коперфильд в институте на физике показывал
st a;
... = &a; // адрес структуры
... = &(a.v3); // адрес переменной v3
... = ((char*)&(s.v3)) — ((char*)&s); // смещение переменной v3 в структуре
--
Шутки шутками, но... если что надо спрашивай
Victor Dunaev (vitek@fromru.com)
Re[2]: очень хитрый вопрос
От:
Аноним
Дата:
29.05.01 12:15
Оценка:
Здравствуйте Vitek, вы писали:
V>Кстати о каком this идёт речь. Что это такое? (в данном контексте) V>Вроде не класс. Обычная структура.
Здравствуйте Аноним, вы писали:
V>>Кстати о каком this идёт речь. Что это такое? (в данном контексте) V>>Вроде не класс. Обычная структура.
А>struct это уже давно класс. А>Dan.
Да!.. действительно :-(
И до этого добрались!.. изверги
Ну на х... структуру то было трогать.
Ну сделали же класс. Так нет же!.. и структуру в класс переделали.
Всё испортят
Здравствуйте Молочный Леонид Николаевич, вы писали:
МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так МЛН>как если это с то всё пучком если C++ проблемы. МЛН>и такое дело объявляю МЛН>struct { МЛН>unsigned char ver:4; МЛН>unsigned char len:4; МЛН>} МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это МЛН>было бы прваильно если это был бы один байт ,что мне делать ?
МЛН>-- МЛН>mailto: leon@ic.kharkov.ua
Ты не мог бы объяснить что это за объявление структуры
struct {
unsigned char ver:4;
unsigned char len:4;
}, а именно, что это за двоеточия с циферками :)
насколько я знаю структуры объявляются вот так:
struct
{
unsigned char ver;
unsigned char len;
}
а у тебя что-то вроде "union" получилось, отсюда и все беды
МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы
this тут ни при чём, он в данных класса не появляется никогда ни при каких обстоятельствах. Ты наверное имел ввилу указатель на таблицу виртуальных методов? Но он создаётся компилятором только в случае объявления хотя бы одной виртуальной функции.
МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так МЛН>как если это с то всё пучком если C++ проблемы. МЛН>и такое дело объявляю МЛН>struct { МЛН>unsigned char ver:4; МЛН>unsigned char len:4; МЛН>} МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это МЛН>было бы прваильно если это был бы один байт ,что мне делать ?
Скорее всего проблемы с выравниванием, попробуй поставить
Здравствуйте Edward, вы писали:
E>Здравствуйте Молочный Леонид Николаевич, вы писали:
МЛН>>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно МЛН>>заполнить её нулями вроде бы стандартная задача(использую memset),но делая МЛН>>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this МЛН>>указатель, но просто из-за sizeof он у меня часто используется проблемы МЛН>>возникают ,что мне делать подскажите ,как получить правильный размер ,так МЛН>>как если это с то всё пучком если C++ проблемы. МЛН>>и такое дело объявляю МЛН>>struct { МЛН>>unsigned char ver:4; МЛН>>unsigned char len:4; МЛН>>} МЛН>>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это МЛН>>было бы прваильно если это был бы один байт ,что мне делать ?
МЛН>>-- МЛН>>mailto: leon@ic.kharkov.ua
E>Ты не мог бы объяснить что это за объявление структуры E>struct { E>unsigned char ver:4; E>unsigned char len:4; E>}, а именно, что это за двоеточия с циферками :) E>насколько я знаю структуры объявляются вот так: E>struct E>{ E>unsigned char ver; E>unsigned char len; E>} E>а у тебя что-то вроде "union" получилось, отсюда и все беды
Читайте manual...
А двоеточия это объявления битовых полй.(unsigned char ver:4 значит что ver -поле, содержащее первые четыре бита структуры; unsigned char len:4 — следующие четыре бита). Итого, структура состоит из двух полй, размером по четыре бита, то есть должна занимать 1 байт. Подчеркну, должна, а сколько она реально будет занимать зависит от параметров компилятора.