Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225

Модификаторы out и ref

19.11.2015, 13:41. Показов 1658. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Эта функция :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        private void correctFMas0(ref List<string> FData, out double TimeADC, out double FreqADC, out int FramesADC, ref bool FHaracters)
        {
            if (FData[0] == "Oscilloscope Data File")
            {
                FHaracters = true;
                for (int i = 0; i < 19; i++)
                {
                    if (i == 2)
                        FramesADC = Int16.Parse(FData[0].Replace("Number of frames: ", String.Empty), CultureInfo.InvariantCulture);
                    if (i == 7)
                        FreqADC = 1000 * Double.Parse(FData[0].Replace("Input Rate In kHz: ", String.Empty), CultureInfo.InvariantCulture);
                    if (i == 8)
                        TimeADC = Double.Parse(FData[0].Replace("Input Time In Sec: ", String.Empty), CultureInfo.InvariantCulture);
                    FData.RemoveAt(0);
                }
            }
            else
            {
                FHaracters = false;
                TimeADC = 5;
                FramesADC = FData.Count;
                FreqADC = 10000;
            }
        }
вызывается из другой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public void getMas(List<string> FileList)
        {
            bool FHaracters = true;
            double TimeADC, FreqADC;
            int FramesADC;
            List<string> FData = new List<string>();
            for (int f = 0; f < FileList.Count; f++)
            {
                foreach (var line in File.ReadLines(FileList[f]))
                    FData.Add(line);
                if (f == 0)
                    correctFMas0(ref FData, out TimeADC, out FreqADC, out FramesADC, ref FHaracters);///////////////////// Вызов вторичной функции
                if(f>0)
                    if (FHaracters)
                        for (int i = 0; i < 19; i++)
                            FData.RemoveAt(0);
            }
        }
Error 1 The out parameter 'FramesADC' must be assigned to before control leaves the current method
Error 2 The out parameter 'FreqADC' must be assigned to before control leaves the current method
Error 3 The out parameter 'TimeADC' must be assigned to before control leaves the current method


Честно говря заманался, не понимаю в чём ошибка.
ref - обязательно объявить и инициализировать в главной функции, там где вызываешь вторичную функцию.
out - в главной ф-ии только объявляешь, инициализация же внутри вызываемой(вторичной) функции.
Помоему я всё правильно понял?!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2015, 13:41
Ответы с готовыми решениями:

Что делают модификаторы ref и out?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Лаба2 { class Program ...

Когда возникает необходимость использовать модификаторы out и ref
Объясните пожалуйста, когда возникает необходимость использовать эти модификаторы? Когда вообще может понадобиться передача аргументов по...

Полиморфизм: ошибка преобразование типа из "ref cl_child" в "ref cl_proto" невозможно
Создал класс предок cl_proto, объявил класс потомок cl_child : cl_proto. Написал отдельную функцию с параметром-типом ref cl_proto - на...

9
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.11.2015, 13:46
Цитата Сообщение от ToLexx Посмотреть сообщение
Помоему я всё правильно понял?!
Немного не так.
ref - переменная инициализируется ВНЕ метода, в методе может изменяться.
out - переменная НЕ инициализируется при объявлении, ОБЯЗАТЕЛЬНО должна быть инициализирована перед возвратом методом управления.
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
19.11.2015, 13:52  [ТС]
переделал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private void correctFMas0(ref List<string> FData, out double TimeADC, out double FreqADC, out int FramesADC, ref bool FHaracters)
        {
            FHaracters = false;
            TimeADC = 5;
            FramesADC = FData.Count;
            FreqADC = 10000;
            if (FData[0] == "Oscilloscope Data File")
            {
                FHaracters = true;
                for (int i = 0; i < 19; i++)
                {
                    if (i == 2)
                        FramesADC = Int16.Parse(FData[0].Replace("Number of frames: ", String.Empty), CultureInfo.InvariantCulture);
                    if (i == 7)
                        FreqADC = 1000 * Double.Parse(FData[0].Replace("Input Rate In kHz: ", String.Empty), CultureInfo.InvariantCulture);
                    if (i == 8)
                        TimeADC = Double.Parse(FData[0].Replace("Input Time In Sec: ", String.Empty), CultureInfo.InvariantCulture);
                    FData.RemoveAt(0);
                }
            }
        }
ошибка исчезла.
Получается инициализировать надо непосредственно внутри функции, во вложенных условиях он не видит что ли?

Добавлено через 1 минуту
Под инициализацией понимаете следующее: int a =10;
соответственно объявление : int a;
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
19.11.2015, 13:56
Цитата Сообщение от ToLexx Посмотреть сообщение
во вложенных условиях он не видит что ли?
видит, но знает, что условие, на то и условие, что его выполнение от чего-то зависит. Ведь если условие не выполнится, то переменная не инициализируется.
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
19.11.2015, 14:03  [ТС]
В принципе понял, беру второй вариант.
А на будущее получается сначала инициализирую, а потом уже условия выкладываю. Если условие выполнится, то отынициализированные вначале значения всё равно изменятся.
Ничего не попутал?

Добавлено через 1 минуту
Кстати ещё вопросик, правда немного не в тему, но всё же:
C#
1
2
3
4
                if(f>0)
                    if (FHaracters)
                        for (int i = 0; i < 19; i++)
                            FData.RemoveAt(0);
Запись правильна? Выполняться последовательно будет?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
19.11.2015, 14:09
Цитата Сообщение от ToLexx Посмотреть сообщение
Ничего не попутал?
Нет, не попутал.
Цитата Сообщение от ToLexx Посмотреть сообщение
Выполняться последовательно будет?
Да. Правда, по кусочку тяжело сказать, но может лучше заменить на
C#
1
2
3
if (f > 0 && FHaracters)
    for (int i = 0; i < 19; i++)
        FData.RemoveAt(0);
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
19.11.2015, 14:17  [ТС]
ага, спс!
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.11.2015, 14:40
Цитата Сообщение от ToLexx Посмотреть сообщение
ref - обязательно объявить и инициализировать в главной функции, там где вызываешь вторичную функцию.
out - в главной ф-ии только объявляешь, инициализация же внутри вызываемой(вторичной) функции.
Помоему я всё правильно понял?!
Так как ref и out применяются к параметрам метода, то и смотрите на них с точки зрения метода:
  • ref — переменная уже проинициализирована.
  • out — неизвестно, была ли переменная проинициализирована при ее передаче в ваш метод, потому считается, что не была. Дальше уже применяются обычные правила переменных шарпа: без инициализации использовать нельзя.
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
19.11.2015, 14:55  [ТС]
Слушайте, а как быть с размерностью массива???
допустим объявляю массива два и вызываемый метод:
C#
1
2
                double[,] masStol, masDUS;
                arr.getMas(listFreq, out masStol, out masDUS);
теперь в методе:
C#
1
2
3
4
5
6
7
8
9
10
11
 public void getMas(List<string> FileList,out double[,] masStol, out double[,] masDUS)
        {
            for (int f = 0; f < FCount; f++)
            { masStol = new double[FramesADC, FCount];
                masDUS = new double[FramesADC, FCount];
                for (int i = 0; i < FramesADC; i++)
                {
                    masStol[i, f] = (Double.Parse(FData[i].Split(" ;:\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0], CultureInfo.InvariantCulture));
                    masDUS[i, f] = (Double.Parse(FData[i].Split(" ;:\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[1], CultureInfo.InvariantCulture));
                }
            }
или мне хоть как-то инициализировать эти массивы?? А так ведь не получится размеры массива узнаю только при прогоне цикла с f.
Можно конечно вне цикла прочитать первый и проинициализировать массивы, тыды ошибки то и не будет, но код увеличится ровно в два раза)))

Добавлено через 10 минут
Туплю!
Сделаю не массив, а список и будет мне счастье)
0
0 / 0 / 1
Регистрация: 20.11.2015
Сообщений: 2
20.11.2015, 21:56
Цитата Сообщение от ToLexx Посмотреть сообщение
for (int f = 0; f < FCount; f++)
{ masStol = new double[FramesADC, FCount];
masDUS = new double[FramesADC, FCount];
....
А зачем FCount раз инициализировать массивы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2015, 21:56
Помогаю со студенческими работами здесь

Ошибка Cannot convert from 'ref decimal' to 'ref decimal?
Здравствуйте подскажите пожалуйста почему в строке this.allTuriPoCeneTableAdapter.FillBy(this.turfirmaDataSet.AllTuriPoCene, ref Cena); ...

Модификаторы
signed, unsigned, long, short. Для его эти модификаторы, я проитал нифига не понял. Объясните

Модификаторы
Народ, помогите до конца разобраться!!! Существуют модификаторы: public protected private static final synchronized ...

модификаторы
Напишите программу, заменяющую в слове X все буквы &quot;а&quot; и &quot;я&quot; на сочетание &quot;йа&quot; помогите найти ошибку в коде procedure...

Модификаторы доступа
На дом задали построить таблицу с модификаторами доступа (из каких классов, пакетов видны переменные с модификаторами доступа). Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru