Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.66/210: Рейтинг темы: голосов - 210, средняя оценка - 4.66
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 435
1

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

03.03.2011, 23:34. Просмотров 38846. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2011, 23:34
Ответы с готовыми решениями:

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

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

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

Ошибка, указывающая на неинициализированные переменные
#include <iostream> #include <Windows.h> using namespace std; int main() { setlocale(0, "");...

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

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
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 01:17  [ТС] 4
Точнее при неправильном коде бесконечный пересчет, сейчас код более менее отрегулирован... и работает, но с ответами что то не так...
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
04.03.2011, 02:54 5
C++
1
for (n = 0; fabs (y) > eps && n < 500; n ++) //ТУТ ТЕЙЛОР
y неинициализированная

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

Вот инициализировано всё)) А в цикле смысл значение ставить?
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
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
04.03.2011, 03:37 7
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
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 04:11  [ТС] 8
А ну да, теперь ясно... длинная арифметика это что?

Добавлено через 12 минут
Цитата Сообщение от accept Посмотреть сообщение
Добавлено через 3 минуты
Код Python
>>> math.factorial(100)
933262154439441526816992388562667004907159682643816214685929 638952175999932299156089414639761565182862536979208272237582 51185210916864000000000000000000000000
>>> math.factorial(200)
788657867364790503552363213932185062295135977687173263294742 533244359449963403342920304284011984623904177212138919638830 257642790242637105061926624952829931113462857270763317237396 988943922445621451664240254033291864131227428294853277524242 407573903240321257405579568660226031904170324062351700858796 178922222789623703897374720000000000000000000000000000000000 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
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
04.03.2011, 06:29 9
ещё примеры
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
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 435
04.03.2011, 12:48  [ТС] 10
Не длинная арифметика не выход. 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
В астрале
Эксперт С++
8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
05.03.2011, 02:41 11
Leningradeс, double не затащит факториал от 100. И long double. И ни один тип в С/С++.
1
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
05.03.2011, 02:50 12
Цитата Сообщение от 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;
}
Код
[guest@localhost tests]$ ./t
9.332622e+157
9.425948e+159
[guest@localhost tests]$

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

Добавлено через 14 минут
double 170! высчитывает.
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
05.03.2011, 04:41 14
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 15
Проблема с 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
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
20.04.2012, 20:25 16
Цитата Сообщение от Валя007 Посмотреть сообщение
Проблема с warning C4700: использована неинициализированная локальная переменная "mas"
Дело в том, что вы инициализируете переменную sum первым элементом массива mas, которому ещё не присвоены никакие значения. Объявите и инициализируйте sum уже после ввода элементов массива.
1
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 23
22.04.2012, 21:12 17
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
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
22.04.2012, 22:42 18
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 19
А без goto никак??(((

без него можно сделать? просто мы его не проходили
0
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
23.04.2012, 17:50 20
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2012, 17:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.