4 / 4 / 0
Регистрация: 19.08.2013
Сообщений: 138
1

В определенный момент массив почему-то обнуляется

14.10.2017, 21:59. Показов 1781. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот листинг:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream> 
#include <iostream> 
using namespace std;
double _AverageGain[7776][45];
 
void main()
{
    int Digit[5];
    ifstream fin("d:\\File.txt"); // В файле дробные числа через пробел
    for (Digit[0] = 0; Digit[0] < 6; Digit[0]++)
        for (Digit[1] = 0; Digit[1] < 6; Digit[1]++)
            for (Digit[2] = 0; Digit[2] < 6; Digit[2]++)
            {
                for (Digit[3] = 0; Digit[3] < 6; Digit[3]++)
                    for (Digit[4] = 0; Digit[4] < 6; Digit[4]++)
                        for (int j = 0; j < 45; j++)
                            fin >> _AverageGain[Digit[0] * 6 * 6 * 6 + Digit[1] * 6 * 6 + Digit[2] * 6 + Digit[3]][j];
                cout << _AverageGain[Digit[0] * 6 * 6 * 6 + Digit[1] * 6 * 6 + Digit[2] * 6 + Digit[3]][0] << endl; // Вместо
                                                                       // элемента массива, полученного из файла, выводит ноль
            }
    system("pause");
}

Но если переместить вывод на один уровень вложенности ниже, но всё работает:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream> 
#include <iostream> 
using namespace std;
double _AverageGain[7776][45];
 
void main()
{
    int Digit[5];
    ifstream fin("d:\\File.txt"); // В файле дробные числа через пробел
    for (Digit[0] = 0; Digit[0] < 6; Digit[0]++)
        for (Digit[1] = 0; Digit[1] < 6; Digit[1]++)
            for (Digit[2] = 0; Digit[2] < 6; Digit[2]++)
                for (Digit[3] = 0; Digit[3] < 6; Digit[3]++)
                {
                    for (Digit[4] = 0; Digit[4] < 6; Digit[4]++)
                        for (int j = 0; j < 45; j++)
                            fin >> _AverageGain[Digit[0] * 6 * 6 * 6 + Digit[1] * 6 * 6 + Digit[2] * 6 + Digit[3]][j];
                    cout << _AverageGain[Digit[0] * 6 * 6 * 6 + Digit[1] * 6 * 6 + Digit[2] * 6 + Digit[3]][0] << endl;
                                                                   // А так - всё прекрасно, выводит число из файла
                }
    system("pause");
}

Почему это происходит и как это победить? Если что, компиляю в VS 2017.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2017, 21:59
Ответы с готовыми решениями:

Почему массив не обнуляется
Не знаю почему массив не обнуляется. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt;...

Почему массив путей файлов не обнуляется при выходе из программы
Foreach считывает файлы по циклу в папке, но т.к. их бывает много то сделана сортировка по дате....

Не обнуляется таймер почему-то
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=True; ...

Почему все обнуляется???
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; // прототипы функций void input ( float , char);...

8
1392 / 1021 / 325
Регистрация: 28.07.2012
Сообщений: 2,810
14.10.2017, 23:25 2
fingolfin_, ты уверен, что в файле не менее 349920 чисел?
0
4 / 4 / 0
Регистрация: 19.08.2013
Сообщений: 138
14.10.2017, 23:34  [ТС] 3
nonedark2008, да, ровно 349920. Не думаю, что проблема в файле, так как он заполнялся таким же циклом с помощью ofstream.

Добавлено через 5 минут
В принципе, я бы мог работать напрямую с массивом и не использовать файл, но мне интересно. Лично для меня это очень странная и необычная проблема.
0
18473 / 9630 / 2356
Регистрация: 30.01.2014
Сообщений: 16,883
15.10.2017, 00:08 4
Лучший ответ Сообщение было отмечено fingolfin_ как решение

Решение

Цитата Сообщение от fingolfin_ Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
            for (Digit[2] = 0; Digit[2] < 6; Digit[2]++)
            {
                for (Digit[3] = 0; Digit[3] < 6; Digit[3]++)
                    for (Digit[4] = 0; Digit[4] < 6; Digit[4]++)
                        for (int j = 0; j < 45; j++)
                            fin >> _AverageGain[Digit[0] * 6 * 6 * 6 + Digit[1] * 6 * 6 + Digit[2] * 6 + Digit[3]][j];
                cout << _AverageGain[Digit[0] * 6 * 6 * 6 + Digit[1] * 6 * 6 + Digit[2] * 6 + Digit[3]][0] << endl; 
            }
Наводящий вопрос: чему на момент вывода в cout равно Digit[3]?
2
4 / 4 / 0
Регистрация: 19.08.2013
Сообщений: 138
15.10.2017, 00:52  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
Наводящий вопрос: чему на момент вывода в cout равно Digit[3]?
Я правильно понимаю, что будет равен 6? Оказывается, всё так банально . Но ведь я пробовал разные варианты...
Но теперь у меня возникло еще 3 вопроса:
1) Почему VS не ругается на использование неинициализированного элемента массива?
2) Почему расположение cout влияет на результат? Ведь если положить, что еще неинициализированный элемент будет выводиться как 0, то 0 должен быть в обоих случаях.
3) Насколько я понимаю, этот код
C++
1
2
    for (int i = 0; i < 45; i++)
        cout << _AverageGain[0][i] << " ";
