Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 10.10.2012, 23:15  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Вот так я передаю строку hexvalue

char hexvalue[20];
IntToHex1 (0x1234, hexvalue, 4); //вызов строки через указатель
IntToHex2 (0x5678, hexvalue, 4); //вызов строки как элемент массива

Щас компильнул, оба варианта работают идентично. Адрес массива передаётся правильно.

[
Замечу в скобках, что вроде бы во втором варианте
while(Digits--) *Str[Index++] = HexTable[(Value ›› (Digits*4)) & 0x0F];
перед Str стояла *. Сейчас посмотрел повнимательнее, нету, куда-то делась. Может мне почудилось, но именно про неё я и говорил. А может автор отредактировал?
]
Реклама:
=GM= вне форума  
Непрочитано 11.10.2012, 00:09  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от =GM= Посмотреть сообщение
Вот так я передаю строку hexvalue

char hexvalue[20];
IntToHex1 (0x1234, hexvalue, 4); //вызов строки через указатель
IntToHex2 (0x5678, hexvalue, 4); //вызов строки как элемент массива
Не понял в чём разница между вызовами?
_Артём_ вне форума  
Непрочитано 11.10.2012, 13:52  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

остапа несло.
Hives вне форума  
Непрочитано 11.10.2012, 14:47  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от _Артём_ Посмотреть сообщение
Не понял в чём разница между вызовами?
Разница написана в комментах, а именно, в первой подпрограмме элементы массива вызываются по указателю, а во втором - обычным способом, как элементы массива.

Второй вариант подпрограммы можно реализовать вообще без *, вот так

void IntToHex2(int Value, char Str[], int Digits)
{
char HexTable[] = "0123456789ABCDEF";
int Index = 0;
while(Digits--) Str[Index++] = HexTable[(Value ›› (Digits * 4)) & 0x0F];
Str[Index] = 0;
}

Хотя символа *, сиречь символа указателя, нет, но результат работы подпрограммы тот же самый.
=GM= вне форума  
Непрочитано 11.10.2012, 14:51  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

В любом случае будет передан указатель на массив.
Easyrider83 вне форума  
Непрочитано 11.10.2012, 15:39  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Что то спор у вас детский. Вы вызовите эту IntToHex(1,str,4), а потом эту str - на консоль иль в файл. класс увидите hex(1) = 1000 !!!!
Boba_spb вне форума  
Непрочитано 11.10.2012, 20:09  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Boba_spb мой вопрос был почему IAR выкинул совершенно валидный код.
а если у вас из числа 1 получается строка 1000 - это лично ваши проблеммы - код без багов
Hives вне форума  
Непрочитано 11.10.2012, 21:33  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от Hives Посмотреть сообщение
почему IAR выкинул совершенно валидный код
Вот немного изменил код и мой IAR перестал выкидывать ...
Код:
void IntToHex (int Value, char *Str, int Digits)
{
char HexTable[] = "0123456789ABCDEF";
int Index = -1;
while (Digits--) Str[++Index] = HexTable[(Value ›› (Digits * 4)) & 0x0F];
Str[++Index] = 0;
}
И вот такой, кстати, не выкидывает. Только уже не правильная функция.
Код:
void IntToHex (int Value, char *Str, int Digits)
{
char HexTable[] = "0123456789ABCDEF";
int Index = 0;
while (Digits--)  Str[Index++] = HexTable[(Value ›› (Digits * 4)) & 0x0F];
Str[++Index] = 0;
}
Попробуйте поставить Index--; перед последней строчкой, чтобы сделать правильное последнее присваивание.
Нашёл интересную статью по поводу пост-инкремента ...

Последний раз редактировалось Yurkin2007; 11.10.2012 в 21:40.
Yurkin2007 вне форума  
Сказали "Спасибо" Yurkin2007
Hives (12.10.2012)
Непрочитано 11.10.2012, 22:40  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Господа, если не затруднит выложите листинг - интересно глянуть что тама IAR творит. Мой все по честному
Вложения:
Тип файла: rar test.rar (2.2 Кб, 39 просмотров)
Boba_spb вне форума  
Непрочитано 12.10.2012, 01:18  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Ещё один экзотический вариант с заполнением str справа налево, зато сдвиг value делается на 4 разряда всегда, а не как в предыдущих вариантах в первом цикле сдвиг на 12, потом на 8, потом на 4, потом на 0, отсюда скорость выполнения должна возрасти

void int2hex3(int value, char *str, int digits)
{
char i,hexTable[] = "0123456789ABCDEF";
*str-- =0;
for(i=digits;i;--i,value=value››4) *str-- =hexTable[value & 0x0F];
}

Вызов такой

char hexvalue[20],digit=4;
int2hex3(0xABCD, &hexvalue[digit], digit);

Сильно не исследовал, но код похоже покороче будет.

Кстати, таблицу hexTable[] = "0123456789ABCDEF"; похоже лучше сделать глобальной, поскольку при каждом вызове подпрограммы таблица заново копируется из памяти. По крайней мере в кейле так сделано. Поправьте меня, если есть сомнения.
=GM= вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Школа АRMрестлинга Uragan90 Микроконтроллеры, АЦП, память и т.д 54 22.08.2011 16:13
ARM Cortex M3 + Linux SiMiLya Микроконтроллеры, АЦП, память и т.д 10 17.06.2011 17:20
Помогите с STM32 - очень нужно... yakuzaa Микроконтроллеры, АЦП, память и т.д 60 04.08.2010 11:04
Как добавить поддержку для STM32 SFHK Микроконтроллеры, АЦП, память и т.д 11 18.12.2009 18:09


Часовой пояс GMT +4, время: 23:26.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot