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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 82, средняя оценка - 4.90
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
#1

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

03.03.2011, 23:34. Просмотров 11594. Ответов 21
Метки нет (Все метки)

Меня интересует как обходить данные ошибки. В чем соль ошибок?
Проблема даже не в том что они есть, а то что компилятор останавливается и предлагает "продолжить" или "прервать" компиляцию, конечно если жать продолжить то программа выполняет код (в моём случае цикла) и выдаёт совершенно "не результат вычислений" а -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"
Заранее благодарю за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2011, 23:34     Неинициализированные локальные переменные
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
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;
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
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

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

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

Помогите добиться правильных вычислений.
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
04.03.2011, 01:17  [ТС]     Неинициализированные локальные переменные #4
Точнее при неправильном коде бесконечный пересчет, сейчас код более менее отрегулирован... и работает, но с ответами что то не так...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.03.2011, 02:54     Неинициализированные локальные переменные #5
C++
1
for (n = 0; fabs (y) > eps && n < 500; n ++) //ТУТ ТЕЙЛОР
y неинициализированная

Цитата Сообщение от Leningradeс
Проблема в том что если инициализировать переменные
если инициализировать переменные, то будет всё точно, если не инициализировать переменные, то будет что-то непредсказуемое, так как случайное значение в неинициализированной переменной может различаться между запусками программы
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
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; не считает...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
>>>
тут длинная арифметика нужна
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
04.03.2011, 04:11  [ТС]     Неинициализированные локальные переменные #8
А ну да, теперь ясно... длинная арифметика это что?

Добавлено через 12 минут
Цитата Сообщение от accept Посмотреть сообщение
Добавлено через 3 минуты
Код Python
>>> 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
>>>
тут длинная арифметика нужна
Я вот это совсем не понял... знаю длинные типы long int, но про арифметику длинную...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
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? или как...
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.03.2011, 02:41     Неинициализированные локальные переменные #11
Leningradeс, double не затащит факториал от 100. И long double. И ни один тип в С/С++.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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 знаков, а целая гораздо больше
хотя могу ошибаться, с этим ещё не разбирался)
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
05.03.2011, 04:14  [ТС]     Неинициализированные локальные переменные #13
Конечно double 500 не потащит, но 100 считает, а для моего уравнения много не надо, точность не позволяет)) int даёт факториал 19 высчитывать.
Спасиб всем за помощь) Я уже разобрался.

Добавлено через 14 минут
double 170! высчитывает.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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
>>>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 19:07     Неинициализированные локальные переменные
Еще ссылки по теме:

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

Asm локальные переменные, объявленные в c++ - C++
//------------------------------------------------------------------------------------------------- TLongInteger TLongInteger:: ...

Локальные переменные в функции и её аргумент - C++
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...

Локальные, глобальные переменные и функции - C++
Есть массив типа char. char b; Он заполнен нулями и единицами. b находится в main. Нужно вывести на консоль b в ф-ции main, но уже в...

Variadic templates локальные переменные - C++
Еще один вопрос по Variadic templates. Решаю следующую задачу: Необходимо сохранить в памяти функцию с набором параметров для...


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

Или воспользуйтесь поиском по форуму:
Валя007
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;
}
Yandex
Объявления
20.04.2012, 19:07     Неинициализированные локальные переменные
Ответ Создать тему
Опции темы

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