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

Ilya-Glushko

0 / 0 / 0

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

Сообщений: 11

1

21.01.2018, 15:11. Показов 22487. Ответов 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



3945 / 2859 / 665

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

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

Записей в блоге: 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



7427 / 5021 / 2891

Регистрация: 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



7427 / 5021 / 2891

Регистрация: 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

7427 / 5021 / 2891

Регистрация: 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



7427 / 5021 / 2891

Регистрация: 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

Compiler Warning (level 1 and level 4) C4700

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);
}

bemeyer's user avatar

bemeyer

6,2144 gold badges36 silver badges86 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

252k64 gold badges457 silver badges621 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

249k28 gold badges447 silver badges640 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

29.1k9 gold badges82 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

I have a question related to my C/C++ code. I tried some researches but there was no specific answer for my problem. I hope you will response to my question as soon as possible.

Here is my full code in C language:

 #include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define M 500
#define N 500
int
main ()
{
  //set number of threads here
  //omp_set_num_threads(8);
  int i, j, k;
  double sum;
  double **A, **B, **C;

  A = malloc (M * sizeof (double *));
  B = malloc (M * sizeof (double *));
  C = malloc (M * sizeof (double *));
  for (i = 0; i < M; i++)
    {
      A[i] = malloc (N * sizeof (double));
      B[i] = malloc (N * sizeof (double));
      C[i] = malloc (N * sizeof (double));
    }
  double start, end;
  for (i = 0; i < M; i++)
    {
      for (j = 0; j < N; j++)
        {
          A[i][j] = j * 1;
          B[i][j] = i * j + 2;
          C[i][j] = j - i * 2;
        }
    }
  start = omp_get_wtime ();
  for (i = 0; i < M; i++)
    {
      for (j = 0; j < N; j++)
        {
          sum = 0;
          for (k = 0; k < M; k++)
            {

              sum += A[i][k] * B[k][j];
            }
          C[i][j] = sum;
        }
    }

  end = omp_get_wtime ();
  printf ("Time of computation: %fn", end - start);

  cin.get ();
  return 0;
}

The code terminates because of some bugs.
The result of the code is given here:

error C4700: uninitialized local variable 'A' used

error C4700: uninitialized local variable 'B' used

error C4700: uninitialized local variable 'C' used

Please consider my question :)

Best Regards.

Hristo Iliev's user avatar

Hristo Iliev

72.3k12 gold badges133 silver badges186 bronze badges

asked Jan 11, 2015 at 15:33

loren's user avatar

8

malloc() returns a void pointer, you have to cast it:

  A = (double**) malloc (M * sizeof (double *));
  B = (double**) malloc (M * sizeof (double *));
  C = (double**) malloc (M * sizeof (double *));
  for (i = 0; i < M; i++)
    {
      A[i] = (double*) malloc (N * sizeof (double));
      B[i] = (double*) malloc (N * sizeof (double));
      C[i] = (double*) malloc (N * sizeof (double));
    }

if you are using c++ maybe is better to use «new» instead of malloc:

  A = new double* [M];
  B = new double* [M];
  C = new double* [M];
  for (i = 0; i < M; i++)
    {
      A[i] = new double[N];
      B[i] = new double[N];
      C[i] = new double[N];
    }

answered Jan 11, 2015 at 21:11

Francesco Gatti's user avatar

Перейти к контенту

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

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

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

Arhadthedev's user avatar

Arhadthedev

11.4k8 золотых знаков39 серебряных знаков69 бронзовых знаков

задан 2 фев 2015 в 21:10

nezzo's user avatar

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

ответ дан 2 фев 2015 в 21:34

nezzo's user avatar

nezzonezzo

1021 золотой знак2 серебряных знака8 бронзовых знаков

My issue is i am getting error C4700: uninitialized local variable ‘response’ used on line 26. I know it’s probably something simple I’m completely missing please help.

The local Driver’s License Office has asked you to write a program which grades the written portion of the driver’s license exam. The exam has 20 multiple choice questions. The correct answers are:

1. A 2. D 3. B 4. B 5. C 6. B 7. A 8. B 9. C 10. D 11. A 12. C 13. D 14. B 15. D 16. C 17. C 18. A 19. D 20. B

In main, declare an array and initialize it with the above correct answers. Also declare a second array for an exam taker’s answers, and get a text file name from the user.

1) have the user enter 20 answers from an exam taker and write the answers to the text file (validate that the answers are A, B, C, or D). See the 20 exam taker’s answers below.

Hint: open (and close) the file in the function.

2) read the text file of the exam taker’s answers and store them in the exam taker’s array, which was declared in main.

-a list of the numbers of the questions answered incorrectly (question numbers are 1-20).

Arrays must be processed using loops.

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  #include <iostream>
#include <iomanip>
#include <fstream>
#include <string>

using namespace std;

void studentsTest(string fileName, char student_answers[], int response, int QUESTION_AMT);
void checkAnswers(char answers[], char student_answers[], int QUESTION_AMT, int MIN_CORRECT);



int main()
{
	int response;
	const int QUESTION_AMT = 20;
	const int MIN_CORRECT = 15;
	char answers[QUESTION_AMT] = { 'A', 'D', 'B', 'B', 'C', 'B', 'A', 'B', 'C', 'D', 'A', 'C', 'D', 'B', 'D', 'C', 'C', 'A', 'D', 'B' };
	char student_answers[QUESTION_AMT];


	string fileName;
	ofstream textOut;


	studentsTest(fileName, student_answers, response, QUESTION_AMT); /*I keep getting error C4700: uninitialized local variable 'responce' used*/

    checkAnswers( answers, student_answers, QUESTION_AMT, MIN_CORRECT);


	cout << endl << endl;
	system("pause");
	return (0);
}
void studentsTest(string fileName, char student_answers[], int response, int QUESTION_AMT)
{
	cout << "nPlease enter a name for your file>";
	getline(cin, fileName);

	ofstream textOut;
	textOut.open(fileName);

	for (int response = 0; response < QUESTION_AMT; response++)
	{
		cout << "Please enter your answers: " << (response + 1) << ": ";
		cin >> student_answers[response];

		while (student_answers[response] != 'A' && student_answers[response] != 'B' && student_answers[response] != 'C' && student_answers[response] != 'D')
		{
			cout << "nError! Answers must be in captial letters! ex: A, B, C";

			cout << "Please enter your answers: " << (response + 1) << ": ";
			cin >> student_answers[response];
		}
	}
	ifstream textIn;
	textIn.open(fileName);
	if (textIn.fail())
	{
		cout << "nText file not found...program will close";
		cout << endl << endl;
		system("pause");
	}
	textIn.close();
}
void checkAnswers(char answers[], char student_answers[], int QUESTION_AMT, int MIN_CORRECT)
{
	int correctAnswers = 0;

	for (int i = 0; i < QUESTION_AMT; i++)
	{
		if (answers[i] == student_answers[i])
			correctAnswers++;
	}
	cout << "nStudent must have at least 15 correct answers to pass.";
	if (correctAnswers >= MIN_CORRECT)
	{
		cout << "nYou passed the exam!";
	}
	else
	{
		cout << "nYou failed the exam!";
	}

	cout << "nThe following is the list of questions that are incorrect";
	for (int i = 0; i < QUESTION_AMT; i++)
	{
		if (answers[i] != student_answers[i])
			cout << "Question # " << i << " is incorrect! " << endl;
	}

	cout << "nCorrect Answers = " << correctAnswers << endl;
	cout << "nIncorrect Answers = " << QUESTION_AMT - correctAnswers << endl;
}

Возможно, вам также будет интересно:

  • Ошибка call of duty advanced warfare steam
  • Ошибка c46 suzuki gsx r 750
  • Ошибка call of duty advanced warfare create2dtexture
  • Ошибка c46 suzuki gsx r 1000
  • Ошибка c9040 на kyocera taskalfa

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии