Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
T110E5
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 14
30.05.2013, 11:10     Объясните ошибку #1
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?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
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
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*'
Мимино
 Аватар для Мимино
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-го раза сработало.
Миниатюры
Объясните ошибку  
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; 
 }
О, это то, что нужно. Благодарю за помощь.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
30.05.2013, 12:11     Объясните ошибку #6
C++
1
NewP = (int*)0x22ff54;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 12:17     Объясните ошибку
Еще ссылки по теме:

C++ Ребят Незнаю что делать при запуске на компилирование выдает ошибку.Кто понимает что не так скажите а если не затруднит исправьте ошибку
C++ Слишком много символов в константе - объясните ошибку
C++ Объясните

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

Или воспользуйтесь поиском по форуму:
T110E5
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 14
30.05.2013, 12:17  [ТС]     Объясните ошибку #7
Мимино,
CheshireCat,
Спасибо за помощь.
Yandex
Объявления
30.05.2013, 12:17     Объясните ошибку
Ответ Создать тему
Опции темы

Текущее время: 10:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru