Ошибка с4700 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
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <conio.h>
#include <math.h>
#include <iostream>
using namespace std;
 
 
double f(double x)
{
 
    return (2*x)-(3*log(x))-3;
}
 
double fi(double x, double L) 
{
 
    return  x+L*f(x);
}
 double f1(double x) 
 {
 
    return   2-(3/x);
}
 
double f2(double x)
{
 
    return   3/pow(x, 2);
}
   int t,n;
    double a,b,c,eps,x,L=-0.35;
void Dihotomia(double a,double b,double eps,double c,int n)
{
  n=0;
    do 
    {
        c=(a+b)/2;
        if (f(c)*f(a)<=0) b=c;
        else a=c;
        n+=1;
    }
    while (fabs(a-b)>=eps);
}
 
 
 
void Prost_iter(double x, double c,double b,double eps)
{
    int n=0;
    double L=-0.35;
    do 
    {
        c=fi(x,L);
        b=fabs(x-c);
        x=c;
        n+=1;
    }
    while (b>=eps);
        getchar();
}
 
void Newton(double a,double b,double c,double eps)
{
    int n=0;
    if(f(a)*f2(a)>0) c=a;
    else c=b;
    do 
    {
        c=c-f(c)/f1(c);
        n+=1;
    }
    while (fabs(f(c))>=eps);
        getchar();
}
int main()
{   
    setlocale(LC_ALL, "Russian" );
    int t,n;
    double a,b,c,eps,x,L=-0.35;
a:
    { 
    system("cls");
    cout<<"\t\t\t2x-3ln(x)-3"<<endl;
    cout<<"\t\t\tВыберете метод решения:"<<endl;
    cout<<"1--Метод дихотомии."<<endl;
    cout<<"2--Метод простых итераций."<<endl;
    cout<<"3--Метод ньютона."<<endl;
    cout<<"0--Возврат к выбору методов."<<endl;
    cin>>t;
    switch(t)
    { 
    case 1:
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"Точность ="; cin>>eps;
    cout<<"Корень ="<<c<<"\n";
    cout<<"Число итераций ="<<n<<"\n";
    cout<<"Значение функции ="<<f(c)<<"\n";
    Dihotomia(a,b,eps,c,n);
    break;
    case 2:
    cout<<"x="; cin>>x;
    cout<<"Точность ="; cin>>eps;
    cout<<"Корень ="<<c<<"\n";
    cout<<"Число итераций="<<n<<"\n";
    cout<<"Значение функции ="<<f(c)<<"\n";
    Prost_iter(a,b,x,eps);
    break;
    case 3:
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"Точность ="; cin>>eps;
    cout<<"Корень ="<<c<<"\n";
    cout<<"Число итераций ="<<n<<"\n";
    cout<<"Значение функции ="<<f(c)<<"\n";
    Newton(a,b,c,eps);
    break;
    }
    cin>>t;
    if(t==0)
    {
    goto a;
    }
}
}

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: %f\n", 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.8k12 gold badges137 silver badges188 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

1

Search code, repositories, users, issues, pull requests…

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

Здравствуйте. Я совсем новичок в программировании, никакого опыта не было.
В общем компилятор показывает ошибку «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;

		
}


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

  • 25061 просмотр

Вы складываете 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.
А то деление на ноль и всё такое. Ошибка может выскочить.


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

22 сент. 2023, в 21:27

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

22 сент. 2023, в 19:59

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

22 сент. 2023, в 18:59

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

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

Я прочитал многие из предыдущих постов на C4700, но не могу найти решение своей проблемы.

У меня есть небольшой сценарий, написанный для демонстрации указателей структуры:

struct foo
{
int * bar;
};

#include<iostream>
using namespace std;
int main()
{
foo * fooptr;
int * num;
*num = 25;
*fooptr->bar = *num;
cout << "now fooptr points to a foo struct whose bar points to: " << *fooptr->bar;

fooptr->bar = num;
cout <<"now fooptr's struct's bar shares memory address with num at " <<num;

return 0;
}

Когда я его компилирую, я получаю два предупреждения C4700 о неинициализированных локальных переменных num и fooptr.
Я пошел дальше и инициализировал оба значения NULL, поэтому ошибка компилятора исчезла, но неудивительно, что я получил исключение:

Необработанное исключение в 0x00265DF7 в testing.exe: 0xC0000005: расположение записи нарушения прав доступа 0x00000000.

Вы видите, я всегда думал, что когда я не инициализирую эти указатели, они будут автоматически инициализироваться со случайными адресами (точно так же, как неинициализированным ints / chars / doubles будут назначаться garbages) — так не должно ли это быть здесь?

Если инициализация в этом случае действительно необходима (почему?), То есть ли легкий способ обойти эту проблему?

0

Решение

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

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

тогда есть ли простой способ обойти эту проблему?

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

2

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

Вместо

int *num; // num points to somewhere random
*num = 25; // writing somewhere random makes zero sense
// and if your OS allowed you to do it, you would
// crash your computer very often.

ты должен написать

int num = 25;
int *pnum = &num; // pnum is a pointer to int which has been
// initialized with the address of num

И то же самое относится structсодержание.

2

Понравилась статья? Поделить с друзьями:
  • Ошибка с2006 мазда сх5
  • Ошибка с6000 kyocera 2035
  • Ошибка с42268 форд мондео 4
  • Ошибка с2005 мазда сх5
  • Ошибка с2000 kyocera 2030