Страница 171 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 06, 2013 13:38:28
BorisSPB
Если число аргументов функции изменяется, то ее проще объявить с переменным числом аргументов:
argc задает количество аргументов. В общем что-то типа
printf...
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 06, 2013 15:19:55
Alkarax
urry писал(а):http://forum.sources.ru/index.php?showtopic=248068
здесь находится h файл для загрузки этой длл.
При компиляции этого заголовочного файла куча ошибок:
1>c:\users\otto\documents\visual studio 2008\прключение длл\прключение длл\usbdll.h(16) : error C2143: синтаксическая ошибка: отсутствие ")" перед "*"
1>c:\users\otto\documents\visual studio 2008\прключение длл\прключение длл\usbdll.h(16) : error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\otto\documents\visual studio 2008\прключение длл\прключение длл\usbdll.h(16) : error C2059: синтаксическая ошибка: )
1>c:\users\otto\documents\visual studio 2008\прключение длл\прключение длл\usbdll.h(16) : error C2061: синтаксическая ошибка: идентификатор "BYTE"
1>c:\users\otto\documents\visual studio 2008\прключение длл\прключение длл\usbdll.h(16) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\otto\documents\visual studio 2008\прключение длл\прключение длл\usbdll.h(16) : warning C4183: LPDOGETINFRACODE: отсутствие возвращаемого типа; предполагается функция-член, возвращающая 'int'
вот практически на каждую строчку похожую на эту - typedef int (CALLBACK* LPDOGETINFRACODE)(BYTE *timecodediagram,int diagramlength);
в чем может быть причина?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 06, 2013 17:38:36
YS
Может быть компилятор не опознает BYTE ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 06, 2013 19:28:43
Alkarax
Подключил windows.h в этом заголовочном файле и все норм кроме 1 говорит про любую из фунций, что идентификатор не найден. Может быть я как-то не верно вызываю.
HINSTANCE m_hDLL;
LPCWSTR m_dllpath;
int InitDll(LPCWSTR path)
{
m_dllpath=path;
m_hDLL = LoadLibrary(m_dllpath);
if (m_hDLL != NULL)
{
DoGetInfraCode = (LPDOGETINFRACODE)GetProcAddress(m_hDLL,"DoGetInfraCode");
if (!DoGetInfraCode)
{
FreeLibrary(m_hDLL);
//AfxMessageBox("Нет Функции DoGetInfraCode");
...
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 06:50:34
pokk
Здравствуйте, как можно узнать адрес метки? и вообще с метками можно как-нибудь работать ?
Надо сделать swith без проверки условий.
нашёл подобное вот тут
http://www.cyberforum.ru/blogs/18334/blog91.html
в самом конце
Код: Выделить всё
/* Массив меток перехода на 16 альтернатив switch'а (от 5 до 20) */
static void *arr[16] = { &&L5, &&L6, &&L7, ..., &&L20 };
/* При таких значениях x мы попадаем в один из case'ов switch'а,
* адрес для перехода загрузим из таблицы arr. При этом надо понимать, что
* нулевой элемент таблицы соответствует значению x = 5. */
if (x >= 5 && x <= 20)
goto *arr[x-5];
else
goto L_default;
L5:
y = 10;
L6:
y = 25;
L7:
y = 38;
...
L20:
y = 125;
L_default:
y = 1000;
Но IAR не как не хочет адрес метки выдавать. на метку просто ругается что неизвестная переменная.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 09:40:53
a_skr
Массив должен быть локальным - объявлен внутри функции, содержащей метки.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 11:37:12
blackx
Ох уж эти ваши оптимизации

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 13:11:45
YS
Надо сделать swith без проверки условий.
Чисто ради интереса - зачем?
Просто, походу, причины какие-то экзотические. Не думаю, что прирост в скорости от такого решения будет ощутим в общем случае...
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 18:31:34
pokk
Не думаю, что прирост в скорости от такого решения будет ощутим в общем случае...
Именно из за этого =) сам я ещё не разбирался в данном коде но автор говорит что его программная часть около 4 раз быстрее работать будет.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 19:00:11
BCluster
Где вы там увидели что он в 4 раза быстрее?
Автор в статье описывает принцип работы switch, а не предлагает использовать то, что вы тут привели в качестве примера.
Этот кусок кода приведен для того, чтобы показать как работает конструкция. Ерундой занимаетесь
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 08, 2013 22:24:28
YS
сам я ещё не разбирался в данном коде
Ключевые слова.
На самом деле такой код даст выигрыш только в некоторых специфичных случаях - например, если switch выполняется в огромном (много-много, миллионы, итераций) рассчетном цикле. И то надо крепко думать. А напрягаться с этими массивами просто так смысла нет.
В случае сильной необходимости я бы разбил код, который выполняется в switch, по функциям, сложил бы их адреса в массив и вызывал бы по индексу.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб ноя 09, 2013 08:42:09
pokk
BCluster, видать я не правильно написал у меня есть программа которую надо оптимизировать автор её говорит, что она долго работает из за проверки условий в switch. Поэтому я и занялся этим делом. Сам с этой программной не сильно ознакомился.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб ноя 09, 2013 12:03:21
BCluster
Покажите эту программу, которую надо оптимизировать, так проще будет.
И да, switch не проверяет условия )
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 13, 2013 17:14:37
Chip115
Всем привет! В общем задумал я для отладки заюзать UART. Смысл такой: отправляю по УАПП число 200 (например) и 200 записывается в регистр ЦАПа.
Засада в том, что через terminal лезут ASCII соды. В голову приходит заюзать scanf, но я что-то не уверен что мысль верная. Подскажите, пожалуйста, как можно реализовать эту идею.
Камень STM32F100RB
Среда разработки IAR 6.4
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 13, 2013 17:17:16
blackx
Используйте функцию itoa().
Код: Выделить всё
void* itoa(int input, char *buffer, int radix)
itoa принимает передаваемое целое число input и конвертирует его в число в основании корня radix. Полученное число (последовательность цифр основания radix) записывается в буфер вывода buffer.
Аргумент radix определяет основание системы исчисления для input; его значение может лежать в пределах от 2 до 36.
В зависимости от реализации, itoa может возвращать указатель на первый символ в буфере buffer, или может быть создана таким образом, чтобы передавать нуль-buffer, в результате чего функция возвращает длину строки, которая «будет» записана в корректный buffer.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 13, 2013 18:10:32
Chip115
Спасибо за подсказку! Буду юзать atoi
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 22, 2013 14:03:49
Chip115
И снова здрасьте )
Опять проблема ((
Среда разработки: IAR for ARM 6.40.2.3992
В общем, не корректно работает printf если выводишь double-значение со спецификатором формата %f. Если юзать спец.формата %d, то всё работает как надо.
Не корректная работа проявляется в том, что периодически выводятся все нули.
В настройках full формат, для работы принтфа пришлось вставить вот такой код
Код: Выделить всё
/********************************************************************/
/********************************************************************/
// Посылает один символ в USART1.
int putchar(int c)
{
if(c == '\n')
c = '\r';
while(!(USART1->SR & USART_SR_TC));
USART1->DR = c;
return c;
}
size_t __write(int handle, const unsigned char *buf, size_t bufSize)
{
for (int i = 0; i < bufSize; i++)
{
putchar(buf[i]);
}
return bufSize;
}
в прерывании от таймера через каждый 0,5 сек. вызывается ф-ия принтф
Код: Выделить всё
extern "C"
{
void TIM7_IRQHandler(void)
{
extern int i;
if(TIM7->SR & TIM_SR_UIF)
{
if (i==500)
{
printf ("I = %0.2f\n",3.25);
i=0;
}
else
i++;
TIM7->SR &= ~TIM_SR_UIF; //сбросили флаг
}
}
}
Вот скрин окна терминала с принятыми данными

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 22, 2013 16:10:23
blackx
Сдается мне у вас банальный stack overflow...

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 22, 2013 16:44:28
Chip115
blackx писал(а):Сдается мне у вас банальный stack overflow...

Может быть ) А как с этим бороться?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт ноя 22, 2013 18:05:45
blackx
Попробуйте увеличить размер стека. Большая часть глюков printf() связана именно с тем, что происходит его переполнение.