|
использование пойнтера в прерывании, нуждаюсь в помощи |
|
|
|
Sep 29 2010, 13:01
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(MrYuran @ Sep 29 2010, 15:58)  static переменная? Это как? Я пока до таких высот не дошёл.
|
|
|
|
|
Sep 29 2010, 13:09
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Или подскажите, что вообще можно сделать с пойнтером. Как положить его значение в int и как произвольный int сделать пойнтером. Как-то в ассемблере с этим было попроще.
|
|
|
|
|
Sep 29 2010, 13:18
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Sep 29 2010, 17:09)  Или подскажите, что вообще можно сделать с пойнтером. Как положить его значение в int и как произвольный int сделать пойнтером. Как-то в ассемблере с этим было попроще. Указатель хранит адрес. Тип указателя соответствует типу объекта, на который он ссылается. Это вам учебники надо почитать. Если я правильно понял, вы хотите присвоить указателю адрес какой-то переменной? Так пожалуйста: int *ptr; // объявили указатель на int ptr = address; // теперь он указывает на ячейку с адресом address ptr = &var1; // теперь он указывает на ячейку с переменной var1 var2 = *ptr; // присвоили переменной var2 значение ячейки, на которую ссылается ptr
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 29 2010, 13:20
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
что не получается: Пойнтер *P объявлен глобально, но создаётся впечатление, что при выходе из подпрограмма void Prog(char *P) он разрушается, т.к. из другой подпрограммы (в данном случае из обработчика прерывания) он не виден. Чисто теоретически это выглядит так: все операции с *P, типа *(P+i), P[i] внутри процедуры транслируются в команды косвенной адресации без сохранения значения пойнтера в каком-либо регистре. И я никак не могу сохранить или получить адрес String в глобальную переменную типа int, которую внутри прерывания можно было бы (если вообще можно?) использовать как пойнтер.
Имеется ввиду, можно ли сделать что-то типа int k; chap *P; k=P; .... char i=*k
Сообщение отредактировал 1921 - Sep 29 2010, 13:25
|
|
|
|
|
Sep 29 2010, 13:25
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Sep 29 2010, 17:20)  Чисто теоретически это выглядит так: все операции с *P, типа *(P+i), P[i] внутри процедуры транслируются в команды косвенной адресации без сохранения значения пойнтера в каком-либо регистре. А почему бы и нет? Если вы не модифицируете указатель, зачем его где-то сохранять? Вы разыменовали указатель, получили значение, компилятор считает свою задачу выполненной.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 29 2010, 13:28
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Я просто по пикам помню, там пойнтеры лежали в определённых регистрах, и к ним был свободный доступ (на ассемблере). Бери и делай с ними что хочешь. А любое значение, записанное в эти регистры, автоматически счиьтается пойнтером.
Сообщение отредактировал 1921 - Sep 29 2010, 13:32
|
|
|
|
|
Sep 29 2010, 13:30
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Sep 29 2010, 17:20)  Имеется ввиду, можно ли сделать что-то типа int k; chap *P; k=P; Жирно выделенное вам компилятор сделать не позволит, т.к. это явное нарушение типов. Если char *k; k=P; то пожалуйста. Можно, конечно, вывернуться через ж.. и написать k=(int)P; (а лучше unsigned int), но это неправильно. То есть вы говорите компилятору: спокойно, я знаю, что делаю. И он съедает.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 29 2010, 13:39
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Можно, конечно, вывернуться через ж.. и написать k=(int)P; (а лучше unsigned int), но это неправильно. То есть вы говорите компилятору: спокойно, я знаю, что делаю. И он съедает. [/quote] Ну что же. Плохо! транслятор похоже вообще, оперирую с пойнтерами, в качестве выхода имеет только значение, лежащее по адресу. Неужели нет никакой возможности получить сам адрес той строки, на которую ссылается пойнтер, если мы передаём ссылку на неё? операции типа char *P char k k=P идентичны k=P[0] и приводят к пересылке нулевого байта строки.
|
|
|
|
|
Sep 29 2010, 13:53
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Я видимо как-то слабо улавливаю проблему, но если требуется передать указатель в функцию, в которой он изменяется так, чтобы после выхода из функции это изменение сохранилось, то передавать в функцию нужно не сам указатель, а указатель на указатель. Код void foo (int **pntr) { int *tmpPtr=*pntr; // tmpPtr теперь содержит адрес указателя, на который ссылается pntr ... tmpPtr++; // изменили tmpPtr ... *pntr=tmpPtr; // сохранили измененное значение указателя, адрес которого передавался через pntr } Как-то так примерно.
|
|
|
|
|
Sep 29 2010, 13:56
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Sep 29 2010, 17:39)  k=P идентичны k=P[0] и приводят к пересылке нулевого байта строки. Не может такого быть. Что за компилятор? Как минимум, выругаться должен.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 26 2010, 13:10
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422

|
Цитата ...Неужели нет никакой возможности получить сам адрес той строки, на которую ссылается пойнтер... поинтер и есть переменная, содержащая адрес Код // Работа #0 - "Инициализация" typedef unsigned char byte; // можно так byte myString[]="My string\n"; // это Ваша строка // или так byte bigString[20]="My bigest string\n"; // и это Ваша строка больше
//typedef byte* pStr; // это указатель на строку 'myString' byte* pMyString; // здесь мы будем хранить адрес строки 'myString' // а это указатель на строку 'bigString' byte* pBigString; // а здесь адрес строки 'bigString' // как Вы поняли размеры указателей одинаковы, и не зависят от длин строк
/ Теперь работа #1 - "Инициализация (поручение адресов переменных) указателей" // получаем адрес строки 'mystring' pMyString=&myString[0]; // обратите внимание на амперсанд (& - это амперсанд, оператор взятия адреса) // получаем адрес строки 'bigString' pBigString=&bigString[0]; // значение номера элемента массива может быть и не нулевым
// Теперь работа #2 - "Копирование указателей" // получаем адрес пятого символа в строке 'bigString' pBigString=&bigString[4]; // присваиваем указатель указателю pMyString=pBigString; // теперь они оба являются одинаковыми ссылками на одну и туже строку 'igest string\n'
// Теперь работа #3 - "Присвоение значение через указатель" // сначала берем адрес - это уже Вы умеете pMyString=&myString[6]; // затем присваиваем значение переменной, ссылкой на которую - есть указатель *pMyString='O'; // теперь переменная 'mуString' содержит 'My strOng' // обратите внимание на звездочку (* - звездочка, оператор взятия значения) // а теперь присваиваем значению одной переменной, значение другой. *pMyString=*pBigString;// Теперь переменная 'mуString' снова содержит 'My string'
// Выводы: // - все четыре примера это была относительная адресация, а пример от rezident, это косвенная адресация; // - Си - это высокоуровневый ассемблер (при хорошем компиляторе :) ), только нужно немного перестроиться;
// Желаю настойчивости и удачи, тогда успех Вас не покинет! :);
Сообщение отредактировал ih_ - Oct 26 2010, 13:23
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|