Error c4700 использована неинициализированная локальная переменная

Error C4700: использована неинициализированная локальная переменная C++ Решение и ответ на вопрос 2177650

Ilya-Glushko

0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

1

21.01.2018, 15:11. Показов 19071. Ответов 19

Метки калькулятор систем счисления (Все метки)


При компиляции выдаёт вот такие ошибки:
error C4700: использована неинициализированная локальная переменная «y»
error C4700: использована неинициализированная локальная переменная «x»

P.S Пробовал переставлять объявления и менял их, не помогает.

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
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
 
int main()
{
 
    setlocale(0, "");
    double num;
    cout << "Введите число 1 - умножение, 2 - деление. ";
    cin >> num;
    if (num = 1)
    {int a, b;
 
    cout << "Введите первое число: ";
    cin >> a;
    cout << "Введите второе число: ";
    cin >> b;
    int c = a * b;
    cout << "Результат = " << c << endl; 
    }
 
 
    else if (num = 2)
    setlocale(0, "");
    
    cout << "Введите число 2 - деление ";
    cin >> num;
    int x, y;
        int c = y / x;
    if (num = 2)
 
            
    cout << "Введите первое число: ";
    cin >> x;
    cout << "Введите второе число: ";
    cin >> y;
    cout << "Результат = " << c << endl;
    }

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



139 / 67 / 46

Регистрация: 15.10.2015

Сообщений: 308

21.01.2018, 15:21

2

Инициализируйте X и Y нулями.



0



3926 / 2844 / 660

Регистрация: 08.06.2007

Сообщений: 9,641

Записей в блоге: 4

21.01.2018, 15:23

3

Лучший ответ Сообщение было отмечено Ilya-Glushko как решение

Решение

Переставить строку 31 и поставить ее после 38-й.

Добавлено через 1 минуту

Цитата
Сообщение от Reavolt
Посмотреть сообщение

Инициализируйте X и Y нулями.

Это приведет к делению на нуль в строке 38.



1



139 / 67 / 46

Регистрация: 15.10.2015

Сообщений: 308

21.01.2018, 15:25

4

Цитата
Сообщение от palva
Посмотреть сообщение

Это приведет к делению на нуль в строке 38.

Ему не кто не запрещает инициализировать их 1. Я не читал код, так-как из самой ошибки понятно, в чем проблема.



1



pain1262

6 / 6 / 7

Регистрация: 24.09.2016

Сообщений: 63

21.01.2018, 15:35

5

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
#include <iostream>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "RUS");
    int num = 0, a = 0, b = 0;
    double c = 0;
    cout << "Введите число 1 - умножение, 2 - деление. "; cin >> num;
    if (num == 1)
    {
        cout << "Введите первое число: "; cin >> a;
        cout << "Введите второе число: "; cin >> b;
        c = a * b;
        cout << "Результат = " << c << endl;
    }
    if (num == 2)
    {
        cout << "Введите первое число: "; cin >> a;
        cout << "Введите второе число: "; cin >> b;
        c = a / b;
        cout << "Результат = " << c << endl;
    }
}



0



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 15:42

 [ТС]

6

Спасибо, помогло.

Добавлено через 3 минуты
С помощью этого не произойдет деление.



0



7423 / 5018 / 2890

Регистрация: 18.12.2017

Сообщений: 15,694

21.01.2018, 16:11

7

Ilya-Glushko, сбросьте условие задачи



0



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 16:15

 [ТС]

8

Yetty, задачи поставленно небыло, я просто хотел сделать калькулятор с выбором умножения и деления, щас дорабатывать буду, кстати у меня ещё одна проблема…



0



7423 / 5018 / 2890

Регистрация: 18.12.2017

Сообщений: 15,694

21.01.2018, 16:20

9

Ilya-Glushko, дело не в инициализации (она вообще не нужна если не переназначать переменные), а в обработке возможной попытки деления на нуль.



0



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 16:40

 [ТС]

10

Yetty, Что вы предлагаете? Можете конкретно показать? Сразу оговорюсь если я использую std::, не запускается, так что не делайте на это расчет.

З.Ы Visual Studio 2017

Добавлено через 36 секунд
palva, да, помогло…



0



Yetty

7423 / 5018 / 2890

Регистрация: 18.12.2017

Сообщений: 15,694

21.01.2018, 16:41

11

Цитата
Сообщение от Ilya-Glushko
Посмотреть сообщение

Yetty, Что вы предлагаете? Можете конкретно показать?

примерно так:

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
#include <iostream>
using namespace std;
 
int main()
{    
    int n=1, num;
    double a, b, eps=0.0000000001;
        while (n==1)
{
        cout << "a="; cin >> a;
        cout << "b="; cin >> b;
        do
    {  
        cout << "1x or 2: "; cin >> num;
        if (num!=1 && num!=2) cout <<"Enter error/Repeat please.";
    }
    while (num!=1 && num!=2);
    if (num == 1) cout <<"c="<<a * b;
    if (num == 2 && (b<-eps || b>eps)) cout <<"c="<<a / b;
    if (num == 2 && b>-eps&& b<eps) cout <<"Error division by zero";
   cout <<"nContinue? (1 - YES) "; cin >>n;
}       
    system("pause");
    return 0;
}

переменную с не использовал (только вывод результата) — если она нужна сообщите



1



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 16:42

 [ТС]

12

Yetty, Спасибо, завтра попробую с этим. Сейчас времени уже нету) Если что, обращусь к вам.



0



139 / 67 / 46

Регистрация: 15.10.2015

Сообщений: 308

21.01.2018, 16:43

13

Цитата
Сообщение от Ilya-Glushko
Посмотреть сообщение

если я использую std::, не запускается

Это еще что за магия?



0



Ilya-Glushko

0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 16:43

 [ТС]

14

Reavolt,

C++
1
using namespace std;



0



139 / 67 / 46

Регистрация: 15.10.2015

Сообщений: 308

21.01.2018, 16:44

15

Ilya-Glushko, Я имел в виду то, как программа может не работать с указыванием пространства имён?



0



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 16:46

 [ТС]

16

Reavolt, Сам задаюсь этим вопрос, штука в том, что при отсутсвии «using namespace std;» не запускается, а при присутствии и указании «std::» тоже выдает ошибку, даже на примерах из обучения.



0



139 / 67 / 46

Регистрация: 15.10.2015

Сообщений: 308

21.01.2018, 16:48

17

Ilya-Glushko, Если вы указываете пространство имен напрямую std::cout… то вам вообще не нужен using namespace std;



0



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 16:50

 [ТС]

18

Reavolt, Указыва и убирать using namespace std; пробовал, одно и тоже.



0



7423 / 5018 / 2890

Регистрация: 18.12.2017

Сообщений: 15,694

21.01.2018, 17:25

19

Ilya-Glushko, самостоятельно добавьте в калькулятор возможность сложения, вычитания и возведения в степень (включив в программу дополнительную библиотеку #include <cmath>)



1



0 / 0 / 0

Регистрация: 21.01.2018

Сообщений: 11

21.01.2018, 17:31

 [ТС]

20

Yetty, спасибо, попробую!



0



description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler Warning (level 1 and level 4) C4700

Compiler Warning (level 1 and level 4) C4700

08/30/2022

C4700

C4700

2da0deb4-77dd-4b05-98d3-b78d74ac4ca7

uninitialized local variable ‘name‘ used

Remarks

The local variable name has been used, that is, read from, before it has been assigned a value. In C and C++, local variables aren’t initialized by default. Uninitialized variables can contain any value, and their use leads to undefined behavior. Warning C4700 almost always indicates a bug that can cause unpredictable results or crashes in your program.

To fix this issue, you can initialize local variables when they’re declared, or assign a value to them before they’re used. A function can be used to initialize a variable that’s passed as a reference parameter, or when its address is passed as a pointer parameter.

The /sdl (Enable Additional Security Checks) compiler option elevates this warning to an error.

Example

This sample generates C4700 when variables t, u, and v are used before they’re initialized, and shows the kind of garbage value that can result. Variables x, y, and z don’t cause the warning, because they’re initialized before use:

// c4700.cpp
// compile by using: cl /EHsc /W4 c4700.cpp
#include <iostream>

// function takes an int reference to initialize
void initialize(int& i)
{
    i = 21;
}

int main()
{
    int s, t, u, v;   // Danger, uninitialized variables

    s = t + u + v;    // C4700: t, u, v used before initialization
    std::cout << "Value in s: " << s << std::endl;

    int w, x;         // Danger, uninitialized variables
    initialize(x);    // fix: call function to init x before use
    int y{10};        // fix: initialize y, z when declared
    int z{11};        // This C++11 syntax is recommended over int z = 11;

    w = x + y + z;    // Okay, all values initialized before use
    std::cout << "Value in w: " << w << std::endl;
}

When this code is run, t, u, and v are uninitialized, and the output for s is unpredictable:

Value in s: 37816963
Value in w: 42

When I compile this code it says «error C4700: uninitialized local variable ‘b’ used». I’m not sure what I have to do now to fix this problem. I’m neither an IT student or technican but I very like to learn C++ and I’m learning it by myself. I’ve been on this for 1 day.

Many thanks

#include <stdio.h>
#include <iostream>

//A. 
//1--
void InputArray(int *a, int &n)
{
    printf("Insert n = ");
    scanf("%d", &n);
    a = new int[n];
    for (int i=0; i<n; i++)
    {
        printf("Enter the key's a[%d] values: ", i);
        scanf("%d",&a[i]);
    }
}


void main()
{
    int *b, m;
    InputArray(b, m);
}

BennX's user avatar

BennX

6,1743 gold badges36 silver badges85 bronze badges

asked Feb 20, 2014 at 19:18

Ben's user avatar

2

b is passed by value, which means a copy will be made, but since it’s not initialized, you get the warning. Simply initialize it:

int *b = nullptr;

or

int *b = NULL;

answered Feb 20, 2014 at 19:21

Luchian Grigore's user avatar

Luchian GrigoreLuchian Grigore

251k63 gold badges454 silver badges619 bronze badges

0

If you want the function to modify the caller’s variable, then pass by reference:

void InputArray(int *&a, int &n)
                     ^

Your version passes the uninitialised pointer by value; the function modifies a local copy of it, but leaves b in its uninitialised state.

answered Feb 20, 2014 at 19:19

Mike Seymour's user avatar

Mike SeymourMike Seymour

247k28 gold badges442 silver badges638 bronze badges

3

The pointers are not default initialized, so your variable b is uninitialized, this is the source of error. You have to initialize this variable to fix this:

void main()
{
    int *b = NULL, m;
    InputArray(b, m);
}

After you fix this there is additional problem in your code. It seems from the way you call a function that you expect to persistently change pointer b passed into it, so that b will point into memory allocated with new after function returned. But you pass a pointer by value what means changes made in function will not be reflected in original variable b which will still point to what it pointed before the call to a function. (the array will be allocated inside function and will stay in memory after function returned but you will leak this memory as b won’t point into it). To fix this you have to pass pointer by reference:

void InputArray(int*& a, int& n)

Also: where is delete? Remember: mapping new to delete is bijection: every new corresponds to single delete placed somewhere in code.

answered Feb 20, 2014 at 19:22

4pie0's user avatar

4pie04pie0

29k9 gold badges81 silver badges118 bronze badges

2

First of all, did you learn how to use an pointer correctly ? because if you know how to use pointer u should know that when you declare a pointer you need to be initialized to NULL before you can use it, correct me if i’m wrong.

Example

int *b = nullptr;
int *b = NULL;
int *b = 0;
int *b(0);

It’s all the same thing but in an different way

answered Jan 2, 2017 at 17:41

Billy Duguay's user avatar

1

Здравствуйте. Я совсем новичок в программировании, никакого опыта не было.
В общем компилятор показывает ошибку «error C4700: использована неинициализированная локальная переменная «a» и также «b».
Не могу понять, что нужно сделать, укажите пожалуйста на ошибку.

#include "stdafx.h"
#include &lt;iostream&gt;
using namespace std;

int main()
{	


	double a, b, sum, raz, umn, del;
	sum = a + b;
	raz = a - b;
	umn = a*b;
	del = a / b;

	cout &lt;&lt; "vvedite dannie n";
	cin &gt;&gt; a, b;
	if (a + b)
		cout &lt;&lt; sum &lt;&lt; "n";
	else
	if (a - b)
		cout &lt;&lt; raz &lt;&lt; "n";
	else
	if (a*b)
		cout &lt;&lt; umn &lt;&lt; "n";
	else
	if (a / b)
		cout &lt;&lt; del &lt;&lt; "n";
	else
		cout &lt;&lt; "hernyu ne nesi, dyatel. n";
	system("pause");
	return 0;

		
}


  • Вопрос задан

    более трёх лет назад

  • 24926 просмотров

Вы складываете a и b, не присвоив им значений. В C/C++ в этом случае в переменных может оказаться произвольный мусор. Нужно писать double a = 0; double b = 0;

Дело в том, что ты выполняешь операции над переменными, которым не присвоено значение. Инициализируй их, например нулями


double a =0.0;
double b=0.0;
double sum, raz, umn, del;

double a, b, sum, raz, umn, del;
    sum = a + b;
    raz = a - b;
    umn = a*b;
    del = a / b;

Ты сразу суммируешь и делаешь прочие операции с переменными, которым не присвоено никакое значение. Перенеси все операции после cin и предупреждение пропадает.

А сразу походу система закрытия тегов отработала

Пригласить эксперта

Т.к. на вопрос уже ответили — разрешите пошутить старую шутку:

Подходит 2-х дневный программист к senior'у и показывает неработающую программу: 
- Подскажите, пожалуйста, где у меня ошибка? 
- В ДНК, - вздыхает senior. 

(без обид, just for fun)

#include <iostream>
using namespace std;

int main()
{	


    double a, b, sum, raz, umn, del;

	cout << "vvedite dannie n";
    cin >> a;
	cin >> b;

    sum = a + b;
    raz = a - b;
    umn = a*b;
    del = a / b;

    
    if (a + b)
        cout << sum << "n";
    else
    if (a - b)
        cout << raz << "n";
    else
    if (a*b)
        cout << umn << "n";
    else
    if (a / b)
        cout << del << "n";
    else
        cout << "hernyu ne nesi, dyatel. n";
    system("pause");
    return 0;

        
}</iostream>

как вариант

Ещё неплохо бы добавить проверку на то чтобы b было не равно 0.
А то деление на ноль и всё такое. Ошибка может выскочить.


  • Показать ещё
    Загружается…

09 февр. 2023, в 15:06

2000 руб./за проект

09 февр. 2023, в 15:02

12000 руб./за проект

09 февр. 2023, в 14:22

1500 руб./за проект

Минуточку внимания

Содержание

  1. C ++: ошибка C4700 используется неинициализированная локальная переменная «»
  2. Решение
  3. Другие решения
  4. Ошибка c4700 использована неинициализированная локальная переменная
  5. Проклятие неинициализированных переменных
  6. Проблема
  7. Почему ноль?
  8. Решение
  9. error c4700 использована неинициализированная локальная переменная
  10. Пример Example
  11. 1 ответ 1
  12. Компилятор не обнаруживает явно неинициализированную переменную
  13. 4 ответа:
  14. C++: ошибка C4700 неинициализированная локальная переменная «» используется
  15. ответ
  16. Область видимости переменных в C++: локальные и глобальные переменные
  17. Область видимости переменных в C++
  18. Глобальные переменные в C++
  19. Локальные переменные
  20. Глобальный оператор разрешения

C ++: ошибка C4700 используется неинициализированная локальная переменная «»

Я выписал код, но получаю сообщение об ошибке: «Ошибка неинициализированной локальной ошибки C4700« zi_saptamana ».« Неинициализированная локальная переменная ошибки C4700 «dar». Я делал вложенные If / if-else / else ранее, но никогда не сталкивался с этой ошибкой. Я новичок в C ++ и все еще учусь.

Решение

Вы заявляете zi_saptamana как int , но сразу после этого, не придав ему значения (без инициализация это ты использование это в switch заявление.

Обратите внимание, что значение zi_saptamana , которая является локальной переменной, не определена (это может быть что угодно) до ее инициализации. То же самое относится и к dar ,

Это то, что говорит вам компилятор.

Обратите внимание, что, как прокомментировано, это неопределенное поведение, из-за которого программа перестает быть правильно сформированной, и компилятор может делать то, что кажется подходящим. В этом случае (то есть этот компилятор) выдает ошибку.

Проще говоря (без «standardese»): это неопределенное поведение: запуск остальной части программы может зависеть от этой переменной, и если она не находится в известном состоянии, вы не можете знать, что произойдет. Вот почему большинство компиляторов помечают это как ошибку.

Другие решения

Вы должны инициализировать переменную zi_saptamana, чтобы в вашей программе работал switch, для этого просто поместите этот оператор перед switch:

он получит целочисленное значение от пользователя, и коммутатор будет работать в соответствии с этим.

Источник

Ошибка c4700 использована неинициализированная локальная переменная

Проклятие неинициализированных переменных

    Переводы, 1 февраля 2015 в 21:15

Позволять программистам использовать неинициализированные переменные — большая ошибка со стороны разработчиков языка. Такую оплошность легко совершить и тяжело отследить. Особенно при выполнении программы на разных платформах. И необходимости в этой особенности нет — переменная всегда должна иметь определенное значение.

Проблема

Локальные переменные, переменные-поля и т.п. являют собой неинициализированные переменные, т.е. в них будет записано ровно то, что было записано в отведенной под них памяти при объявлении. В C++ существуют различные правила для работы с неинициализированными переменными, инициализированными переменными и нуль-инициализированными переменными. Очень путанный механизм.

Учитывая частоту, с которой в коде появляются неинициализированные переменные, можно подумать, что отследить подобные ситуации в коде легко. Совсем нет. Да, конечно же, большая часть автоматически инициализируется нулем, если не указано иное. Однако так происходит не всегда. Например, в результате выполнения этого кода:

В результате выполнения этого кода у автора статьи всегда печатается False и 0 . Ошибок, связанных с утечкой памяти, можно избежать, используя valgrind .

Но основная проблема заключается в том, что программы даже в таком случае продолжают работать, что снижает вероятность обнаружения ошибки. Обычно ее можно отследить, только лишь запустив тестирование на другой платформе.

Почему ноль?

Почему программа автоматически инициализирует переменную нулем? На самом деле, это делает не программа, а операционная система, которая просто не позволит приложению проникнуть в неинициализированную область памяти, такова природа этого защитного механизма. Если программа A отработала свое, и результаты ее работы остались где-то в памяти, то программа B не должна обнаружить их во время своей работы, а потому ядро самостоятельно очищает память. В частности, Linux прописывает в освободившуюся память нули.

LATOKEN, Москва, от 3500 до 5000 $

Естественно, нет никакого правила, чем заполнять память. Вероятно, OpenBSD делает это как-то иначе. Иначе чистит память и ArchLinux, запущенный в VirtualBox. Этим может заниматься не только операционная система — то же может проделать и другая программа, например. И если вдруг в область памяти, которую использует приложение, попадут какие-нибудь значения, изменить их сможет уже только сама эта программа.

Любопытно, что это стало одной из причин появления Heartbleed бага.

Решение

Язык просто не должен позволять использовать неинициализированные переменные. Необязательно нужно указывать конкретное значение — значение просто обязательно должно быть. Например, значением по умолчанию может стать все тот же ноль. Вне зависимости от того, как и в какой области видимости я создал данную переменную.

В то же время, могут быть сделаны определенные исключения в пользу оптимизации. Например, при работе с памятью на низком уровне. Впрочем, оптимизатор обычно обнаруживает неиспользуемые переменные и может их принудительно не инициализировать. Если нам нужен блок неинициализированной памяти, у нас должна быть возможно выделить ее самостоятельно. В этом случае программист четко отдает себе отчет в производимых им действиях, а потому не должен попасть в ловушку.

И чтобы полностью отследить все моменты с инициализацией памяти, язык также должен иметь специальное значение noinit , которое будет показывать, что данная переменная не нуждается в инициализации.

Автор статьи уверен, что уже в ближайшем стандарте C++ должны быть реализованы эти изменения. Превращение неинициализированных ранее переменных в инициализированные не повлияет на корректность выполнения ни одной программы. Такое нововведение будет полностью backwards compatible, и серьезно улучшит популярный язык.

error c4700 использована неинициализированная локальная переменная

неинициализированная локальная переменная «имя» используется uninitialized local variable ‘name‘ used

Локальная переменная имя был используется, то есть считывание, до того, как оно было назначено значение. The local variable name has been used, that is, read from, before it has been assigned a value. В C и C++ локальные переменные не инициализируются по умолчанию. In C and C++, local variables are not initialized by default. Неинициализированные переменные могут содержать любое значение, и их применение приводит к неопределенному поведению. Uninitialized variables can contain any value, and their use leads to undefined behavior. Предупреждение C4700 почти всегда указывает на ошибку, что может привести к непредсказуемым результатам или происходит аварийный сбой программы. Warning C4700 almost always indicates a bug that can cause unpredictable results or crashes in your program.

Чтобы устранить эту проблему, можно инициализировать локальные переменные, если они объявлены, или назначить значение к ним, прежде чем они используются. To fix this issue, you can initialize local variables when they are declared, or assign a value to them before they are used. Функция может использоваться для инициализации переменной, передаваемый в качестве ссылочного параметра, или если адрес передается как параметр-указатель. A function can be used to initialize a variable that’s passed as a reference parameter, or when its address is passed as a pointer parameter.

Пример Example

Этот пример приводит к возникновению ошибки C4700, когда переменные t, u и v используются, прежде чем они инициализируются и показывает, какие значения сборки мусора, которая может привести. This sample generates C4700 when variables t, u, and v are used before they are initialized, and shows the kind of garbage value that can result. Переменные x, y и z не вызвать предупреждение, так как они инициализируются перед использованием: Variables x, y, and z do not cause the warning, because they are initialized before use:

Когда этот код является выполнения, t, u и v не инициализированы и выходные данные для s будет непредсказуемым: When this code is run, t, u, and v are uninitialized, and the output for s is unpredictable:

Не могу запустить рабочий проект под Visual Studio 2013 из-за этой ошибки. Проект старый, делался еще под Visual Studio 6.0. Видимо, там выдавалось предупреждение вместо ошибки.

Переменных много. Может быть, все-таки можно обойти эту ошибку, не инициализируя их все?

1 ответ 1

В свойствах проекта — свойства конфигурации — С/С++ — создание кода — проверка безопасности — Отключить проверку безопасности (/GS-)

Здравствуйте. Я совсем новичок в программировании, никакого опыта не было. В общем компилятор показывает ошибку «error C4700: использована неинициализированная локальная переменная «a» и также «b». Не могу понять, что нужно сделать, укажите пожалуйста на ошибку.

  • Вопрос задан более трёх лет назад
  • 16829 просмотров

Вы складываете a и b, не присвоив им значений. В C/C++ в этом случае в переменных может оказаться произвольный мусор. Нужно писать double a = 0; double b = 0;

Компилятор не обнаруживает явно неинициализированную переменную

все компиляторы C, которые я пробовал, не будут обнаруживать неинициализированные переменные в приведенном ниже фрагменте кода. Тем не менее, случай здесь очевиден.

не беспокойтесь о функциональности этого фрагмента. Это не настоящий код, и я снял его для расследования этого вопроса.

С другой стороны, если я закомментировать tauxtrouve = value ; , Я «local variable ‘tauxtrouve’ used without having been initialized» предупреждение.

Я пробовал эти компиляторы:

  • GCC 4.9.2 с -стена -WExtra
  • Microsoft Visual C++ 2013 со всеми включенными предупреждениями

4 ответа:

очевидности, с которой эта переменная не инициализируется завышена. Анализ пути стоит времени, и ваши поставщики компиляторов либо не хотели реализовывать эту функцию, либо думали, что это будет стоить вам слишком много времени, или вы просто не выбрали явно.

разница во времени выполнения для этих наивных примеров незначительна. Но представьте себе единицу перевода с тысячами строк, десятками функций, каждая из которых имеет петли и тяжелое гнездование. Количество путей быстро соединяется и становится большой нагрузкой для анализа того, будет ли первая итерация через цикл происходить ли назначение до этого сравнения.

EDIT: @Matthieu указывает, что с LLVM/clang анализ пути, необходимый для поиска использования неинициализированного значения, не усложняется по мере увеличения вложенности из-за нотации SSA, используемой IR.

это не так просто, как » -S -emit-llvm » как я надеялся, но я нашел выход SSA-нотации, который он описал. Я буду честен, я недостаточно знаком с LLVM IR, чтобы быть уверенным, но я поверю Матье на слово.

итог: использовать clang С —analyze , или убедить кого-то, чтобы исправить gcc ошибка.

Да, это должно вызвать предупреждение об этой неинициализированной переменной, но это ошибка GCC. Приведенный там пример:

с диагнозом -O2 -W -Wall .

к сожалению, в этом году 10-летний юбилей этой ошибки!

этот ответ касается только GCC.

после дальнейшего расследования и комментариев, происходит больше, чем в моем предыдущем ответе. Этот фрагмент кода имеет две неинициализированные переменные, и каждая из них не обнаружена по другой причине.

прежде всего,документация GCC на говорит:

поскольку эти предупреждения зависят от оптимизации, точных переменных или элементов, для которых существуют предупреждения зависит от точных параметров оптимизации и используемой версии GCC.

предыдущие версии руководства GCC сформулировали это более явно. Вот отрывок из руководство для GCC 3.3.6:

эти предупреждения возможны только при оптимизации компиляции, поскольку они требуют информации о потоке данных, которая вычисляется только при оптимизации. Если вы не укажете-O, вы просто не получите эти предупреждения.

It кажется, текущая версия может дать некоторые предупреждения без неинициализированных переменных без -O , но вы все равно получите гораздо лучшие результаты с ним.

если я скомпилирую ваш пример с помощью gcc -std=c99 -Wall -O , Я:

(обратите внимание, что это с GCC 4.8.2, поскольку у меня нет 4.9.x установлен, но принцип должен быть таким же.)

так, что обнаруживает тот факт, что tauxtrouve инициализирован.

однако, если мы частично исправим код, добавив инициализатор для tauxtrouve (но не totaldiff ), то gcc -std=c99 -Wall -O принимает его без каких-либо предупреждений. Это, по-видимому, является экземпляром» ошибки», приведенной в haccks это.

есть некоторые вопросы относительно того, следует ли это действительно считать ошибкой: GCC не обещает поймать каждый возможный экземпляр неинициализированной переменной. Действительно, он не может сделать это с идеальной точностью, потому что это проблема останова. Поэтому такие предупреждения могут быть полезны, когда они работают, но отсутствие предупреждений не доказывает, что ваш код свободен от неинициализированных переменных! Они действительно не являются заменой для тщательной проверки Вашего собственного кода.

на отчет об ошибке, связанный с haccks, существует много дискуссий о том, является ли ошибка даже исправимой, или попытка обнаружить эту конкретную конструкцию приведет к неприемлемой ложной положительной скорости для другого правильного кода.

Майкл, я не знаю, какую версию Visual Studio 2013 Вы пробовали, но она, безусловно, устарела. Visual Studio 2013 Update 4 правильно выдает следующее сообщение об ошибке при первом использовании totaldiff :

вы должны рассмотреть возможность обновления рабочей среды.

C++: ошибка C4700 неинициализированная локальная переменная «» используется

Я выписал код, но я все время получаю сообщение об ошибке: «Использована неинициализированная локальная переменная Error C4700« zi_saptamana ». Ошибка C4700 неинициализированной локальной переменной« dar ». Я уже делал If/if-else/else, но я никогда не сталкивался с этой ошибкой. Я новичок в C++ и все еще учась.C++: ошибка C4700 неинициализированная локальная переменная «» используется

Ошибка довольно сам пояснительный. Я имею в виду, что из кода ‘zi_saptamana’ не был инициализирован код’ switch (zi_saptamana) ‘ – drescherjm

Какая часть« неинициализированной локальной переменной используется »неясно? –

Сообщение об ошибке ясно. Когда ‘switch (zi_saptamana)’, ‘zi_saptamana’ не инициализируется или не задается, его значение неопределенно. – songyuanyao

ответ

Вы объявляете zi_saptamana в int , но сразу после этого, не давая ему значение (без инициализации его), вы использование это в switch заявлении.

Обратите внимание, что значение zi_saptamana , которое является локальной переменной, не определено (оно может быть любым) перед его инициализацией. То же самое относится к dar .

Это то, что говорит вам компилятор.

Обратите внимание, что, как прокомментировано, это неопределенное поведение, в результате чего программа не является хорошо сформированной, и компилятор может делать то, что кажется уместным. В этом случае (т. Е. Этот компилятор) возникает ошибка.

Проще говоря (без «стандартного»): это неопределенное поведение: запуск остальной части программы может зависеть от этой переменной, и если она не находится в известном состоянии, вы не можете знать, что будет бывает. Вот почему большинство компиляторов отмечают это как ошибку.

Это не то, что «может быть что угодно», это то, что чтение неинициализированной переменной является неопределенным поведением, поэтому программа не имеет никакого смысла, и компилятор может что-либо сделать, включая удаление полностью выключайте. Вам не гарантируется просто получить случайную величину мусора (хотя вы * можете *). –

Ну, для всех, кого вы знаете или заботитесь, это может быть что угодно. Именно поэтому использование неинициализированной переменной было объявлено как неопределенное поведение, ISTM. –

Ну, компиляторы довольно агрессивно относятся к использованию неопределенного поведения в наши дни. И это может изменить другие части вашей программы, а также результат — вы не можете предположить, что «эффекты неопределенности» будут содержаться в * просто * взаимодействиях с одной переменной. См. Например [this] (https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633), [это] (http://blog.regehr.org/archives/213) & [это] (http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html). –

Вы должны инициализировать переменную zi_saptamana иметь переключатель работает в вашей программе, чтобы сделать это просто поставить это заявление перед переключателем: —

он будет принимать значение целого числа от пользователя и переключатель будет работать в соответствии к этому.

Область видимости переменных в C++: локальные и глобальные переменные

Всем привет! Сегодня мы затронем тему, которую должны были изучить еще в самом начале пути изучения C++ — область видимости переменных. Мы разберем, что такое локальные и глобальные переменные.

Область видимости переменных в C++

Область видимости переменных — это те части программы, в которой пользователь может изменять или использовать переменные в своих нуждах.

В C++ существуют отдельные блоки, которые начинаются с открывающей скобки ( ). Такими блоками являются циклы (for, while, do while) и функции.

В примере ниже, программист ошибся с областью видимости:

  • Он создал переменную j во втором цикле.
  • Использовав ее в первом цикле for он вынудил компилятор сообщить об ошибке (переменной j больше нет, поскольку второй цикл закончил свою работу).

Глобальные переменные в C++

Глобальными переменными называются те переменные, которые были созданы вне тела какого-то блока. Их можно всегда использовать во всей вашей программе, вплоть до ее окончания работы. В примере ниже мы создали две глобальные переменные global и global_too и использовали их в функции summa :

Локальные переменные

Локальные переменные — это переменные созданные в блоках. Областью видимости таких переменных является блоки ( и все их дочерние ), а также их область видимости не распространяется на другие блоки. Как ни как, но эти переменные созданы в отдельных блоках.

Из этого можно сделать вывод: у нас есть возможность создавать переменные с одинаковыми именами, но в разных блоках (или другими словами, чтобы их область видимости не совпадала друг с другом).

Распространенной ошибкой среди начинающих программистов является использование локальных переменных в других блоках. Например ниже мы решили использовать переменную cost в функции summa , хотя мы ее создали в совершенно другой функции — main .

А вот, если мы вызовем функцию sait_message то результатом будет:

Вот так глобальная переменная уступает локальной!

Мы советуем вам не создавать переменные с одинаковыми именами, поскольку в будущем вам будет тяжело разобраться в коде, если там будут присутствовать одинаковые переменные.

Глобальный оператор разрешения

В случае создания двух переменных с одинаковым именем (одна из которых является глобальной, а другая локальной) при использовании в блоке, в котором была объявлена локальная переменная, можно использовать и глобальную переменную. Для ее использования нужно всего лишь применить глобальный оператор разрешения.

Глобальный оператор разрешения — это два подряд поставленные двоеточия, с помощью которых мы говорим компилятору, что хотим использовать глобальную переменную, а не локальную.

Чтобы использовать глобальный оператор разрешения нужно применять данную конструкцию:

Источник

  • Remove From My Forums

 none

Ошибка на этапе компиляции

  • Question

  • Суть вопроса такова: я создаю структуру, и объявляю указатель на переменную этого типа. Далее я вывожу структуру, выводим в файл. Вывод производим с помощью операции смещения от указателя, то есть
    указатель плюс индекс и разыменовываем и выводим.  Редактор кода не замечает ошибки, но далее при сборке возникает ошибка, не определена локальная переменная.

    Вот отрывки из кода:

    MARSH *way;                      //Инициализация указателя way
    system(«cls»);
    SetConsoleTextAttribute(hConsoleHandle, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    cout << «Введите название начального пункта маршрута (Например: Vitebsk)»;
    SetConsoleTextAttribute(hConsoleHandle, FOREGROUND_INTENSITY);
    while (index < size)
    {
    cin >> *(way + index);
    ofstream outfile(«MARSHrut_List.txt», ios::app);
    outfile << (*(way + index)) << endl;                 //Здесь происходит ошибка
    index++;
    }

    выдает ошибку:

    error C4700: использована неинициализированная локальная переменная «way»

    Хотя в другом отрывке кода при таком же способе доступа к переменной этой же структуры такой ошибки не происходит:

    for (int i = 0; i < size; i++)
    {
    if (strcmp((*(way + i)).start_point, point) == 0)
    {
    indicator = true;
    cout << «начальная точка: » << (*(way + i)).start_point
    << «tконечная точка: » << (*(way + i)).finish_point
    << «tномер маршрута: » << (*(way + i)).marsh_number << «n»;                     //Поиск в структуре 
    }
    else
    if (strcmp((*(way + i)).finish_point, point) == 0)
    {
    indicator = true;
    cout << «начальная точка: » << (*(way + i)).start_point
    << «tконечная точка: » << (*(way + i)).finish_point
    << «tномер маршрута: » << (*(way + i)).marsh_number << «n»;
    }
    }

    В чем моя ошибка и где?

Answers

    • Marked as answer by

      Wednesday, February 28, 2018 8:03 PM

    • Unmarked as answer by
      Alexandr_Tihon
      Wednesday, February 28, 2018 8:04 PM
    • Marked as answer by
      Alexandr_Tihon
      Wednesday, February 28, 2018 8:04 PM
    • Edited by
      Alexandr_Tihon
      Wednesday, February 28, 2018 8:04 PM

Понравилась статья? Поделить с друзьями:
  • Error c4430 missing type specifier int assumed note c does not support default int
  • Error c4235 nonstandard extension used asm keyword not supported on this architecture
  • Error c4065e type of input file
  • Error c3867 visual studio
  • Error c3861 strcpy identifier not found