Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка создания поля класса System::Drawing::Color 
V
    Опции темы
skyboy
Дата 4.12.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Обьясните принцип, согласно которому в коде
Код

    public __gc class some
    {
    public: System::Drawing::Color* c;
    public: some(void)
            {
                
            }
    public: some(System::Drawing::Color* c)
            {
                System::Drawing::Color* colr;
            }
    };

Поле класса System::Drawing::Color не создается("error C3160: 'c' : cannot declare interior __gc pointer or reference as a member of 'test::some'"), а вот в качестве параметра и переменной используется запросто. Для меня это очень странным кажется, не могу понять закономерность. Просветите, пожалуйста.
PM MAIL   Вверх
Дрон
Дата 4.12.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Хмм... из MSDN мне вообще ничего не понятно http://msdn2.microsoft.com/en-US/library/18xa23yk.aspx
Видимо, особенности С++ и, видимо, это как-то связано с тем, что Color это структура, а не класс.

Попробуй объявить просто 
Код
public: System::Drawing::Color c;


Это сообщение отредактировал(а) Дрон - 4.12.2006, 16:09


--------------------
Да. Именно так.
PM   Вверх
skyboy
Дата 4.12.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Дрон, спасибо, мне кажется, это сработает smile
___________________________________________________________________
Я выяснил, что это связано с тем, что Color описан как __value, то есть нечто, передаваемое в функцию по значению, а хранящееся в стеке. Отсюда вытекает особенность поведения:
- внутри функции/метода как в качестве параметра,так и в качестве локальной переменной указатель на эту дуру вполне валиден. Только, видимо, излишен - проверить сейчас не могу, но, видимо, как и указал 
Дрон, без взятия адреса тоже будет работать.
- внутри класса стек не создается; соотвественно взятие адреса для создания указателя на экземпляр Color - просто бесполезно. А вот вариант 
Цитата(Дрон @  4.12.2006,  14:22 Найти цитируемый пост)
public: System::Drawing::Color c;
 вполне может прокатить. 
Одно смущает - получается объект со всеми полями в стеке сидит?  smile 

PM MAIL   Вверх
ivashkanet
Дата 4.12.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(skyboy @  4.12.2006,  14:33 Найти цитируемый пост)
Одно смущает - получается объект со всеми полями в стеке сидит?

Ну почему со всеми smile
только теми которые сами являются структурами, все остальные сидят в куче, а в стеке есть ссылка на них smile

P.S. skyboy, а чё ты начал с С++ .Net?  smile Он же много сложнее C# и его обычно используют только для работы с неуправляемыми ресурсами, указателями и т.д.

Это сообщение отредактировал(а) ivashkanet - 4.12.2006, 15:44
PM MAIL WWW ICQ   Вверх
Дрон
Дата 4.12.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(skyboy @  4.12.2006,  15:33 Найти цитируемый пост)
Одно смущает - получается объект со всеми полями в стеке сидит?

Да, такова особенность структур (__value типов).
В принципе, это делается для некоторого увеличения быстродействие -- чаще всего там очень мало полей и памяти много они не занимают. Так же для них не требуется отдельная сборка мусора, т.е. они просто удаляются вместе со стеком.
В общем там есть свои особенности -- можно поискать в интернете сравнения value types и reference types.

Например тут: http://msdn.microsoft.com/msdnmag/issues/1200/dotnet/


--------------------
Да. Именно так.
PM   Вверх
skyboy
Дата 4.12.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(ivashkanet @  4.12.2006,  14:40 Найти цитируемый пост)
только теми которые сами являются структурами, все остальные сидят в куче, а в стеке есть ссылка на них

ну, это понятно. Но все равно кажется странным, что непростой класс Color объявлен аки __value. Или я чей-то не понял и это всё-таки не класс?  smile 
Цитата(ivashkanet @  4.12.2006,  14:40 Найти цитируемый пост)
а чё ты начал с С++ .Net?

Обучение в универе. Сам бы выбирал - скорее попробовал бы Prolog.NET smile
Цитата(Дрон @  4.12.2006,  14:44 Найти цитируемый пост)
В общем там есть свои особенности -- можно поискать в интернете сравнения value types и reference types.
Например тут: http://msdn.microsoft.com/msdnmag/issues/1200/dotnet/ 

Спасибо smile
На случай, если вдруг кто в английском не шибко кумекает, статья на русском на RSDN на ту же тему.
PM MAIL   Вверх
Дрон
Дата 4.12.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(skyboy @  4.12.2006,  16:00 Найти цитируемый пост)
Но все равно кажется странным, что непростой класс Color объявлен аки __value. Или я чей-то не понял и это всё-таки не класс?

На самом деле в Color нет ничего сложного. Там много статических и const полей, но они памяти не занимают.
Судя по Reflector там instance (забыл как по-русски... ну в общем не статических, "нормальных") полей всего 4:
short knownColor;
string name;
short state;
long value;

Итого размер  8 + 2 + 2 + sizeof(указатель) байт. Ничего страшного для стека, зато избавляемся от лишней сборки мусора, поскольку Color может использоваться довольно интенсивно.



Это сообщение отредактировал(а) Дрон - 4.12.2006, 16:08


--------------------
Да. Именно так.
PM   Вверх
ivashkanet
Дата 4.12.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(skyboy @  4.12.2006,  15:00 Найти цитируемый пост)
непростой класс Color

А почему он не простой?
Внутри него хранится всего лишь 4 битный код цвета ARGB и все  smile 
Все остальное это свойства и функции, работающие с этим числом. Которые в стеке не хранятся smile

Так что, этот класс занимает не больше чем int  smile

Добавлено @ 16:11 
Цитата(ivashkanet @  4.12.2006,  15:09 Найти цитируемый пост)
Так что, этот класс занимает не больше чем int 

Цитата(Дрон @  4.12.2006,  15:07 Найти цитируемый пост)
того размер  8 + 2 + 2 + sizeof(указатель) байт.

Наврал smile smile 
Но их могло и не быть, а Колором можно было бы пользоваться  smile 
PM MAIL WWW ICQ   Вверх
Дрон
Дата 4.12.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(ivashkanet @  4.12.2006,  16:09 Найти цитируемый пост)
Но их могло и не быть, а Колором можно было бы пользоваться  smile  

Угу. Я сам удивился, что там ещё что-то есть smile



--------------------
Да. Именно так.
PM   Вверх
skyboy
Дата 4.12.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Дрон @  4.12.2006,  15:07 Найти цитируемый пост)
Итого размер  8 + 2 + 2 + sizeof(указатель) байт

"указатель" - это указатель на запись в таблице виртуальных фукнкций? smile
Цитата(ivashkanet @  4.12.2006,  15:09 Найти цитируемый пост)
А почему он не простой?

Цитата(Дрон @  4.12.2006,  15:07 Найти цитируемый пост)
На самом деле в Color нет ничего сложного. 

Как всполошились  smile Япросто имел в виду, что класть объекты в стек, как на меня - непривычная штука. Привык, что динамически создаваемое - в динамической памяти; ну, типа: кесарю - кесарево  smile 
Надо будет отвыкать...
Спасибо за помощь. Теперь я абсолютно уверен, что 
Цитата(Дрон @  4.12.2006,  14:22 Найти цитируемый пост)
public: System::Drawing::Color c;

заработает 
PM MAIL   Вверх
Дрон
Дата 4.12.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(skyboy @  4.12.2006,  16:28 Найти цитируемый пост)
"указатель" - это указатель на запись в таблице виртуальных фукнкций?

Уфф... На самом деле я имел ввиду, что указатель на объект string.
А насчёт VTABLE я вообще-то не подумал, но на самом деле это не применимо к структурам в .NET -- от них нельзя наследоваться smile

И вообще. Что нам мешает проверить размер?
Делаем (только это в C# -- мне так проще)
Код
Console.WriteLine(Marshal.SizeOf(typeof(System.Drawing.Color)));

Получаем 24... Хмм... Ну правда, там ещё выравнивание  smile
Без выравнивания такая же структура занимает 16 байт.
Без выравнивания, и без указателя на объект string -- всего 12. 
Т.е. всё, как и ожидалось: 2 раза по 2 байта на short + 8 байт на long + 4 (указатель) = 16.



Это сообщение отредактировал(а) Дрон - 4.12.2006, 16:41


--------------------
Да. Именно так.
PM   Вверх
skyboy
Дата 5.12.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Дрон @  4.12.2006,  15:39 Найти цитируемый пост)
А насчёт VTABLE я вообще-то не подумал, но на самом деле это не применимо к структурам в .NET

елки-моталки, никак не приноровлюсь к работе со структурами, как с объектами smile Слаб я ещё в .НЕТ, ой как слаб  smile 
По теме: работает System::Drawing::Color с и не пищит smile И правда - в указательности дело было. 
Спасибо и участвующим, и просто сочувствующим!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.