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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Декларирование и инициализация массива в Switch. подскажите выход из положения.. 
V
    Опции темы
ClockWork
Дата 12.3.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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





Суть вот в чем. У меня есть программа, в которую нужно ввести данные. Данные вводятся либо с клавиатура, либо из файла. В начале я спрашиваю у пользователя как именно он хочет вводить данные и в зависимости от его выбора реализую разные блоки кода.

Делаю все это через switch и case-ы.

Так вот далее в этих блоках case у меня просходит декларирование массива, его инициализация и наполнение данными. Декларирование происходит только в 2 ветвях (всего их 3), в default оно (декларирование) отсутсвует и "бросается" исключение.

Так вот, если я продекларировал и наполнил массив обьектов определенного класса данными в блоке switch, то за пределами этого блока этот массив не виден (не существует).  smile 

Вопрос: как можно найти выход из такой ситуации. Наверняка кто-нибудь сталкивался.. Что посоветуете?   smile 
PM MAIL   Вверх
Tror
Дата 12.3.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



определяй массив вне блока switch
и вообще не помешало бы немного кода увидеть
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
ClockWork
Дата 12.3.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Tror @  12.3.2007,  18:37 Найти цитируемый пост)
определяй массив вне блока switch
и вообще не помешало бы немного кода увидеть


Я бы рад определять массив вне блока, но это очень неудобно, поскольку его размерность задается либо с клавы (case 1), либо из файла (case 2) - для этого мне switch  и нужен. Хотя, если другого способа нет, то буду делать так. :(

Код можете заценить:


Код

switch (inputDataWay)
                {
                    case 1:
                        Console.Write("\n Введите количество узлов в схеме:\t");
                        NetList.numberOfNodes = Convert.ToInt16(Console.ReadLine());

                        // now, after we know the number of nodes - we
                        // can declare an array of NetList class
                        NetList[] NetListArray = new NetList[NetList.numberOfNodes];

                        // we can also declare those
                        // two arrays to store the values of matrix
                        // and vector that is needed to solve the equation
                        double[,] matrixBuffer = new double[numberOfElements, numberOfElements];
                        double[] vectorBuffer = new double[numberOfElements];

                        // we would need buffer variables when filling the NetList Array,
                        // so let's determine them
                        string curElementName;
                        int curElemnetType;
                        int curElementFirstNode;
                        int curElemnetSecondNode;
                        double curElementValue;



                        // when the array is created we can fill it
                        // with appropriate information about elements
                        // of the given circuit
                        for (int i = 0; i < NetList.numberOfNodes; i++)
                        {
                            Console.Write("\nЭлемент № {0}:\n\n", i);
                            Console.Write("Название элемента:\t");
                            curElementName = Console.ReadLine();
                            Console.Write("Тип элемента (0-\"C\" 1-\"R\"):\t");
                            curElemnetType = Convert.ToInt16(Console.ReadLine());
                            Console.Write("Первый узел подключения:\t");
                            curElementFirstNode = Convert.ToInt16(Console.ReadLine());
                            Console.Write("Второй узел подключения:\t");
                            curElemnetSecondNode = Convert.ToInt16(Console.ReadLine());
                            Console.Write("Численная величина:\t");
                            curElementValue = Convert.ToDouble(Console.ReadLine());

                            // now, when all buffers are filled, we can instantiate
                            // a NetList member with number i
                            NetListArray[i] = new NetList(curElementName, curElemnetType, curElementFirstNode, curElemnetSecondNode, curElementValue);
                        }
                        break;
                    case 2:
                        goto case 1;
                        break;
                    default:
                        throw new System.Exception();
                        break;
                
                }


Маленькое уточнение. Операция ввода данных из файла пока не реализована, в case 2 просто ссылка на case 1. Ну я думаю вы и сами это сразу поняли. smile

Это сообщение отредактировал(а) ClockWork - 12.3.2007, 18:47
PM MAIL   Вверх
agl
Дата 12.3.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Я бы рад определять массив вне блока, но это очень неудобно, поскольку его размерность задается либо с клавы (case 1), либо из файла (case 2)

Объявлять массив ты можешь вне switch, а new делать в своих блоках. В С# массивы динамическии.

Код

NetList[] NetListArray ; /* step 1*/


NetListArray = new NetList[NetList.numberOfNodes];   /* step 2*/




PM   Вверх
nikitao
Дата 12.3.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата(agl @  12.3.2007,  19:54 Найти цитируемый пост)
Объявлять массив ты можешь вне switch, а new делать в своих блоках. В С# массивы динамическии.

Код

int lenght;
            int[] Array;
            Console.WriteLine(" Введите тип нахзождения размера (1\\2) ");
            switch (Console.ReadLine())
            {
                case "1":
                    {
                        lenght = 22;
                        // находим lenght одним способом
                        Array = new int[lenght];
                        // заполнение 
                    } break;
                case "2":
                    {
                        // находим lenght одним способом
                        lenght = 12;
                        Array = new int[lenght];
                        // заполнение 
                    } break;
                default:
                    {
                        throw new Exception("Ошибка ввода");
                    }
            }
                // Дальнейшая работа
                    Console.WriteLine(Array.Length);
                    Console.ReadKey();
        }

Хотя я бы List заюзал smile  

Это сообщение отредактировал(а) nikitao - 12.3.2007, 20:40


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Naum
Дата 13.3.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



 smile 
А я не заметил двух разных ветвей, case 1 и case 2 делают одно и то же. Не лучше ли выделить эти действия в отдельный метод. Потому как, ИМХО, goto ломает всю модель ООП.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
_Dream
Дата 13.3.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

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



 smile 
Цитата

Операция ввода данных из файла пока не реализована, в case 2 просто ссылка на case 1. Ну я думаю вы и сами это сразу поняли. 


--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
ClockWork
Дата 13.3.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



nikitao, 
Цитата(nikitao @  12.3.2007,  20:38 Найти цитируемый пост)
Объявлять массив ты можешь вне switch, а new делать в своих блоках. В С# массивы динамическии.

Спасибо. Так все работает. Просто я думал, что в C# чтобы обозначить массив, надо знать его length сразу.
Цитата(Naum @  13.3.2007,  11:01 Найти цитируемый пост)
 
А я не заметил двух разных ветвей, case 1 и case 2 делают одно и то же. Не лучше ли выделить эти действия в отдельный метод. Потому как, ИМХО, goto ломает всю модель ООП.


хм.. Без паники. goto в данном случае используется совсестно с case. А это не только никак на ломает концепцию ООП, но даже рекомендовано разработчиками C#. 

Кстати в данном случае goto я там поставил просто "от нечего делать". Просто не успел дописать код, чтоб инфа бралась из файла и поставил ссылку на case 1.  smile 

Цитата(nikitao @  12.3.2007,  20:38 Найти цитируемый пост)
Хотя я бы List заюзал 


В смысле? ArrayList? Я просто создаю массив объектов специфического класса, который сам описал. Как тут лист можно заюзать?  smile 


Это сообщение отредактировал(а) ClockWork - 13.3.2007, 15:07
PM MAIL   Вверх
agl
Дата 13.3.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

В смысле? ArrayList? Я просто создаю массив объектов специфического класса, который сам описал. Как тут лист можно заюзать?   



Очень просто, ArrayList имеет тип object - базовый тип для ВСЕХ типов, как пользовательских так и системных. В нём можно хранить объекты любого класса, более того, сохраняемые в нём объекты могуть быть разных типов. Тип сохраняемого объекта узнается просто:
Код

ArrayList arList = new ArrayList();
arList.Add(34);
arList.Add("abcd");
for(int i = 0; i < arList.Count; i++)
    Console.WriteLine(arList[i].GetType().ToString() + "\n\n");

Цитата(Output)

System.Int32

System.String



Update:
Добавление объекта в список:
arList.Add(new myObject());
И при распоковке нужно использовать приведение типов.

Это сообщение отредактировал(а) agl - 13.3.2007, 15:53
PM   Вверх
Tror
Дата 13.3.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



Цитата(ClockWork @  13.3.2007,  15:03 Найти цитируемый пост)
Я просто создаю массив объектов специфического класса, который сам описал. Как тут лист можно заюзать? 


очень просто smile

Код

List<int> lst = new List<int>();


--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
agl
Дата 13.3.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ИМХО, надо писать какую версию студиии/framework использует
А то путаница.

2Tror
У тебя код для framework 2.0?
PM   Вверх
ClockWork
Дата 13.3.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо за советы. Действительно просто.


Цитата(agl @  13.3.2007,  15:59 Найти цитируемый пост)
ИМХО, надо писать какую версию студиии/framework использует
А то путаница.

2Tror
У тебя код для framework 2.0?


хм.. Да, у меня стоит framework 2.0. Просто я мало еще об этом читал.. Что, есть принципиальные различия между разными фреймворками? Это уже оффтоп, но все-же.  smile 

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



ну да ведь generic'и появились во втором framework'е
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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