Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 17

Программа с использованием глобальных переменных. Найти ошибку

02.06.2015, 19:15. Показов 1369. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, помогите, пожалуйста, найти ошибку в простой программе. Хочу создать глобальные переменные, которые можно использовать и в main() и в других функциях.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include < iostream > 
#include <iomanip>
#include <conio.h>
 
#define nMax 30               
#define xyMax 3               
#define xyH (xyMax/nMax)      
#define xyH2 (xyH*xyH)      
using namespace std; 
//double xyH=xyMax/nMax;   //так тоже не работает
int main()
{
    cout<<"nMax="<<nMax<<"  xyMax="<<xyMax<<"  xyH="<<xyH<<"  xyH2="<<xyH2<<endl;
    getche();
return 0;
}
Но в main() значения переменных xyH и xyH2 равны НУЛЮ!!! Почему? Visual Studio Express 2010.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2015, 19:15
Ответы с готовыми решениями:

Объявление глобальных переменных
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main (int x, int y) { printf (&quot;x=&quot;); scanf_s (&quot;x=&amp;d&quot;,...

Инициализация глобальных переменных
Требуется инициализировать 2 массива и 2 переменные, которые используются в 2-х функциях, с клавиатуры, но без передачи их в качестве...

Определение глобальных переменных
Доброго времени суток! Интересует следующий вопрос - Возможно ли определение глобальных переменных в теле подпрограмм или классов? ...

11
24 / 24 / 12
Регистрация: 04.06.2014
Сообщений: 80
02.06.2015, 19:24
так надо
C++
1
double xyH=1.0 * xyMax/nMax;
или так
C++
1
double xyH=(double)xyMax/nMax;
1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
02.06.2015, 20:01
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include < iostream > 
#include <iomanip>
#include <conio.h>
 
#define nMax 30.0 
#define xyMax 3.0
#define xyH (xyMax/nMax) 
#define xyH2 (xyH*xyH) 
using namespace std; 
//double xyH=xyMax/nMax; //так тоже не работает
int main()
{
   cout<<"nMax="<<nMax<<" xyMax="<<xyMax<<" xyH="<<xyH<<" xyH2="<<xyH2<<endl;
   getche();
   return 0;
}
Однако, это не глобальные переменные, а макросы. Т.е., к примеру, вместо nMax просто подставляется 30.0
0
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
02.06.2015, 22:51
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
const int nMax = 30;
const int xyMax=3;
const double xyH((double)xyMax/nMax);
const double xyH2((double)xyH*xyH);
int main()
{
    cout<<"nMax="<<nMax<<"  xyMax="<<xyMax<<"  xyH="<<xyH<<"  xyH2="<<xyH2<<endl;
    getchar();
  return 0;
}
1
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 17
04.06.2015, 19:39  [ТС]
Так что, проблема в преобразовании типов?
0
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
05.06.2015, 15:48
Да.
Будет ли деление нацело или с дробной частью, зависит от операндов - если оба операнда целые, то и результат деления будет целый, нет - дробный.
0
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 17
09.06.2015, 13:41  [ТС]
Уважаемые форумчане, большое спасибо всем за ответы, но проблема не исчезла.
В приведенном ниже коде все работает как надо:
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
#include < iostream > 
#include <iomanip>
#include <conio.h>
using namespace std; 
 
double nMax = 30;               
double xyMax = 3;
double xyH = xyMax/nMax; 
double xyH2 = xyH*xyH;      
 
double first(int k);
 
int main()
{
    cout<<"nMax="<<nMax<<"  xyMax="<<xyMax<<"  xyH="<<xyH<<"  xyH2="<<xyH2<<endl;
    first(3);
    getche();
    return 0;
}
 
double first(int k)
{
    cout<<"nMax="<<nMax<<"  xyMax="<<xyMax<<"  xyH="<<xyH<<"  xyH2="<<xyH2<<endl;
    return 0;
}
И в main(), и в first() глобальные переменные имеют одинаковое значение.

Другая программа, из-за которой я и обратился к вашей помощи:
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
99
100
101
102
#ifdef _DEBUG
#undef _DEBUG
#include <omp.h>
#define _DEBUG
#else
#include <omp.h>
#endif
 
#define _USE_MATH_DEFINES 
#include < cmath > 
#include < iostream > 
#include <iomanip>
#include <fstream>
 
using namespace std; 
 
const int kMax = 256;           //число точек сетки в плоскости предмета и изображения
int nMax = 10;            //"число точек" сетки в плоскости линзы
int xyL = 64;             //координаты вершин квадрата
int xyR = 96;             //координаты вершин квадрата
double R = 0.5;                 //радиус линзы
double R2 = R * R;              //квадрат радиуса линзы      
double lH=( (double) (R / nMax));  //шаг сетки в плоскости линзы
double lH2 = lH * lH;
double xMax = 8.0;               //размер сетки в плоскости предмета и изображения
double kH = double (xMax / kMax); //шаг сетки в плоскости предмета и изображения
double source[kMax][kMax];      //массив интенсивности источника
double image[kMax][kMax];       //массив интенсивности изображения
double Ls = 0.1;
double Li = 0.1;                //расстояния от линзы до предмета и изображения
double Li2 = Li * Li;
double intLens(int xI, int yI); //функция рассчитывает интеграл в плоскости линзы
 
 
int main()
{
    int iX, iY;
    cout<<"lH="<<lH<<"  kH="<<kH<<"  R2="<<R2<<"  nMax="<<nMax<<endl;  // <------------------------------
        
    //задаем квадрат в плоскости предмета
    for (iX=0; iX<=kMax; iX++)  
      for (iY=0; iY<=kMax; iY++)
        source[iX][iY]=0.0;
    
    for (iX=xyL; iX<=xyR; iX++)
      for (iY=xyL; iY<=xyR; iY++)
        source[iX][iY]=1.0;
    
    //записываем массив предмета в текстовый файл
    ofstream outSource("fsource.prn");  //создать объект ofstream
    for (iX=0; iX<=kMax; iX++)
      {
        for (iY=0; iY<=kMax; iY++)
          outSource<<source[iX][iY]<<"  ";
        outSource<<endl;
      }
 
    for (iX=0; iX<=kMax; iX++)
      for (iY=0; iY<=kMax; iY++)
        image[iX][iY]=0.0;
    
    for (iX=kMax-xyR-10; iX<=kMax-xyL+10; iX++)
      for (iY=kMax-xyR-10; iY<=kMax-xyL+10; iY++)
        image[iX][iY]=intLens(iX,iY);
 
    //записываем массив изображения в текстовый файл
    ofstream outImage("fimage.prn");  //создать объект ofstream
    for (iX=0; iX<=kMax; iX++)
      {
        for (iY=0; iY<=kMax; iY++)
          outImage<<image[iX][iY]<<"  ";
        outImage<<endl;
       }
   return 0;
}
 
double intLens(int xI, int yI)
{
    double x, y, x2, y2, ex2;
    double s = 0;
    
    x = -R;  //координата x в плоскости линзы
    cout<<"lH="<<lH<<"  kH="<<kH<<"  R2="<<R2<<"  nMax="<<nMax<<endl;  // <------------------------------
    while (x<=R)
    {
        x2 = x * x;
        ex2 = exp(-x2);
        y=-floor(sqrt(R2-x2)/lH)*lH; //координата y в плоскости линзы
        y2=y*y;
        
        //cout<<"x="<<x<<"  y="<<y<<endl;
        while (x2+y2<=R2)
        {
            s+=ex2*exp(-y2)*source[kMax-xI][kMax-yI];
            y+=lH;
            y2=y*y;
        }
        x+=lH; 
    }
    s*=lH2/Li2;;
   return s;
}
Собственно, интерес представляют две выделенные строчки в main() и в intLens(), смысл которых аналогичен строкам вывода в первой программе. Но во второй программе в main() выдаются те значения, которые и должны быть, а в intLens() опять НУЛИ!!! И проблем преобразования типов, насколько я понимаю, здесь ни причем.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.06.2015, 14:24
Убери выходы за размер выделенной памяти:
Цитата Сообщение от abakankmf Посмотреть сообщение
//задаем квадрат в плоскости предмета
* * for (iX=0; iX<=kMax; iX++)*
* * * for (iY=0; iY<=kMax; iY++)
* * * * source[iX][iY]=0.0;
, и т.д. Последний допустимый индекс kMax - 1.
0
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
09.06.2015, 17:26
Цитата Сообщение от abakankmf Посмотреть сообщение
Собственно, интерес представляют две выделенные строчки в main() и в intLens(), смысл которых аналогичен строкам вывода в первой программе. Но во второй программе в main() выдаются те значения, которые и должны быть, а в intLens() опять НУЛИ!!! И проблем преобразования типов, насколько я понимаю, здесь ни причем.
Не знаю...не знаю...
Миниатюры
Программа с использованием глобальных переменных. Найти ошибку  
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.06.2015, 18:30
Лучший ответ Сообщение было отмечено abakankmf как решение

Решение

Вывод его кода (2-й, в 7 посте) в 10-й студии, debug (1-й скрин, и зависание).
Убираем выходы за размеры массивов (2-й скрин):
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
99
100
101
102
103
104
105
106
107
#ifdef _DEBUG
#undef _DEBUG
#include <omp.h>
#define _DEBUG
#else
#include <omp.h>
#endif
 
#define _USE_MATH_DEFINES 
#include < cmath > 
#include < iostream > 
#include <iomanip>
#include <fstream>
#include <vector>
 
using namespace std; 
 
const int kMax = 256;           //число точек сетки в плоскости предмета и изображения
int nMax = 10;            //"число точек" сетки в плоскости линзы
int xyL = 64;             //координаты вершин квадрата
int xyR = 96;             //координаты вершин квадрата
double R = 0.5;                 //радиус линзы
double R2 = R * R;              //квадрат радиуса линзы      
double lH=( (double) (R / nMax));  //шаг сетки в плоскости линзы
double lH2 = lH * lH;
double xMax = 8.0;               //размер сетки в плоскости предмета и изображения
double kH = double (xMax / kMax); //шаг сетки в плоскости предмета и изображения
double source[kMax][kMax];      //массив интенсивности источника
double image[kMax][kMax];       //массив интенсивности изображения
double Ls = 0.1;
double Li = 0.1;                //расстояния от линзы до предмета и изображения
double Li2 = Li * Li;
double intLens(int xI, int yI); //функция рассчитывает интеграл в плоскости линзы
 
 
 
 
int main()
{
    int iX, iY;
    cout<<"main  " << "lH="<<lH<<"  kH="<<kH<<"  R2="<<R2<<"  nMax="<<nMax<<endl;  // <------------------------------
        
    //задаем квадрат в плоскости предмета
    for (iX=0; iX<kMax; iX++)  
      for (iY=0; iY<kMax; iY++)
        source[iX][iY]=0.0;
    
    for (iX=xyL; iX<=xyR; iX++)
      for (iY=xyL; iY<=xyR; iY++)
        source[iX][iY]=1.0;
    
    //записываем массив предмета в текстовый файл
    ofstream outSource("fsource.prn");  //создать объект ofstream
    for (iX=0; iX<kMax; iX++)
      {
        for (iY=0; iY<kMax; iY++)
          outSource<<source[iX][iY]<<"  ";
        outSource<<endl;
      }
 
    for (iX=0; iX<kMax; iX++)
      for (iY=0; iY<kMax; iY++)
        image[iX][iY]=0.0;
    
    for (iX = kMax-xyR-10; iX <= kMax-xyL+10; iX++)
      for (iY = kMax-xyR-10; iY <= kMax-xyL+10; iY++)
        image[iX][iY] = intLens(iX,iY);
 
    //записываем массив изображения в текстовый файл
    ofstream outImage("fimage.prn");  //создать объект ofstream
    for (iX=0; iX<kMax; iX++)
      {
        for (iY=0; iY<kMax; iY++)
          outImage<<image[iX][iY]<<"  ";
        outImage<<endl;
       }
   
    system("pause");
    return 0;
}
 
double intLens(int xI, int yI)
{
    double x, y, x2, y2, ex2;
    double s = 0;
    
    x = -R;  //координата x в плоскости линзы
    cout << "intLens  " << "lH="<<lH<<"  kH="<<kH<<"  R2="<<R2<<"  nMax="<<nMax<<endl;  // <------------------------------
    while (x<=R)
    {
        x2 = x * x;
        ex2 = exp(-x2);
        y=-floor(sqrt(R2-x2)/lH)*lH; //координата y в плоскости линзы
        y2=y*y;
        
        //cout<<"x="<<x<<"  y="<<y<<endl;
        while (x2+y2<=R2)
        {
            s+=ex2*exp(-y2)*source[kMax-xI][kMax-yI];
            y+=lH;
            y2=y*y;
        }
        x+=lH; 
    }
    s*=lH2/Li2;;
   return s;
}
Миниатюры
Программа с использованием глобальных переменных. Найти ошибку   Программа с использованием глобальных переменных. Найти ошибку  
1
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 17
09.06.2015, 18:55  [ТС]
Спасибо, все заработало. Зацикливание происходило как раз из-за нулевых значений. Непонятно только как связаны эти две проблемы.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.06.2015, 19:24
Цитата Сообщение от abakankmf Посмотреть сообщение
Непонятно только как связаны эти две проблемы.
Выход за пределы выделенной памяти - это UB. А UB - это и есть - UB.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2015, 19:24
Помогаю со студенческими работами здесь

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

Поиск глобальных переменных
Есть задачка, которую не могу решить. Дано 9000 .cpp файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для...

Использование глобальных переменных - моветон ли?
Ребят, очень часто вижу как отцы С++, когда проверяют чей-то код и обнаруживают там глобальные переменные, заявляют, что это не хорошо, что...

Исправить без использования глобальных переменных
#include&lt;iostream&gt; using namespace std; int a,n,maximum=-1000,x; void zapros() { cout&lt;&lt;&quot;Vvedite razmer massiva&quot;&lt;&lt;endl; } ...

Вынос глобальных переменных в отдельный файл
Всем привет! Вопрос такой - сижу разбираюсь с вынесением функций в отдельные файлы. Что удалось выяснить - подключая через #include файл...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru