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

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

03.03.2011, 23:34. Показов 74242. Ответов 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
Ответ Создать тему
Новые блоги и статьи
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. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru