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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив в составе структуры 
V
    Опции темы
opozdaika
Дата 28.7.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

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



Я конечно глубоко зивиняюсь, что вновь поиднимаю это тему, но не доходит до меня. Все-таки можно или нет определить структуру, в которой есть массив постоянного размера? Я знаю, что классы располагаются в куче, а структуры - в стеке. И я знаю, что структуры передаются по значению, а классы по ссылке. И понимаю, что в связи с этим размер структуры должен быть мааааааленьким. НО все равно мне нужно это! У меня массивчик малюсенький, но для удобства он должен быть внутри структуры! 
Ниже результат моих поисков. Вариант с new  не очень меня привлекает, т.к. такой малюсенький массивчик лучше хранить физически в самой структуре.  Кстати, вариант с разбиением массива на N отдельных скалярных полей - оффтоп.
Код

        public struct MyStruct
        {
            public int MyArray[2];
        }
// CS0650: Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier. 
//   To declare a fixed size buffer field, use the fixed keyword before the field type.

        public struct MyStruct
        {
            public int[2] MyArray;
        }
// CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression)

        public struct MyStruct
        {
            public int[] MyArray = new int[2];
        }
// CS0573: MyStruct.MyArray: cannot have instance field initializers in structs

        public struct MyStruct
        {
            public fixed int MyArray[2];
        }
// CS0214: Pointers and fixed size buffers may only be used in an unsafe context

        unsafe public struct MyStruct
        {
            public fixed int MyArray[2];
        }
// CS0227: Unsafe code may only appear if compiling with /unsafe


PM MAIL   Вверх
PashaPash
Дата 28.7.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



opozdaika, для какого удобства?
Частью структуры можно сделать fixed size buffer, если структура unsafe. Чтобы откомпилировалось без CS0227, нужно поставить галочку Allow Unsafe Code на закладке Build в свойствах проекта.


--------------------
PM MAIL WWW   Вверх
Robust
Дата 28.7.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.6.2008

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



Попробуй добавить конструктор в котором инициализируются все поля структуры
Вроде такого:
Код

        public struct MyStruct
        {
            public int[2] MyArray;
            
            public MyStruct(int[] MyArray)
            {
                     this.MyArray = MyArray;
            }
        }


Это сообщение отредактировал(а) Robust - 28.7.2008, 18:36
PM MAIL   Вверх
PashaPash
Дата 29.7.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(Robust @  28.7.2008,  18:34 Найти цитируемый пост)
Попробуй добавить конструктор в котором инициализируются все поля структуры
И после этого массив будет хранится в стеке, как часть структуры?


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


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.6.2008

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



Цитата

И после этого массив будет хранится в стеке, как часть структуры?


Нет. Массив - это ссылочный тип. В структуре будет храниться ссылка на массив, который будет создаваться в куче, со всеми вытекающими последствиями.

А чтобы выделять массив стеке нужно использовать unsafe код.

Например так:
Код

    class Program
    {
        static void Main(string[] args)
        {
            unsafe
            {
                MyStruct ms; // Выделяем в стеке память для массива

                Int32 width = 5;

                for (int i = 0; i < width; i++)
                {
                    ms.MyArray[i] = i;
                }

                for (int i = 0; i < width; i++)
                {
                    Console.WriteLine(ms.MyArray[i]);
                }

                Console.ReadLine();
            }
        }
    }

    public unsafe struct MyStruct
    {
        public fixed int MyArray[5];
    }


И не забудь поставить флажок в свойстве проекта "Allow unsafe code"
PM MAIL   Вверх
opozdaika
Дата 30.7.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

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



Robust,  да все правильно. Так у меня работает. Но мне не понравилось, что нужно везде, где работаешь со структурой, писать unsafe. Да еще и эта галочка подозрительная... Поэтому я отказался от использования struct в пользу class. Наверное, лучше забыть о том, что в C# есть структуры. 

Это сообщение отредактировал(а) opozdaika - 30.7.2008, 14:02
PM MAIL   Вверх
PashaPash
Дата 30.7.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(Robust @  30.7.2008,  02:16 Найти цитируемый пост)
Нет. Массив - это ссылочный тип. В структуре будет храниться ссылка на массив, который будет создаваться в куче, со всеми вытекающими последствиями.
А чтобы выделять массив стеке нужно использовать unsafe код.

Это и написано в  первом посте топика. При чем тут вообще конструктор и инициализация полей?
Цитата(Robust @  30.7.2008,  02:16 Найти цитируемый пост)
И не забудь поставить флажок в свойстве проекта "Allow unsafe code" 

А это во втором посте топика.

Это сообщение отредактировал(а) PashaPash - 30.7.2008, 17:33


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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