реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> процедура с указателем на строку в памяти программ, помогите разобраться
Сергей Борщ
сообщение Dec 26 2008, 15:32
Сообщение #46


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alx2 @ Dec 26 2008, 12:36) *
Во времена MCS-51, тоже имеющего много разных адресных пространств, компиляторы использовали "универсальные" трехбайтные указатели, в которых первый байт был селектором адресного пространства.
Вот именно: кроме собственно адреса такой указатель содержит искусственно введенную дополнительную информацию. По одному только адресу ("чистому" указателю) определить, к какому адресному пространству нужно обращаться, невозможно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2008, 17:48
Сообщение #47


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Сергей Борщ @ Dec 26 2008, 17:32) *
такой указатель содержит искусственно введенную дополнительную информацию.
Подумал и уточню: искуственно введенную информацию на этапе исполнения. В случае использования дублирующих функций для доступа к другим адресным пространствам имена (=адреса вызова) этих функций также будут дополнительной информацией, но уже на этапе компиляции. Как и специальные квалификаторы вроде __flash. За исключением очень редких случаев предпочтительнее использование информации этапа компиляции, т.к. это дает более оптимальный как по времени исполнения, так и по размеру, код.
P.S. для разрешения на этапе исполнения iar тоже имеет специально обучнный квалификатор указателей generic. avr-gcc не имеет встроенной в компилятор поддержки различных адресных пространств, только через макросы библиотеки avr-libc.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 27 2008, 10:03
Сообщение #48


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(zltigo @ Dec 26 2008, 16:54) *
Не понимаю вопроса sad.gif Поскольку есть разница и отнюдь не "малейшая" между знаковыми и беззнаковыми представлениями чисел, то и "вред" от необдуманной замены одного другим может быть отнюдь не "малейшим". Вам ведь не все равно будет если компилятор посчитает число которое Вы полагаете равным 128 меньшим чем, например, число 1.
Это мне прекрасно понятно. Я уточню вопрос. Тут кто-то говорил что будут проблемы с русской кодировкой или что-то в этом духе. Так вот я немогу понять где эти проблемы? Я не говорю о типе char как о типе данных для представления чисел (с этим всё кристально ясно), я говорю лишь о строках и символах. При работе с буковками я никогда не думаю об их "цифровом коде" - это вредно для мозгаsmile.gif, я думаю лишь об их взаимном расположении в кодовой таблице.
Ведь ряд чисел для типа char со знаком получается такой: 0,1,...126,127,-128,-127,...-2,-1
И даже если я попытаюсь сравнить символ на попадание в диапазон, границы которого лежат в левой и правой половинках ряда, то всё будет хорошо. Псевдокод: if (ch>126)&&(ch<-127) {} - это полностью соответствует if (ch>126)&&(ch<129) {} в случае когда char без знака. И если в этих выражения стоят не конкретные числа, а как я уже говорил у меня там _всегда_ что то типа 'А' и 'Я' - то всё будет хорошоwink.gif А меня пытаются убеждать в обратном, но я не сдаюсь.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2008, 11:15
Сообщение #49


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(demiurg_spb @ Dec 27 2008, 12:03) *
И если в этих выражения стоят не конкретные числа, а как я уже говорил у меня там _всегда_ что то типа 'А' и 'Я' - то всё будет хорошоwink.gif
Код
    uint8_t char_code = static_cast<uint8_t>(c);
    if(char_code < ' ')
        return &Small_Char[0];
    if(char_code < sizeof(Small_Char) / sizeof(Small_Char[0]) + ' ')
        return &Small_Char[char_code - ' '];
    if(char_code < (uint8_t)'А') // cyrilic 'A'
        return &Small_Char[0];
    if(char_code < sizeof(Small_Char_Cyr) / sizeof(Small_Char_Cyr[0]) + (uint8_t)'А')
        return &Small_Char_Cyr[char_code - 'А'];
    return &Small_Char[0];   //unreacheable, cyrilic charset ends at '\xFF'
если char знаковый, то if(char_code < 'А') /* cyrilic 'A' */ работает с точностью до наоборот от ожидаемого.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 27 2008, 22:00
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(demiurg_spb @ Dec 27 2008, 15:03) *
Ведь ряд чисел для типа char со знаком получается такой: 0,1,...126,127,-128,-127,...-2,-1
Ошибаетесь. Представление чисел со знаком такое же, как и на числовой оси декартовых координат. -128 слева, 0 в центре и +127 справа. Если мне не верите, то загляните в limits.h.
Код
#define CHAR_MAX         127            /* Maximum "char" value */
#define CHAR_MIN        (-128)          /* Mimimum "char" value */

Цитата(demiurg_spb @ Dec 27 2008, 15:03) *
Псевдокод: if (ch>126)&&(ch<-127) {}
При знаковом char условие невыполнимо, т.к. число не может одновременно быть "больше большего" и "меньше меньшего".
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 28 2008, 22:04
Сообщение #51


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Сергей Борщ @ Dec 27 2008, 14:15) *
если char знаковый, то if(char_code < 'А') /* cyrilic 'A' */ работает с точностью до наоборот от ожидаемого.
C этим согласен.
Цитата(rezident @ Dec 28 2008, 01:00) *
Ошибаетесь. Представление чисел со знаком такое же, как и на числовой оси декартовых координат. -128 слева, 0 в центре и +127 справа. Если мне не верите, то загляните в limits.h.
Код
#define CHAR_MAX         127            /* Maximum "char" value */
#define CHAR_MIN        (-128)          /* Mimimum "char" value */
Тут не поспоришь. Зачем верю не верю.
Я имел в виду другое. Я хотел показать во что проецируются коды символов таблицы в зависимости от их типа.
А таблица знакогенератора обычно начинается с 0 а не с -128.
Хотя наверное можно и извратиться. Но в моём понимании правильнее плясать от печки, т.е. с 0
Цитата(rezident @ Dec 28 2008, 01:00) *
При знаковом char условие невыполнимо, т.к. число не может одновременно быть "больше большего" и "меньше меньшего".
Да я тут ступил. Вечером в пятницу, уходя домой, забыл взять мозг. Извиняюсь за досадную ошибку.

Пусть char без знака
Пусть гипотетически код символа 'А' = 126
Пусть гипотетически код символа 'Г' = 129
условие if ((ch>'А')&&(ch<'Г')) {} гипотетически выполнимо если ch='Б'=127.

Теперь пусть char со знаком
Теперь код символа 'А' = 126
Теперь код символа 'Г' = -2
условие if ((ch>'А')&&(ch<'Г')) {} невыполнимо даже если ch='Б'=127.

Вот ради этого понимания я и затеял весь сыр-бор.

Всем спасибо!
Я для себя сделал выводы, посмотрев на код Сергея. Надо обязательно приводить тип к беззнаковому при сравнении.
Век живи век учись!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016