Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Вопросы по С/С++ (СИ)

Сообщение BorisSPB »

Если число аргументов функции изменяется, то ее проще объявить с переменным числом аргументов:

Код: Выделить всё

void func(u8_t argc, ...);
argc задает количество аргументов. В общем что-то типа printf...
Реклама
Аватара пользователя
Alkarax
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт мар 21, 2013 16:22:09

Re: Вопросы по С/С++ (СИ)

Сообщение 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);

в чем может быть причина?
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

Может быть компилятор не опознает BYTE ?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Alkarax
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт мар 21, 2013 16:22:09

Re: Вопросы по С/С++ (СИ)

Сообщение 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");
...
Реклама
Эиком - электронные компоненты и радиодетали
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение 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 не как не хочет адрес метки выдавать. на метку просто ругается что неизвестная переменная.
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

Массив должен быть локальным - объявлен внутри функции, содержащей метки.
Реклама
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: Вопросы по С/С++ (СИ)

Сообщение blackx »

Ох уж эти ваши оптимизации :)))
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

Надо сделать swith без проверки условий.
Чисто ради интереса - зачем? :shock:

Просто, походу, причины какие-то экзотические. Не думаю, что прирост в скорости от такого решения будет ощутим в общем случае...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

Не думаю, что прирост в скорости от такого решения будет ощутим в общем случае...
Именно из за этого =) сам я ещё не разбирался в данном коде но автор говорит что его программная часть около 4 раз быстрее работать будет.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Где вы там увидели что он в 4 раза быстрее?
Автор в статье описывает принцип работы switch, а не предлагает использовать то, что вы тут привели в качестве примера.
Этот кусок кода приведен для того, чтобы показать как работает конструкция. Ерундой занимаетесь
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

сам я ещё не разбирался в данном коде
Ключевые слова.

На самом деле такой код даст выигрыш только в некоторых специфичных случаях - например, если switch выполняется в огромном (много-много, миллионы, итераций) рассчетном цикле. И то надо крепко думать. А напрягаться с этими массивами просто так смысла нет.

В случае сильной необходимости я бы разбил код, который выполняется в switch, по функциям, сложил бы их адреса в массив и вызывал бы по индексу.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

BCluster, видать я не правильно написал у меня есть программа которую надо оптимизировать автор её говорит, что она долго работает из за проверки условий в switch. Поэтому я и занялся этим делом. Сам с этой программной не сильно ознакомился.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Покажите эту программу, которую надо оптимизировать, так проще будет.
И да, switch не проверяет условия )
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Chip115 »

Всем привет! В общем задумал я для отладки заюзать UART. Смысл такой: отправляю по УАПП число 200 (например) и 200 записывается в регистр ЦАПа.
Засада в том, что через terminal лезут ASCII соды. В голову приходит заюзать scanf, но я что-то не уверен что мысль верная. Подскажите, пожалуйста, как можно реализовать эту идею.
Камень STM32F100RB
Среда разработки IAR 6.4
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: Вопросы по С/С++ (СИ)

Сообщение blackx »

Используйте функцию itoa().

Код: Выделить всё

void* itoa(int input, char *buffer, int radix)
itoa принимает передаваемое целое число input и конвертирует его в число в основании корня radix. Полученное число (последовательность цифр основания radix) записывается в буфер вывода buffer.
Аргумент radix определяет основание системы исчисления для input; его значение может лежать в пределах от 2 до 36.
В зависимости от реализации, itoa может возвращать указатель на первый символ в буфере buffer, или может быть создана таким образом, чтобы передавать нуль-buffer, в результате чего функция возвращает длину строки, которая «будет» записана в корректный buffer.
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Chip115 »

Спасибо за подсказку! Буду юзать atoi
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение 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;    //сбросили флаг
    }
  }
}
Вот скрин окна терминала с принятыми данными
Изображение
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: Вопросы по С/С++ (СИ)

Сообщение blackx »

Сдается мне у вас банальный stack overflow... :roll:
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Chip115 »

blackx писал(а):Сдается мне у вас банальный stack overflow... :roll:
Может быть ) А как с этим бороться?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: Вопросы по С/С++ (СИ)

Сообщение blackx »

Попробуйте увеличить размер стека. Большая часть глюков printf() связана именно с тем, что происходит его переполнение.
Изображение only pure true norwegian blackx Изображение
Ответить

Вернуться в «Разные вопросы по МК»