Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2016, 16:51   #1
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию [C#] Ошибка "Use of unassigned local variable"

Пример из книги Шилдта "Полное руководство C# 4.0" Глава 14. Применение средств ввода-вывода. с.459
Цитата:
Для учета каждого предмета хранения на складе в приведенной ниже программе сначала запоминается наименование предмета, имеющееся в наличии, количество и стоимость, а затем пользователю предлагается ввести наименование предмета, чтобы найти его в базе данных. Если предмет найден, отображаются сведения о его запасах на складе.
Получаю ошибку "Use of unassigned local variable 'detaIn' в строке 73
Понимаю, что detaIn не инициализована, но почему? ведь выше по тексту есть фрагмент
Код:
try
            {
                detaIn = new BinaryReader(new FileStream("inventory.dat", FileMode.Open));
            }
Код примера:
Код:
static void Main(string[] args)
        {
            BinaryWriter dataOut;
            BinaryReader detaIn;

            string item;
            int onhand;
            double cost;

            try
            {
                dataOut = new BinaryWriter (new FileStream("inventory.dat", FileMode.Create));
            }
            catch(IOException exc)
            {
                Console.WriteLine("Не удается открыть файл товарных запасов для вывода");
                Console.WriteLine("Причина : "+exc.Message);
                return;
            }

            try
            {
                dataOut.Write("Молотки");
                dataOut.Write(10);
                dataOut.Write(3.95);

                dataOut.Write("Отвертки");
                dataOut.Write(18);
                dataOut.Write(1.50);

                dataOut.Write("Плоскогубцы");
                dataOut.Write(5);
                dataOut.Write(4.95);

                dataOut.Write("Пилы");
                dataOut.Write(8);
                dataOut.Write(8.95);
            }
            catch(IOException exc)
            {
                Console.WriteLine("Ошибка записи в файл товарных запасов");
                Console.WriteLine("Причина: " + exc.Message);
            }
            finally
            {
                dataOut.Close();
            }
            Console.WriteLine();
            
            try
            {
                detaIn = new BinaryReader(new FileStream("inventory.dat", FileMode.Open));
            }
            catch(IOException exc)
            {
                Console.WriteLine("Не удается открыть файл товарных запасов для ввода");
                Console.WriteLine("Причина: " + exc.Message);
            }
            Console.Write("Введите наименование для поиска: ");
            string what = Console.ReadLine();
            try
            {
                for(;;)
                {
                    item = detaIn.ReadString(); // <====ОШИБКА ТУТ
                    onhand = detaIn.ReadInt32();
                    cost = detaIn.ReadDouble();

                    if(item.Equals(what,StringComparison.OrdinalIgnoreCase))
                    {
                        Console.WriteLine(item + ": " + onhand + " штук в наличии. " + "Цена: {0:C} за штуку", cost);
                        Console.WriteLine("Общая стоимость по наименованию <{0}>: {1:C}.", item, cost * onhand);
                        break;
                    }
                }
            }catch (EndOfStreamException)
            {
                Console.WriteLine("Предмет не найден.");
            }
            catch (IOException exc)
            {
                Console.WriteLine("Ошибка чтения из файла");
                Console.WriteLine("Причина: ", exc.Message);
            }
            finally
            {
                detaIn.Close();
            }
            Console.ReadLine();
        }
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 09.12.2016, 17:31   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А если был IOException?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.12.2016, 19:10   #3
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А если был IOException?
Ошибка ж на этапе компилирования, а не выполнения. Не? dataOut "inventory.dat" создал
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 09.12.2016, 19:17   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Вообще там return наверно должен был быть.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.12.2016, 19:57   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вообще там return наверно должен был быть
Вы правы.
Фрагмент
Код:
try
            {
                detaIn = new BinaryReader(new FileStream("inventory.dat", FileMode.Open));
            }
            catch(IOException exc)
            {
                Console.WriteLine("Не удается открыть файл товарных запасов для ввода");
                Console.WriteLine("Причина: " + exc.Message);
            }
должен быть
Код:
try
            {
                detaIn = new BinaryReader(new FileStream("inventory.dat", FileMode.Open));
            }
            catch(IOException exc)
            {
                Console.WriteLine("Не удается открыть файл товарных запасов для ввода");
                Console.WriteLine("Причина: " + exc.Message);
                return;
           }
Осталось разобраться как это работает.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Ошибка "cannot find variable INFORMATION_MESSAGE", Ошибка "cannot find variable INFORMATION Fateway Общие вопросы по Java, Java SE, Kotlin 3 15.12.2015 00:19
Ошибка for loop control variable must be simple local variable 2UnLiMiTeDD Общие вопросы Delphi 8 19.03.2012 16:13
For loop control variable must be simple local variable Hehe Общие вопросы Delphi 11 26.12.2011 19:42
for loop control variable must be simple local variable obsession Общие вопросы Delphi 10 08.05.2011 12:20