Форум программистов, компьютерный форум CyberForum.ru

Изменение переменной во вложенном цикле - C++

Восстановить пароль Регистрация
 
Gefecht
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 4
12.12.2012, 19:43     Изменение переменной во вложенном цикле #1
Всем доброго времени!

Возникла загадочная проблема (загодочная для меня, думаю тут найдутся более опытные )

Есть прога, она должна анализировать метео данные за 300 лет. Ошибка возникает во время выполения циклов, которые приведены ниже. Переменная n=268, во время выполнения этих циклов она меняет своё значение.
Чтобы это отследить, вывел данные о ней в файл.
C++
1
(logg<<n<<"\n";)
Что мы в нём видим:

100
100
-1072524046
-1072524046
-1072524046
-1072524046
-1072524046
-1072524046
-1072524046
-1072524046
-1072524046

Получается, что после того, как внешний цикл прокручивается 2 раза, переменная меняет значение и больше во вложенный цикл не попасть.

Вопрос к знатокам, чем вызвана эта ошибка, как поправить?

ЗЫ

Если в начале внешнего цикла дописываю n=268, при компиляции возникает ошибка (dev C++).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
             
for(jwj=1;jwj <12 ;jwj++)
{
    r=0;
       for(r=0;r <n ;r++)
          {
              qo++;
              if (a[r][jwj]!=-999.9) summ=summ+a[r][jwj];
              else prop=prop+1; 
              if (qo==30) 
              {               
                  sred=summ/(qo-prop);
                  b[d][jwj-1]=sred;
                  d++;
                  qo=0;
                  prop=0;
                  summ=0;
                  r=r-29;                         
              }       
       }
logg<<n<<"\n";
}

Заранее спасибо!

Добавлено через 1 час 26 минут
Поэксперементировав, думаю, что проблема связана с величеной массивов, видимо память выделяется как-то коряво. Как можно увеличить размер выделяемой памяти, или всё-таки дело в чём-то ещё?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2012, 19:43     Изменение переменной во вложенном цикле
Посмотрите здесь:

C++ Определение переменной в цикле
C++ Изменение строки в цикле
Исключение при создании переменной в цикле C++
C++ Определение значения переменной в цикле
Использование переменной типа char в цикле for C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dikanev
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
12.12.2012, 20:20     Изменение переменной во вложенном цикле #2
Информации не достаточно. Где описывается n? Почему вы решили, что оно равно 298? В общем, нужна программа целиком.
Gefecht
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 4
12.12.2012, 22:55  [ТС]     Изменение переменной во вложенном цикле #3
n просто задана изначально. Для того, чтоб было понятно - прога должа вычислять тридцатилетние скользящие средние по месяцам, с учётом пробелов, где данных нет (-999.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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <cstdlib>
#include <iostream>
#include <fstream> 
#include <string>
using namespace std;
 
int main(int argc, char *argv[])
{
                 int d=0;
                 int jj;
                 int n = 268;
                 int m = 13;
                 double summ = 0;
                 int prop = 0;
                 int qo = 0;
                 double a[280][13];
                 double b[280][13];
                 double sred = 0;
                 int jwj;
                 int r;
                 
 
                 std::FILE * rez = 
                 rez = std::fopen("rez.csv", "w");       
                 
                 std::FILE * fp = 
                 fp = std::fopen("T_spb.dat", "r");
 
                 std::FILE * log = 
                 log = std::fopen("log.txt", "w");
                
 
    rewind(fp);
 
 
    ifstream ifs("T_spb.dat");
    for (int i = 0; i < n; ++i)
     for(int j = 0; j < m; ++j)
     ifs >> a[i][j];
 
    ofstream rezt ("rez.csv"); 
    ofstream logg ("log.txt"); 
 
    rezt<<sred<<";;"<<"\n";
jwj=1;
 
for(jwj=1;jwj <12 ;jwj++)
{
       for(r=0;r <n ;r++)
          {
              qo++;
              if (a[r][jwj]!=-999.9) summ=summ+a[r][jwj];
              else prop=prop+1; 
              if (qo==30) 
              {               
                  sred=summ/(qo-prop);
                  b[d][jwj-1]=sred;
                  
                  d++;
                  qo=0;
                  prop=0;
                  summ=0;
                  r=r-29;                         
              }
              
       }
 
    logg<<n<<"\n";   
 
 
}
 
 
jj=0;
 
          
for(; ;)
{
     
      for (int i = 0; i < 12; i++){
            rezt<<b[jj][i]<<";";
       }
    
rezt<<sred<<"\n";  
 
if (jj==d-1) break;
else
jj++;
}
         
 
                 fclose(fp);
                 fclose(log);
                fclose(rez);
                rezt.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}
dikanev
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
12.12.2012, 23:33     Изменение переменной во вложенном цикле #4
Проблема в
C++
1
2
b[d][jwj-1]=sred;
d++;
d постоянно растет и вскоре ты выходишь за пределы массива.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.12.2012, 23:40     Изменение переменной во вложенном цикле #5
Цитата Сообщение от Gefecht Посмотреть сообщение
чем вызвана эта ошибка, как поправить?
У Вас распостраненный случай: выход за границы массива (за границы выделенной памяти), поэтому переменная n и меняет свое значение. См комментарии:
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
for(jwj=1;jwj <12 ;jwj++)
{
       for(r=0;r <n ;r++)
          {
              qo++;           
              if (a[r][jwj]!=-999.9) summ=summ+a[r][jwj];
              else prop=prop+1; 
              if (qo==30) 
              {               
                  sred=summ/(qo-prop);
                  
                  b[d][jwj-1]=sred;
                  logg<<"d= "<<d<<endl;//вставьте эту строку и сами убедитесь
                  
                  d++;// если вы думаете, что при  jwj==1 переменная d изменит свое значение примерно до 8, то Вы глубоко заблуждаетесь
                  qo=0;
                  prop=0;
                  summ=0;
                  r=r-29;// за счет уменьшения счетчика r вот здесь, qo будет равным 30 при jwj==1 очень много раз. Соответственно переменная d превысит 280 уже при jwj равной 2
              }
              
       }
 
    logg<<n<<"\n";   
 
 
}
Gefecht
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 4
12.12.2012, 23:55  [ТС]     Изменение переменной во вложенном цикле #6
!!!! Вот я дурак,спасибо что помогли разобраться.
Yandex
Объявления
12.12.2012, 23:55     Изменение переменной во вложенном цикле
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru