Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764

Почему не выполняется вложенный цикл for?

24.05.2017, 21:48. Показов 5785. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,
подскажите почему у меня не заходит внутрь второго цикла For ?

Смысл такой - у меня есть массив arrData и мне нужно пробежаться по нему по строкам и по столбцам

C#
1
2
3
4
5
6
7
 for (int iRow = 2; iRow <= TotalRows; iRow++) //по строкам
   {
                for (int iCol = 2; iCol <= 4; iCol++) //по столбцам     
                {
                    //сюда вообще не заходит                    
                }               
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2017, 21:48
Ответы с готовыми решениями:

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { TreeControlItem childNode = default(TreeControlItem);...

Вложенный цикл выполняется всего один раз
есть вот такой цикл. на вход поступает массив интов из 5 элементов. по идее код должен вывести этот массив 5 раз. но вложенный цикл не...

Почему while не прекращает вложенный цикл?
double test; while (test&lt;=500) { for (test=0; test&lt;=600; test +=1) cout &lt;&lt; &quot;Итерация №&quot; &lt;&lt; test &lt;&lt; &quot;\n&quot;; ...

18
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
24.05.2017, 22:12
в этом куске кода все правильно, если конечно TotalRows >2, иначе вообще в цикл входа не будет
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
24.05.2017, 22:20  [ТС]
Вот и я так думал, но цикл доходит до этой строки

for (int iCol = 2; iCol <= 4; iCol++) //по столбцам

по нему проходится 3 раза и возвращается в строку выше

for (int iRow = 2; iRow <= TotalRows; iRow++) //по строкам

TotalRows = 81

вот весь код

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
25
26
27
28
int TotalRows = arrData.GetUpperBound(0); // тут значение 81 получает переменная
 
            if (dbConn.State != ConnectionState.Open) dbConn.Open();
 
            for (int iRow = 2; iRow <= TotalRows; iRow++) //по строкам
            {
                for (int iCol = 2; iCol <= 4; iCol++) //по столбцам     
                {
                    //сюда вообще не заходит
                    TextToSearch = arrData[iRow, iCol].ToString().Trim();
                    if (string.IsNullOrEmpty(TextToSearch) && Char.IsDigit(TextToSearch, 1))
                    {
                        TextToSearch = "'" + TextToSearch + "'";        
                        sqlCmd = new SQLiteCommand("SELECT * FROM " + tableName + " WHERE [SN] = " + TextToSearch + " OR [IMEI1] = " + TextToSearch + " OR [IMEI2] = " + TextToSearch, dbConn);
                        FoundResult = sqlCmd.ExecuteScalar();
                        if (FoundResult != null)
                        {
                            arrData[iRow, 5] = "Наш!";
                            break;
                        }
                        else
                        {
                            arrData[iRow, 5] = "Не наш!";
                        }
                        progressBar1.Value = iRow;
                    }
                }               
            }
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
24.05.2017, 22:35
похожее поведение встречал, если напутать со скобками(фигурными), когда компилятор считает что то, что в скобках после for сам по себе блок(и for как бы пустой), и не относится к for... так то все вроде правильно, как минимум заходить должен
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
24.05.2017, 22:39  [ТС]
выше есть только 1 фигурная скобка у

C#
1
2
3
4
private void btn_CheckListIMEI_Click(object sender, EventArgs e)
        {
 
        }
т.е. мой код находится внутри эти скобок и всё... А так проверил все скобки - они одна под одной (в Студии они пунктирными линиями отмечаются одна под одной)
что делать... не понятно (((
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
25.05.2017, 00:14
попробуй для теста убить внутренности 2го фора, заменив на mbox.show(), например, просто что б удостовериться, что заход есть...прям чудеса какие-то...перезагрузись что-ли
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.05.2017, 01:24
Цитата Сообщение от Pavel55 Посмотреть сообщение
сюда вообще не заходит
В первую очередь надо узнать как именно это было определено.
Одно дело — выполнение на заходит; и совсем другое — выполнение заходит, но эффект не соответствует ожиданиям.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
25.05.2017, 07:30
Во вторую очередь, было бы неплохо научиться пользоваться отладчиком. Тогда можно не только узнать "заходит""не заходит", но посмотрев на содержимое переменных\полей, понять почему.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.05.2017, 10:15  [ТС]
Проверяю просто - ставлю точку останова на строке

if (dbConn.State != ConnectionState.Open) dbConn.Open();

а далее нажимаю много раз кнопку F11

отладчик доходит до строки

for (int iCol = 2; iCol <= 4; iCol++) //по столбцам

потом по ней делает шаги 3 раза по iCol++ (т.е. внутри этой строки) и возвращается на строку выше

for (int iRow = 2; iRow <= TotalRows; iRow++) //по строкам

по F11 - не проваливается ниже (не заходит внутрь второго цикла)
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
25.05.2017, 10:18
Pavel55, ну так вы смотрите на содержимое переменных и вам сразу всё станет ясно...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.05.2017, 10:26
Pavel55, сможете скопировать сюда нерабочий код?
Без добавления коментариев и вообще какого-либо изменения, просто взять только что проверенный неработающий код и скопировать его.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.05.2017, 10:28  [ТС]
Я сейчас закоментировал второй цикл по столбцам и получаю вот это - см. фотку
Миниатюры
Почему не выполняется вложенный цикл for?  
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.05.2017, 10:34  [ТС]
Вот код.

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
25
26
 if (dbConn.State != ConnectionState.Open) dbConn.Open();
            int TotalRows = arrData.GetUpperBound(0);            
            for (int iRow = 2;  iRow <= TotalRows; iRow++) //по строкам
            {
                for (int iCol = 2; iCol <= 4; iCol++) //по столбцам
                {
                        TextToSearch = arrData[iRow, 2].ToString().Trim();                    
                    if (string.IsNullOrEmpty(TextToSearch) && Char.IsDigit(TextToSearch,1))
                    {
                        TextToSearch = "'" + TextToSearch + "'";
                        //TextToSearch = arrData[iRow, 2].ToString().Trim();                
                        sqlCmd = new SQLiteCommand("SELECT * FROM " + tableName + " WHERE [SN] = " + TextToSearch + " OR [IMEI1] = " + TextToSearch + " OR [IMEI2] = " + TextToSearch, dbConn);
                        FoundResult = sqlCmd.ExecuteScalar();
                        if (FoundResult != null)
                        {
                            arrData[iRow, 5] = "Наш!";
                            break;
                        }
                        else
                        {
                            arrData[iRow, 5] = "Не наш!";                            
                        }
                        progressBar1.Value = iRow;
                    }
                }                
            }
Снял комментарии и получил вот такую ошибку
Миниатюры
Почему не выполняется вложенный цикл for?  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.05.2017, 10:37
Цитата Сообщение от Pavel55 Посмотреть сообщение
Снял комментарии и получил вот такую ошибку
Похоже, у вас где-то произошла рассинхронизация символов отладки с компилированным приложением.
Попробуйте сделать следующее:
1. Закройте студию
2. Из папки проекта удалите папки bin и obj
3. Запустите студию, перестройте проект и снова попробуйте пошаговую отладку.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.05.2017, 13:38  [ТС]
kolorotur, да, видно какой-то глюк. Сейчас попробую.
Для проверки сделал вот так. Всё работает идеально

C#
1
2
3
4
5
6
7
8
9
 int TotalRows = arrData.GetUpperBound(0);            
            for (int iRow = 2;  iRow <= TotalRows; iRow++) //по строкам
            {
                for (int iCol = 2; iCol <= 4; iCol++) //по столбцам
                {
                    MessageBox.Show("Если ты читаешь это сообщение, то программа зашла во второй цикл " + Environment.NewLine + "iRow = " + iRow.ToString() + "; iCol = " + iCol.ToString());
                    //return;
                }                
            }


К сожалению, удаление папок bin и obj ничего не дало.
Но удалось локализовать проблему. Может кто подскажет, что я делаю не так

Код не работает из-за строки

TextToSearch = arrData[iRow, iCol].ToString().Trim();

что в ней не так? arrData - двумерный массив данных с Excel листа. Данные в нём есть. Получаю их так

var arrData = (object[,])xlSht.Range["A1:E" + iLastRow].Value;

arrData.GetUpperBound(0) - даёт число 80.

вот этот код не работает.
C#
1
2
3
4
5
6
7
8
 for (int iRow = 2;  iRow <= arrData.GetUpperBound(0); iRow++) //по строкам
            {
                for (int iCol = 2; iCol <= 4; iCol++) //по столбцам
                {
                    TextToSearch = arrData[iRow, iCol].ToString().Trim(); //ЕСЛИ ЗАКОММЕНТИРОВАТЬ ЭТУ СТРОКУ, ТО РАБОТАЕТ
                    MessageBox.Show("второй цикл");                    
                }
            }
Миниатюры
Почему не выполняется вложенный цикл for?  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.05.2017, 13:48
Цитата Сообщение от Pavel55 Посмотреть сообщение
Код не работает из-за строки
Это уже другая проблема, не имеющая отношения к изначальной.
Данное исключение вылетает из-за того, что либо элемент arrData[iRow, iCol] не инициализирован (null), либо метод ToString возвращает null.
1
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.05.2017, 14:13  [ТС]
kolorotur,
Цитата Сообщение от kolorotur Посмотреть сообщение
либо метод ToString возвращает null.
Вы правы. У меня некоторые ячейки в Excel файле пустые и когда я забираю их в массив строкой
var arrData = (object[,])xlSht.Range["A1:E" + iLastRow].Value;
то пустые ячейки имеют в массиве значение null.
Видно из-за этого и не работает второй цикл.
Только компилятор указывает не на строку
TextToSearch = arrData[iRow, iCol].ToString().Trim();
а жёлтым указывает на второй цикл и пишет "Ссылка на объект не указывает на экземпляр объекта"

А как мне тогда обратится ко всем элементам массива в цикле, если некоторые элементы этого двумерного массива имеют значение null ?

P.S. Не хотелось бы (и считаю неправильным) писать ненужную информацию в Excel файл, нужно как-то в коде обойти это
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.05.2017, 14:33
Цитата Сообщение от Pavel55 Посмотреть сообщение
А как мне тогда обратится ко всем элементам массива в цикле, если некоторые элементы этого двумерного массива имеют значение null ?
Перед тем, как работать с элементом массива, сделайте проверку на null.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.05.2017, 14:36  [ТС]
Да, спасибо.

if (arrData[iRow, iCol] != null)

помогло
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2017, 14:36
Помогаю со студенческими работами здесь

Почему не выполняется цикл?
Здравствуйте. Вот код: int main() { vector &lt;Book&gt; books; Book item = Book(); bool flag = true; char ans =...

Почему цикл не выполняется?
for (shet = 1; shet == 2; shet++) { string s = { &quot;q&quot;, &quot;w&quot;, &quot;e&quot;, &quot;r&quot;, &quot;t&quot;, &quot;y&quot;, &quot;a&quot;, &quot;s&quot;, &quot;d&quot;, &quot;f&quot; }; string s1 = s; ...

Почему не выполняется цикл?
Есть цикл while (rd.Read()) он выполняется в том случае если я ввиду логин который уже есть в базе данных, а мне нужно чтобы цикл...

Почему цикл for выполняется 2 раза?
Добрый день.:)Помогите пожалуйста разобраться в данном коде: class ForTest{ public static void main(String args) throws...

Почему цикл выполняется бесконечно?
Объясните кто-нибудь, почему этот код #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main() { int array1; ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
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),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru