Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как создать собственный тип данных для оперирования шестнадцатиричными значениями?

465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Сразу объясню что приложение в котором это будет использоваться .rtss(реального времени), и там я очень ограничен в подключении заголовочных файлов.
Нужен тип данных в котором можно указывать символы 0 - 9 и A - F и при этом они автоматически воспринимались как шестнадцатиричные значения.
Пример практического применения:

В теле программы будет производиться запись в LPT порт на ассемблере
mov DX, PortAddr
mov AL, Value
out DX, AL

Сам ассемблер хавает любые значения(и это очень удобно) и 888 в десятичной и 378Н в шестнадцатиричной системах.
А вот когда пытаешся обернуть это в функцию возникают потуги, нет подходящего типа для переменной PortAddr.
Можно конечно пересчитывать адреса в десятичную систему, но как вы помните приложение rtss, и не хочется тратить драгоценные такты процессора.

Были попытки использовать enum, но к сожалению не компилится так как мне нужно(видимо имена перечисления не могут начинаться с цифр). Был бы идеальный вариант: enum HEXWORD {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F};
Буду рад любым соображениям по данному поводу.
Так же были попытки использовать union, но это похоже не совсем то что мне нужно.
А про typedef я вообще молчу, зачем переименовывать тип, и в итоге использовать тот же самый?
277
24 апреля 2012 года
arrjj
1.7K / / 26.01.2011
unsigned int portnumber = 0xAABBCCDD;
unsigned short portnumber = 0xAABB;
unsigned char portnumber = 0xAA;
><

Для компилятора и программы нет разници хоть арабскими цифрами записывай хоть римскими - на выходе получишь BIN представление числа, не нужно ничего никуда переводить.
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Да действительно так.
Но нужно чтоб без 0х.....
Например будет написана вот такая функция:

RtWriteLPTPort(????? PortAddr, BYTE Value)
{
_asm
{
mov DX, PortAddr
mov AL, Value
out DX, AL
}
}

При использовании(если PortAddr типа unsigned short):

RtWriteLPTPort(378(ну или например требуется написать 37с), 255); в ассемблер попадает 17А, то есть нужно передавать не 378, а 888. Это не приемлимо, пересчёт в программе(если таких мест накопится много) делать дорого.
К сожалению с си пока не очень дружу(всё время на паскале ковырялся), концепция в голове есть а как реализовать не знаю.
Пока мне видится такой подход:
членами типа могут быть символы 30 - 39 и 41 - 46, и каждому символу присвоенно шестнадцатиричное значение.
Ну както объявить что:
char 30 = 0x0
char 31 = 0x1
char 32 = 0x2
...
char 41 = 0xA
char 42 = 0xB
...
Вот чтото такое нужно закодить. Тип это будет или класс может быть. Пусть это будет чем угодно, главное чтоб в итоге можно было несколько символов писать, и они воспринимались как одно целое(ну как в том же short, например 12 воспринимается как 12, а не как отдельные 1 и 2)
277
24 апреля 2012 года
arrjj
1.7K / / 26.01.2011
(>_<)

Если ты напишешь RtWriteLPTPort(0x378,255) то туда и упадет 378H

Если ты напишешь RtWriteLPTPort(888,255) перевод из dec в hex будет только на этапе __компиляции__(!!!) 1 раз а не регулярно при выполнении программы
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
А где можно посмотреть как объявлен тот же int?
Понимаете, например программу которую я пишу возможно будет использовать еще ктото кроме меня.
И возможно запись будет и по другим адресам
Не хотелось бы выводить сообщение типа:
"Выберите устройство для записи, и переведите его адрес в калькуляторе в десятичное представление или введите как есть добавив впереди 0 с крестиком". Тем более что калькулятор работать не сможет в момент работы программы(винда виснет намертво)
277
24 апреля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: QWERYTY
Тем более что калькулятор работать не сможет в момент работы программы(винда виснет намертво)


рыдаю

На каком си пишешь? стандартная ф-я есть strtol
В борланде есть HexToInt

26K
24 апреля 2012 года
mudBit
224 / / 30.05.2011
int - это встроенный тип. О том, сколько в нем байт в данной реализации, можно узнать используя sizeof(int).
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Сама программа не будет производить поиск устройств и их адресов(не те у неё функции). Все данные будут предоставлены из вне.
Сейчас это запись в LPT, потом это может быть запись в USB или сетевой адаптор.
Адреса берутся с диспетчера устройств, который для LPT выдаёт примерно следующее:

Диапазон ввода/вывода (I/O) 0378 - 037F
Диапазон ввода/вывода (I/O) 0778 - 077B
...
...

Win32 API мне не доступны. С их помощью наверное можно было получить адреса и не морочиться со всякими переводами а просто передать по назначению.
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Я понял что встроенный, иначе он бы не работал. Какая реализация? Ну у меня есть подозрения что раз процессор 32 бит то и int 32 бит.
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Хорошо, функция есть(правда её применения нужно избежать всеми силами), а не подскажите какого типа должна быть переменная PortAddr чтоб я мог указать например 37с
277
24 апреля 2012 года
arrjj
1.7K / / 26.01.2011
 
Код:
unsigned short portaddr;
printf("Введите адрес:");
scanf("%x",&portaddr);
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Да это я уже понял(это преобразования). В переменной теперь если ввести адрес LPT 378 будет лежать 888.
А в чём принципиальное ограничение сохранить 378НЕХ и так же использовать как НЕХ без перевода в DEC и потом обратно ???
277
24 апреля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: QWERYTY
В переменной теперь если ввести адрес LPT 378 будет лежать 888.



Нифига!
в переменной теперь если ввести 378 будет 1101111000 !!! Компьютер работает в двоичной системе, хоть и оперирует с байтами. А вот при выводе на экран для удобочитаемости число переводится в десятичную систему.

465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Да это понятно что в компе всё в BIN.
Давай теперь кодить будем на машинном коде, реч то про языки высокого уровня.
Ты меня окончательно запутал. В итоге int это BIN или DEC ???


Жалко что для удобочитаемости НЕХ не добавили
1
24 апреля 2012 года
kot_
7.3K / / 20.01.2000
Цитата: QWERYTY
Тем более что калькулятор работать не сможет в момент работы программы(винда виснет намертво)


речь же идет о программе реального времени - какая венда?????
помоему ты сам себя запутал -

465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Вот в делфи например если сделать

var
A: CARDINAL;
begin
A := 1024;
Edit1.Text := IntToStr(A);

значением строки становится почемуто 1024, а не 10000000000.
Но в памяти ведь лежит 10000000000, откуда берётся 1024 это ведь ктото пересчитывает(для удобочитаемости).
Почему бы по точно такой же логике не добавить возможность пересчета в HEX.
Так же был бы тип специальный:

var
A: ????????;
begin
A := 400; // В память кладётся 10000000000
Edit1.Text := IntToStr(A); // Выводится 400
465
24 апреля 2012 года
QWERYTY
595 / / 25.03.2012
А про винду речи нет, кроме как в контексте калькулятора
277
24 апреля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: QWERYTY
Вот в делфи например если сделать

var
A: CARDINAL;
begin
A := 1024;
Edit1.Text := IntToStr(A);

значением строки становится почемуто 1024, а не 10000000000.
Но в памяти ведь лежит 10000000000, откуда берётся 1024 это ведь ктото пересчитывает(для удобочитаемости).
Почему бы по точно такой же логике не добавить возможность пересчета в HEX.


:facepalm:

А теперь приоткрою тебе тайну: в делфи есть IntToHex еще :D

var
A: CARDINAL;
begin
A := 1024;
Edit1.Text := IntToStr(A); //1024
Edit1.Text := IntToHex(A,1); //400

И именно эти функции переводят то что в памяти в удобочитаемый вид.


А теперь внимание полный вынос мозга: itoa

285
24 апреля 2012 года
Romik
479 / / 24.11.2002
Цитата: QWERYTY
Ты меня окончательно запутал. В итоге int это BIN или DEC ???


Пять баллов! :)))

BIN и DEC имеют значение как раз приведённых выше примерах, при конвертации числа в строку.
Теперь следует определиться, у вас аргументы - строки или числа?!

Если строки, то конвертируйте в строки, если числа, то хватить морочить себе и другим голову, пользуйтесь как есть - ничего править/конвертировать не нужно!

465
25 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Так ладно, всё понял.
Это я попал в заблуждение из за удобства которое для меня сделали.
По умолчанию подразумевается DEC(а я воспринял это как привязку типа к DEC).
Если бы для любой ситемы счисления обязательно нужно было указывать что работаем именно с ней, я бы не попал в такое заблуждение.
Теперь я понял что создавать ещё один числовой тип не имеет смысла. Тот что есть удовлетворяет потребности.
Теперь только один вопрос:
Можно ли использовать typedef, и уже для нового типа назначить что по умолчанию работаем в HEX(чтоб писать не 0х378, а 378)? Или у самого встроенного типа изменить это "удобство"?
277
25 апреля 2012 года
arrjj
1.7K / / 26.01.2011
Это не преобразование типов, это стандарт языка C++

Код:
#include <iostream>

int main()
{
int a=011;
int b=0x11;
int c=11;
std::cout<<"a="<<a<<std::endl;
std::cout<<"b="<<b<<std::endl;
std::cout<<"c="<<c<<std::endl;
return 0;
}

Ты можешь только
а: смириться с тем что в мире принята 10-я система счисления и писать 0x когда пишешь hex
б: улететь в джунгли и всместе с аборигенами развивать собственное общество с 16-ричной системой счисления
в: написать макросы для перевода

Код:
#include <iostream>

#define h(a) 0x##a

int main()
{
int a=011;
int b=0x11;
int c=11;
int d=h(11);
std::cout<<"a="<<a<<std::endl;
std::cout<<"b="<<b<<std::endl;
std::cout<<"c="<<c<<std::endl;
std::cout<<"d="<<d<<std::endl;
return 0;
}
что тебе только добавит гемора
г: не парить нас а вступить в комитет стандартизации C++ и потр##ть мозг им

Класс написать можно, но плохо, придется задавать значения строками, тк. компилятор 12F3 откажется принимать, а F123 вообще скажет что нет такой переменной только "123F", что по геморности и производительности никогда не окупится и по длине записи будут те же 2 символа дополнительных

Я бы еще раз подумал на счет первых двух вариантов, они наиболее реальны
465
25 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Ладно всем спасибо, что наставили на путь истинный.
Придётся смириться, и писать по стандартам.
Нет сил уже никие макросы писать, буду вводить в десятичной системе.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог