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
72.8k12 gold badges137 silver badges188 bronze badges
asked Jan 11, 2015 at 15:33
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
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 <iostream>
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 << "vvedite dannie \n";
cin >> 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;
}
-
Вопрос задан
-
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 = # // pnum is a pointer to int which has been
// initialized with the address of num
И то же самое относится struct
содержание.
2