должен вывести первые 45 чисел из файла, но на деле выводятся какие-то другие числа.
0
18473 / 9630 / 2356
Регистрация: 30.01.2014
Сообщений: 16,883
15.10.2017, 01:06 6
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Почему VS не ругается на использование неинициализированного элемента массива?
Потому что он не обязан ругаться. Язык с возможностью прямой работы с памятью требует дисциплины и ответственности от программиста.

Цитата Сообщение от fingolfin_ Посмотреть сообщение
Почему расположение cout влияет на результат?
Потому что во втором твоем примере корректный результат всех трех Digit[0], Digit[1], Digit[2] и Digit[3] контролируется условиями циклов.

Цитата Сообщение от fingolfin_ Посмотреть сообщение
если положить, что неинициализированный элемент будет выводиться как 0, то 0 должен быть в обоих случаях.
Нет, так нельзя положить. Вывод неициализированного значения - это UB.

Цитата Сообщение от fingolfin_ Посмотреть сообщение
должен вывести первые 45 чисел из файла, но на деле выводятся какие-то другие числа.
Это потому, что у тебя есть еще один цикл
Цитата Сообщение от fingolfin_ Посмотреть сообщение
C++
1
for (Digit[4] = 0; Digit[4] < 6; Digit[4]++)
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Но ведь я пробовал разные варианты...
Нельзя программировать методом тыка. Не можешь удержать в голове работу с таким большим массивом (что вполне резонно), сделай массив обозримо меньше и распиши на бумажке итерации.
1
4 / 4 / 0
Регистрация: 19.08.2013
Сообщений: 138
15.10.2017, 14:59  [ТС] 7
Спасибо, теперь все проблемы решены!
Цитата Сообщение от DrOffset Посмотреть сообщение
Нельзя программировать методом тыка.
Почему же нельзя? Написать код, попробовать собрать, запустить, потом исправить ошибки и по новой, нет? У меня пока очень редко получается, что бы написанный код сразу работал без ошибок. Обычно я такие ошибки по невнимательности сразу сам исправляю, но здесь две ошибки (неучитывание Digit[4] в выражении и вывод неинициализированного значения) наложились и совсем сбили меня с толку. Спасибо за разъяснения!
0
1392 / 1021 / 325
Регистрация: 28.07.2012
Сообщений: 2,810
15.10.2017, 15:13 8
Цитата Сообщение от fingolfin_ Посмотреть сообщение
потом исправить ошибки и по новой
Метод тыка - это когда ты не знаешь, где находится ошибка, и начинаешь исправлять случайные места.
Как раз твой случай:
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Но если переместить вывод на один уровень вложенности ниже, но всё работает
Ты что-то поменял в случайном месте, а потом уверовал, что "все" стало работать. Такой подход приводит к еще большему непониманию и еще большему количеству ошибок.
1
18473 / 9630 / 2356
Регистрация: 30.01.2014
Сообщений: 16,883
15.10.2017, 15:14 9
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Почему же нельзя? Написать код, попробовать собрать, запустить, потом исправить ошибки и по новой, нет? У меня пока очень редко получается, что бы написанный код сразу работал без ошибок.
Потому что это контрпродуктивно. И делает тебя зависимым от случая. Верно работающий код не гарантия, что в нем нет ошибок. UB может и совершенно ожидаемым образом проявляться, создавать видимость работы (до поры). Поэтому ты должен понимать от и до что у тебя в программе происходит, а не проверять корректность методом тыка. И дело не в возможности писать код сразу без ошибок, речь не об этом, а в возможности понять, что у тебя в коде не так не только на основе многочисленных проб, а на основе понимания того как программа работает и должна работать. Поэтому, если ты не понимаешь как она работает, надо сесть и разобраться, а не мучить компилятор запусками в надежде, что сработает.
1
15.10.2017, 15:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2017, 15:14
Помогаю со студенческими работами здесь

Почему обнуляется поле?
Семейство плееров Walkman. tpsl2 - древний. E440 - современный. Хочу два раза увеличить...

Обнуляется переменная почему ?
var user .. var// global _getObjectSet : Array_of_Vehicle; i:integer; ...... procedura 1...

Почему поинтер обнуляется ?
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() {...

Почему мой указатель обнуляется?
Почему мой указатель обнуляется на какой-то итерации? задача: Функцию, которая возвращает среднее...

Почему не обнуляется указатель через функцию?
В функцию передаю указатель на целое число, хочу удалить память а сам указатель установить в NULL. ...

Почему обнуляется лист в экземпляре класса? О.о
Добрый день! Понимаю что вопрос простой, но хоть убей в голове не укладывается, почему при...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru