С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/391: Рейтинг темы: голосов - 391, средняя оценка - 4.59
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435

Неинициализированные локальные переменные

03.03.2011, 23:34. Показов 74385. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Меня интересует как обходить данные ошибки. В чем соль ошибок?
Проблема даже не в том что они есть, а то что компилятор останавливается и предлагает "продолжить" или "прервать" компиляцию, конечно если жать продолжить то программа выполняет код (в моём случае цикла) и выдаёт совершенно "не результат вычислений" а -1.#INFOO и -1.#INDOO что это означает??

1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\kyrsovik\kyrsovik\module2. cpp(37): warning C4700: использована неинициализированная локальная переменная "y"
1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\kyrsovik\kyrsovik\module2. cpp(39): warning C4700: использована неинициализированная локальная переменная "i"
1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\kyrsovik\kyrsovik\module2. cpp(40): warning C4700: использована неинициализированная локальная переменная "sum"
Заранее благодарю за ответы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2011, 23:34
Ответы с готовыми решениями:

Неинициализированные локальные переменные warning C4700
// Laboratornaa.cpp: определяет точку входа для консольного приложения. // #include"stdafx.h" #include<iostream> ...

Неинициализированные переменные
пишет типа не инициализированы d1 и d2,хотя они объявлены#include "iostream" using namespace std; struct Distance { int feet; ...

Ошибка: неинициализированные переменные
Требовалось оформить класс ORDER, ошибка на 103-ей строке про неинициализированные переменные, помогите исправить. #include...

22
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
04.03.2011, 00:25
Цитата Сообщение от Leningradeс Посмотреть сообщение
Меня интересует как обходить данные ошибки.
Инициализировать переменные.
Цитата Сообщение от Leningradeс Посмотреть сообщение
В чем соль ошибок?
В том, что в неинициализированных переменных содержится мусор.
C++
1
2
3
// неправильно
int sum;
sum+= 10;
C++
1
2
3
// правильно
int sum = 0;
sum+= 10;
2
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 00:42  [ТС]
Спасибо. Ясно. Но допустим у меня есть код:

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
#include "modules.h"
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <conio.h>
//#define EPS 1.e-6
 
namespace Modules
{
    int fact (int n)
    {
        int result = 1;
        for (int i = n; i >= 1; i --)
        {
            result *= i;
        }
        return result;
    }
    void module2 ()
    {           
        fflush (stdin);
        setlocale ( LC_ALL, "Russian" );
        system ("cls");
        time_t d;
        time (&d);
        printf ("%s\n", ctime (&d));
        printf ("________________________________________________________________________________\n");
        float x, y, sum, eps = 0.00001;
        int cx, i, n;
        printf ("Введите x : ");
        cx = scanf ("%f", &x);
        if (cx != 1)
        {
            printf ("Ошибка! Вводите только цифры!\n");
        }
        for (n = 0; fabs (y) > eps && n < 500; n ++) //ТУТ ТЕЙЛОР
        {
            y = (pow ((-1.), n) * pow (x, (2 * n))) / fact (n);
            sum += y;
        }
        printf ("\nF (x) = %f\n", sum);
        printf ("\ny = %f\n", y);
        printf ("\nВычисления завершены. Пересчитать? Да - 1 / Нет - 2\n");
        i = getche ();
        switch (i)
        {
            case '1': Modules::module2 (); break;
            case '2': return;
            default: system ("cls"); printf ("Ошибка!\n\n");
        }
    }
}
Проблема в том что если инициализировать переменные (таким способом какой вы предложили, ну я его в принципе и знал) то результат будет "0.000000". Если не инициализировать то при компиляции бесконечное кол-во предложений "продолжить" или "прервать" не смотря на "засираемую" переменную, что приводит к результату вычислений -1.#INFOO и -1.#INDOO

Код не рабочий я к нему факториал приклеиваю сейчас... Вот вся формула:



Помогите добиться правильных вычислений.
0
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 01:17  [ТС]
Точнее при неправильном коде бесконечный пересчет, сейчас код более менее отрегулирован... и работает, но с ответами что то не так...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.03.2011, 02:54
C++
1
for (n = 0; fabs (y) > eps && n < 500; n ++) //ТУТ ТЕЙЛОР
y неинициализированная

Цитата Сообщение от Leningradeс
Проблема в том что если инициализировать переменные
если инициализировать переменные, то будет всё точно, если не инициализировать переменные, то будет что-то непредсказуемое, так как случайное значение в неинициализированной переменной может различаться между запусками программы
1
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 03:03  [ТС]
Там не чего не инициализировано... Просто не решает в любых вариантах.

Вот инициализировано всё)) А в цикле смысл значение ставить?
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
#include "modules.h"
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <conio.h>
//#define EPS 1.e-6
 
namespace Modules
{
        int fact (int n)
        {
                int result = 1;
                for (int i = n; i >= 1; i --)
                {
                        result *= i;
                }
                return result;
        }
        void module2 ()
        {                       
                fflush (stdin);
                setlocale ( LC_ALL, "Russian" );
                system ("cls");
                time_t d;
                time (&d);
                printf ("%s\n", ctime (&d));
                printf ("________________________________________________________________________________\n");
                float x, y = 0, sum = 0; //ИНИЦИАЛИЗАЦИЯ
                const float eps = 0.00001; 
                int cx, i, n;
                printf ("Введите x : ");
                cx = scanf ("%f", &x);
                if (cx != 1)
                {
                        printf ("Ошибка! Вводите только цифры!\n");
                }
                for (n = 0; fabs (y) > eps && n < 500; n ++) //ТУТ ТЕЙЛОР
                {
                        y = (pow ((-1.), n) * pow (x, (2 * n))) / fact (n);
                        sum += y;
                }
                printf ("\nF (x) = %f\n", sum);
                printf ("\ny = %f\n", y);
                printf ("\nВычисления завершены. Пересчитать? Да - 1 / Нет - 2\n");
                i = getche ();
                switch (i)
                {
                        case '1': Modules::module2 (); break;
                        case '2': return;
                        default: system ("cls"); printf ("Ошибка!\n\n");
                }
        }
}
Вывод решения 0.000000.....
Может у меня какая то неведомая хрень в самой формуле?... Не вроде, он даже y = 2; не считает...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.03.2011, 03:37
fact(n);
что, правда думаешь, что эта штука может вычислять факториалы 100, 200 и так далее ?
int допускает 32767

Python
1
2
3
4
5
>>> math.factorial(8)
40320
>>> math.factorial(7)
5040
>>>
то есть такой функцией ты можешь считать факториалы меньше 8

Добавлено через 3 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
>>> math.factorial(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
>>> math.factorial(200)
788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000
>>> float(math.factorial(100))
9.332621544394415e+157
>>> float(math.factorial(200))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C double
>>>
тут длинная арифметика нужна
1
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 04:11  [ТС]
А ну да, теперь ясно... длинная арифметика это что?

Добавлено через 12 минут
Цитата Сообщение от accept Посмотреть сообщение
Добавлено через 3 минуты
Код Python
>>> math.factorial(100)
9332621544394415268169923885626670049071 5968264381621468592963895217599993229915 6089414639761565182862536979208272237582 51185210916864000000000000000000000000
>>> math.factorial(200)
7886578673647905035523632139321850622951 3597768717326329474253324435944996340334 2920304284011984623904177212138919638830 2576427902426371050619266249528299311134 6285727076331723739698894392244562145166 4240254033291864131227428294853277524242 4075739032403212574055795686602260319041 7032406235170085879617892222278962370389 7374720000000000000000000000000000000000 000000000000000
>>> float(math.factorial(100))
9.332621544394415e+157
>>> float(math.factorial(200))
Traceback (most recent call last):
* File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C double
>>>
тут длинная арифметика нужна
Я вот это совсем не понял... знаю длинные типы long int, но про арифметику длинную...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.03.2011, 06:29
ещё примеры
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 2 ** 32
4294967296
>>> 2 ** 64
18446744073709551616
>>> import math
>>> math.factorial(12)
479001600
>>> math.factorial(13)
6227020800
>>> math.factorial(20)
2432902008176640000
>>> math.factorial(21)
51090942171709440000
>>>
2^32 - unsigned long int - fact(12)
2^64 - unsigned long long int - fact(20)

длинная арифметика - это когда число хранится в виде массива
для длинной арифметики есть сторонние библиотеки (которые не входят в стандарт языка)
wiki. длинная арифметика
wiki. en. Arbitrary-precision_arithmetic
0
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 12:48  [ТС]
Не длинная арифметика не выход. long int увеличил до 19 факториал... Вобщем стал использовать long double факториал 100 есть, ограничение поставлю... Мне не особо важна точность вычислений, главное что бы все работало и модули вызывались.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
long double fact (long double n)
    {
        long double result = 1;
        for (long double f = n; f >= 1; f --)
        {
            result *= f;
        }
        return result;
    }
    double teylor (long double x, double sum)
    {
        double y = 0;
        long double n;
        for (n = 0; fabs (y) > EPS && n < 100; n ++)
        {
            y = (pow ((-1), n) * pow (x, (2 * n))) / Modules::fact (n);
            sum += y;
        }
        return sum;
    }
Ну вот как то так, n < 100, но результат все равно 0.000000...

Добавлено через 1 час 42 минуты
У меня должно срабатывать ограничение по EPS там и 10! не будет, может я его не правильно пишу? Или не понимаю что такое EPS? 10^-6 точность это EPS 1.e-6? или как...
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.03.2011, 02:41
Leningradeс, double не затащит факториал от 100. И long double. И ни один тип в С/С++.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.03.2011, 02:50
Цитата Сообщение от ForEveR
Leningradeс, double не затащит факториал от 100. И long double. И ни один тип в С/С++.
вполне
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#include <stdio.h>
 
double fact(int n);
 
int main(void)
{
    printf("%e\n", fact(100));
    printf("%e\n", fact(101));
    return 0;
}
 
double fact(int n)
{
    double result = 1;
    int i;
 
    for (i = n; i > 1; i--)
        result *= i;
    return result;
}
Code
1
2
3
4
[guest@localhost tests]$ ./t
9.332622e+157
9.425948e+159
[guest@localhost tests]$

но у него там фигурирует n в 500
я там ещё постил границы
(видать у double дробная часть гарантирует 15 знаков, а целая гораздо больше
хотя могу ошибаться, с этим ещё не разбирался)
2
 Аватар для Leningradeс
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
05.03.2011, 04:14  [ТС]
Конечно double 500 не потащит, но 100 считает, а для моего уравнения много не надо, точность не позволяет)) int даёт факториал 19 высчитывать.
Спасиб всем за помощь) Я уже разобрался.

Добавлено через 14 минут
double 170! высчитывает.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.03.2011, 04:41
Python
1
2
3
4
5
6
7
8
9
10
11
>>> for n in range(100, 200):
...   try:
...     f = float(math.factorial(n))
...   except OverflowError:
...     print('stop', n - 1)
...     print(float(math.factorial(n - 1)))
...     break
... 
stop 170
7.25741561531e+306
>>>
в сторону дроби
Python
1
2
3
4
5
6
7
8
9
10
11
>>> n = 1.0
>>> count = 0
>>> while True:
...   count += 1
...   n /= 10
...   if n <= n / 10:
...     print(count, n)
...     break
... 
324 0.0
>>>
Python
1
2
3
4
5
>>> 1 / 10 ** 324
0.0
>>> 1 / 10 ** 323
1e-323
>>>
0
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 23
20.04.2012, 19:07
Проблема с warning C4700: использована неинициализированная локальная переменная "mas"
Посмотрите пожалуйста
Найти сумму таких элементов, которые больше всех предшествующих им элементов.
Пример: -2 6 7 5 14 5 2 16 -8 18; результат: -2+6+7+14+16+18=59.


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
#include "stdafx.h"    
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream>
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{cout<< "Lab 11" << endl;
 
 
long int mas[9];  // объявляем целочисленный массив
int sum=mas[0];
    cout << "Enter elementi massiva: " << endl;
    for ( int i = 0; i <10; i++ ) // цикл для считывания чисел
        cin >> mas[i];  // считываем вводимые с клавиатуры числа
    cout << "mas = {";
    for ( int i = 0; i<10; i++ ) // цикл для вывода элементов массива
        cout << mas[i] << " ";  // выводим элементы массива на стандартное устройство вывода
    
     for ( int i = 9; i<=0; i-- ) 
       for ( int j = 1; j<i-1; j++ )
       { if (mas[i]> mas[j]) 
       sum=sum+mas[i];}; // суммируем элементы массива
   cout << "}\nsum = " << sum << endl;
}
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
20.04.2012, 20:25
Цитата Сообщение от Валя007 Посмотреть сообщение
Проблема с warning C4700: использована неинициализированная локальная переменная "mas"
Дело в том, что вы инициализируете переменную sum первым элементом массива mas, которому ещё не присвоены никакие значения. Объявите и инициализируйте sum уже после ввода элементов массива.
1
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 23
22.04.2012, 21:12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
long int mas[9];  // объявляем целочисленный массив
 
    cout << "Enter elementi massiva: " << endl;
    for ( int i = 0; i <10; i++ ) // цикл для считывания чисел
        cin >> mas[i];  // считываем вводимые с клавиатуры числа
    cout << "mas = {";
    for ( int i = 0; i<10; i++ ) // цикл для вывода элементов массива
        cout << mas[i] << " ";  // выводим элементы массива на стандартное устройство вывода
    int sum=0;
     for ( int i = 9; i<=0; i-- ) 
       for ( int j = 1; j<i-1; j++ )
       { if (mas[i]> mas[j]) 
       sum=sum+mas[i];}; // суммируем элементы массива
   cout << "}\nsum = " << sum << endl;
}
не работает. посмотрите пожалуйста
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
22.04.2012, 22:42
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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Lab 11" << endl;
 
    const int n = 10;
    int mas[n]; // объявляем целочисленный массив
 
    cout << "Enter elementi massiva: " << endl;
    for(int i = 0; i < n; i++) // цикл для считывания чисел
        cin >> mas[i]; // считываем вводимые с клавиатуры числа
 
    cout << "mas = {";
    for(int i = 0; i < n; i++) // цикл для вывода элементов массива
        cout << mas[i] << " "; // выводим элементы массива на стандартное устройство вывода
 
    int sum = mas[0];
 
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
            if(mas[j] >= mas[i]) // если текущему элементу предшествует большее либо равное значение,..  
                goto SKIP_SUM_LABEL; // ...переходим к метке SKIP_SUM_LABEL, тем самым пропуская суммирование
 
        sum = sum + mas[i]; // суммируем элементы массива
 
    SKIP_SUM_LABEL:;
    }
    
    cout << "}\nsum = " << sum << endl;
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 23
23.04.2012, 17:32
А без goto никак??(((

без него можно сделать? просто мы его не проходили
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
23.04.2012, 17:50
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i = 1; i < n; i++)
{
    bool skip_sum = false;
    for(int j = 0; j < i; j++)
    {
        if(mas[j] >= mas[i])
        {
            skip_sum = true;
            break;
        }
    }
 
    if(skip_sum == false)
        sum = sum + mas[i]; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2012, 17:50
Помогаю со студенческими работами здесь

Ошибка, указывающая на неинициализированные переменные
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); int a; cout &lt;&lt; &quot;введите число...

Локальные переменные
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; // по объявлению библиотек сразу видно компилятор старый такчто ветераны с++ помогите ...

С++ ООП локальные переменные
Есть розмерность для матрицы n i m, если я ввожу их в функции create, то уже функция print их не видит.я понимаю что они локальные, как же...

Неиспользуемые локальные переменные
Добрый день. Напомните, пожалуйста, вот что. Имеем, например: void MyClass::myFunc() { SomeClass *cls = new SomeClass(); ...

Локальные переменные-классы
есть такой код #include &lt;iostream&gt; using namespace std; class My_vector{ friend ostream &amp;operator&lt;&lt;(ostream &amp;,const My_vector...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru