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

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

Войти
Регистрация
Восстановить пароль
 
T110E5
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 14
#1

Объясните ошибку - C++

30.05.2013, 11:10. Просмотров 302. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using namespace std;
  
  int main(){  
  setlocale(LC_ALL, "Russian");
  system("color 0E");
  srand(time(NULL));
  cout << "-------------------" << endl;
  int var = 100;
  int *NewP;
  int *p = &var;
  cout << "P = " << p << " = " << *p << endl;
  *NewP = 0x22ff54;
  cout << "NEWP = " << NewP << " = " << *NewP << endl;
  
 system("pause");
 return 0; 
 }
Значение P по адресу 0x22ff54 равно 100, потом NewP присваиваю 0х22ff54 и пытаюсь повторно просмотреть значение по адресу, но NEWP равно 2293588 и находится по адресу 0х7ffde000.
Где ошибка?
Да и ещё, в винде XP функция setlocale не работает, текст выводится кракозяброй, есть альтернативная функция работающая в XP?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 11:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните ошибку (C++):

Объясните ошибку! - C++
Здравствуйте, господа форумчане! Предлагаю вашему вниманию фрагмент кода, который компилируется в Builder'е (винда), но g++ его не...

Объясните ошибку. (cout in iostream) - C++
//intvars.cpp // работа с переменными целого типа #include &lt;iostrem&gt; using namespace std; int main() { int var1; ...

Объясните ошибку Unresolved external - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; class Hex { unsigned char hex; unsigned...

Объясните ошибку новичку в работе со строкой - C++
#include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; void my_strdel( char *s, int p, int k) { int l = strlen(s); ...

Полиндром: найдите ошибку в коде рекурсии и объясните - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; bool palindrome(string *m, int i, int j) { if( i==j || i&gt;j) ...

Объясните функцию классы в С++ и укажите мою ошибку. - C++
Изучаю классы в языке C++, написав несколько строк кода для вывода числа. не могу понять и исправить ошибку, вот код: #include&lt;iostream&gt; ...

6
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 11:17 #2
Цитата Сообщение от T110E5 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using namespace std;
  
  int main(){  
  setlocale(LC_ALL, "Russian");
  system("color 0E");
  srand(time(NULL));
  cout << "-------------------" << endl;
  int var = 100;
  int *NewP;
  int *p = &var;
  cout << "P = " << p << " = " << *p << endl;
  *NewP = 0x22ff54;
  cout << "NEWP = " << NewP << " = " << *NewP << endl;
  
 system("pause");
 return 0; 
 }
Значение P по адресу 0x22ff54 равно 100, потом NewP присваиваю 0х22ff54 и пытаюсь повторно просмотреть значение по адресу, но NEWP равно 2293588 и находится по адресу 0х7ffde000.
Где ошибка?
Да и ещё, в винде XP функция setlocale не работает, текст выводится кракозяброй, есть альтернативная функция работающая в XP?
У Вас разыменован указатель. Если хотите присвоить адрес, то
C++
1
NewP = 0x22ff54;
теоретически
NewP - содержит адрес
*NewP - указывает на целое число по адресу NewP
0
T110E5
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 14
30.05.2013, 11:33  [ТС] #3
Цитата Сообщение от Мимино Посмотреть сообщение
У Вас разыменован указатель. Если хотите присвоить адрес, то Код C++1
NewP = 0x22ff54;теоретически
NewP - содержит адрес
*NewP - указывает на целое число по адресу NewP
Не катит, если у переменной NewP брать *, то компилятор выдает ошибку: invalid conversion from `int' to `int*'
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 12:08 #4
Цитата Сообщение от T110E5 Посмотреть сообщение
Не катит, если у переменной NewP брать *, то компилятор выдает ошибку: invalid conversion from `int' to `int*'
Если честно, то я никогда не присваивал адрес вот таким вот образом. Но я точно могу сказать, что
C++
1
*NewP = 0x22ff54;
присваивает значение 22ff54 (2293588) целому, находящемуся по адресу NewP. Если NewP нужно присвоить адрес переменной, то это будет так:
C++
1
NewP = &value
А вот как напрямую задать адрес NewP... боюсь, я с этим не смогу помочь. Сам еще учусь
Порылся в инете, вот что нашел:
char *p;

char b, char c = 'А';

р = &b; // теперь p содержит адрес хранения ещё не инициализированной переменной b;

*р = b; // инициализируем переменную b значением 'А'.



Применительно к программированию микроконтроллеров, указатели можно использовать, к примеру, для записи данных в порт ввода/вывода. Предположим, регистр данных порта расположен в памяти по адресу 0x16. В этом случае, для записи в него значения 0xFF можно воспользоваться следующим фрагментом программного кода:

unsigned char *p; //объявление указателя на символ

p = 0x16; // присваиваем указателю адрес порта PORTx

*p = 0xFF; // теперь на выводах порта PORTx будут все единицы.
Другими словами, мой вариант был верным. Вот только почему не работает...
Похоже, ответ дал сам компилятор:
The variable 'NewP' is being used without being initialized.
Добавлено через 24 минуты
Еще немного погуглив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  int main(){  
  setlocale(LC_ALL, "Russian");
  system("color 0E");
  srand(time(NULL));
  cout << "-------------------" << endl;
  int var = 100;
  int *NewP;
  int *p = &var;
  cout << "P = " << p << " = " << *p << endl;
  NewP = (int *)0x22ff54;
  cout << "NEWP = " << NewP << " = " << *NewP << endl;
  
 system("pause");
 return 0; 
 }
Вот так вроде правильно. Правда, при запуске Вам скажут, что прав на доступ к ячейке 0x22ff54 нет. Хотя со 2-го раза сработало.
0
Миниатюры
Объясните ошибку  
T110E5
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 14
30.05.2013, 12:09  [ТС] #5
Цитата Сообщение от Мимино Посмотреть сообщение
Если честно, то я никогда не присваивал адрес вот таким вот образом.
Ну этот способ мне не подходит:
C++
1
NewP = &var
Потому что мне нужно в адресном пространстве сторонней программы изменять значения.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){  
  setlocale(LC_ALL, "Russian");
  system("color 0E");
  srand(time(NULL));
  cout << "-------------------" << endl;
  int var = 100;
  int *NewP;
  int *p = &var;
  cout << "P = " << p << " = " << *p << endl;
  NewP = (int *)0x22ff54;
  cout << "NEWP = " << NewP << " = " << *NewP << endl;
  
 system("pause");
 return 0; 
 }
О, это то, что нужно. Благодарю за помощь.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
30.05.2013, 12:11 #6
C++
1
NewP = (int*)0x22ff54;
0
T110E5
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 14
30.05.2013, 12:17  [ТС] #7
Мимино,
CheshireCat,
Спасибо за помощь.
0
30.05.2013, 12:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 12:17
Привет! Вот еще темы с ответами:

Слишком много символов в константе - объясните ошибку - C++
Задание: Определённые культуры растений на 3-х полях, определить культуры на каждом поле, показать какие культуры растут хотя бы на одном...

Объясните, как исправить ошибку invalid operands of types 'double' and 'const char [2]' to binary 'operator - - C++
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main () { double...

Подскажите как исправить ошибку. прога ломается на 79 строке. а ошибку не выдает - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int chisla(int a,int b) { ...

Найти ошибку в программе: в visual studio выдает ошибку - C++
#include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int main() { double x, E, ypred, y, S; ...


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

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

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