Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Неинициализированные локальные переменные 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++
есть такой код #include <iostream> using namespace std; class My_vector{ friend ostream &operator<<(ostream &,const My_vector...

22
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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;
1
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 339
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
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 339
04.03.2011, 01:17  [ТС] #4
Точнее при неправильном коде бесконечный пересчет, сейчас код более менее отрегулирован... и работает, но с ответами что то не так...
0
accept
4825 / 3246 / 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с
Проблема в том что если инициализировать переменные
если инициализировать переменные, то будет всё точно, если не инициализировать переменные, то будет что-то непредсказуемое, так как случайное значение в неинициализированной переменной может различаться между запусками программы
1
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 339
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
accept
4825 / 3246 / 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
>>>
тут длинная арифметика нужна
1
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 339
04.03.2011, 04:11  [ТС] #8
А ну да, теперь ясно... длинная арифметика это что?

Добавлено через 12 минут
Цитата Сообщение от accept Посмотреть сообщение
Добавлено через 3 минуты
Код Python
>>> math.factorial(100)
933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582 51185210916864000000000000000000000000
>>> math.factorial(200)
788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830 257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242 407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000 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
accept
4825 / 3246 / 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
0
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 339
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
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
05.03.2011, 02:41 #11
Leningradeс, double не затащит факториал от 100. И long double. И ни один тип в С/С++.
1
accept
4825 / 3246 / 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 знаков, а целая гораздо больше
хотя могу ошибаться, с этим ещё не разбирался)
2
Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 339
05.03.2011, 04:14  [ТС] #13
Конечно double 500 не потащит, но 100 считает, а для моего уравнения много не надо, точность не позволяет)) int даёт факториал 19 высчитывать.
Спасиб всем за помощь) Я уже разобрался.

Добавлено через 14 минут
double 170! высчитывает.
0
accept
4825 / 3246 / 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
>>>
0
Валя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;
}
0
20.04.2012, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 19:07
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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