нужно найти где тело прописано не нам же его писать,тем более, что это уже готовый проект.смотрите на сайте тело выглядит так : тип_переменной имя_функции (тип_переменной имя_входящих_данных [,тип_переменной имя_входящих_данных ]){ объявления используемых внутри тела переменных; действия ;}
то что в квадратных скобках может отсутствовать,а может повторяться. остальные знаки препинания обязательны.
_________________ В поисках истины человек развивается.
Говоря по простому, где-то должен быть *.c файл с прототипом и телом функции, а для использования этой функции во внешних модулях, в *.h файле указываем прототип объявленный как extern, например:
файл urchin.с // о ежах void kill_urchin(void) // прототип, объявление .... // void kill_urchin(void) // тело { ... // убиваем ежа здесь }
и файл urchin.h // подключаем его в том модуле, в котором нужно прибить ежа extern void kill_urchin(void)
если нам нужно нужно убить ежа в другом модуле, то:
int main(void) { #include "urchin.h" // подключаем все внешние обявления о ежах .... kill_urchin(); // наконец-то мы прибили ежа! ... return 0; }
З.Ы. по моему народ путается с вариантом для компиляторов RAD или VC, где достаточно в h(hpp) объявить extern void kill_urchin(void), а сам прототип можно опустить, но насколько я помню для WINAVR, ICC, IAR прототип нужно указывать обязательно...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Не могу найти ошибку!!! Имеется код на асме, который в CodeVision отлично работает.
Код:
#include <avr/io.h>
// Умножение (возведение в квадрат) 2-х 16-ти битных чисел (погрешность - 2 младших байта) unsigned int mul16x16_square(unsigned int a, unsigned int b) { unsigned int result; unsigned char tmp = 0;
Не обращая особо ваше внимание на алгоритм, у меня такой вопрос. Почему в строках (в дизасме они выделены жирным) задействованы одинаковые регистры. Ведь в коде, вроде бы, все правильно стоит (имеется в виду вывод в новый регистр - модификатор '&' в строке вывода - : [RES]"=&r" (result), [TMP]"=&r" (tmp)), а используется один и тот же регистр. В данных случаях - это R18 и R20. Соответственно результат, который должен быть равен: 1234h * 1234h = 14B 5A90h не получается правильным. В моих случаях (и в одном и в другом мне интересны только старшие байты) такие результаты: 1(оптимизация откл.) - 1 4Dh 2(оптимизация вкл.) - 1 44h
Ассемблерный код рабочий (проверен в CV). Где я ошибаюсь?
А почему бы не умножать на си, если пишешь на си, зачем умножать на асме? Или умножай на чистом асме, а так получается компилятор сам выбирает регистры, с которыми ему удобней работать.
Значит пиши на асме и сам придумай алгоритм умножения, тогда компилятор будет использовать твои регистры, т.е. повторит то что ты напишешь. Можно умножить на си, а алгоритм дизасмом выдрать.
алгоритм сложно дизасмом выдирать. Компилятор повторяющиеся части выделяет в куски, которые потом сложно вместе собирать.кусок от деления, умножения может сочетаться с другими кусками, причем еще все это с относительной адресацией между переходами. задача не для слабонервных. если только два числа умножить и посмотреть что получилось.
_________________ В поисках истины человек развивается.
Мужики, помогите, мне очень стыдно, но я совсем не знаю С++, создаю свой проект на WinAVR и столкнулся с колосальной нехваткой знаний по С++. Помогите пожалуйста, я читал посты на этом форуме и не смог найти ответ. Мне нужно превратить число (int) в символы (char). В этой теме я нашел подобный пример на atoi:
#include <stdlib.h> char *number = "123"; int n = atoi(number);
А мне нужно сделать наоборот. Я пытался сделать так:
int n=123; char number = atoi(n);
у меня компилятор выдает предупреждения. Помогите мужики, если вам не тяжело, и желательно на примере, совсем у меня знаний не хватает по С++. И еще, не подскажите, как можно подсчитать колличество символов в таком массиве? char a[]="много символов"; Заранее спасибо, я читаю ваш форум, и нахожу ответы на свои вопросы. Особенно спасибо urry, vitalik_1984 и ARV.
_________________ Кот должен прожить жизнь без сожаления.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Спасибо за ответ. Не подскажете как работает вот эта строчка s[i++] = n % 10 + '0'; в листинге: /* itoa: конвертируем n в символы в s */ void itoa(int n, char s[]) { int i, sign;
if ((sign = n) < 0) /* записываем знак */ n = -n; /* делаем n положительным числом */ i = 0; do { /* генерируем цифры в обратном порядке */ s[i++] = n % 10 + '0'; /* берем следующую цифру */ } while ((n /= 10) > 0); /* удаляем */ if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); } Я не пойму что значит n %10 + '0', как это работает? Я понимаю что тут заполняется массив слова в цифрах. Мне знаний не хватает.
_________________ Кот должен прожить жизнь без сожаления.
n %10 - остаток от деления n на 10, т.е. младшая цифра десятичного представления n. '0' - код литеры 0 в используемой Вами однобайтной кодировке (на 99.999....% это ASCII). Вся конструкция в целом - код литеры, соответствующей младшему десятичному разряду n.
Пример: n = 367, тогда n %10 + '0' == '7' == 0x37 == 067 == 55
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Я сейчас скачал таблицу ASCII, посмотрел, действительно все совпадает. Ничего себе, как придумано уравнение здорово и просто. Я так понял что в строке эта цифра удаляется как десятичный остаток (n = n/10): while ((n /= 10) > 0); /* удаляем */
Можно еще вопрос? А вот функция void itoa(int n, char s[]) Она ведь принимает два значение int n, char s[], или же она принимает значение числа int n, и объявляет массив char s[]?
PS: Спасибо за помощь многоуважаемый кот.
_________________ Кот должен прожить жизнь без сожаления.
Ничего себе, как придумано уравнение здорово и просто.
Используется тот факт, что цифры в кодировке ASCII идут подряд. Поэтому достаточно прибавить цифру к коду нуля, чтобы получить код литеры для этой цифры. Обратное преобразование делается столь же просто - из кода литеры вычитаем код нуля и получаем значение цифры.
В других кодировках обычно также придерживаются подобного принципа. Например, в ныне почти забытой EBCDIC цифры тоже упорядочены.
DruidCat писал(а):
Я так понял что в строке эта цифра удаляется как десятичный остаток (n = n/10): while ((n /= 10) > 0); /* удаляем */
Совершенно верно. И так до тех пор, пока цифр не останется вовсе (условие > 0).
DruidCat писал(а):
Можно еще вопрос? А вот функция void itoa(int n, char s[]) Она ведь принимает два значение int n, char s[], или же она принимает значение числа int n, и объявляет массив char s[]?
Клиент (то есть код, вызывающий функцию) должен предоставить буфер достаточной для хранения текстового представления числа длины (с учетом признака конца строки '\0', а то можно и в чужую область залезть) и передать указатель на него (поскольку фактически объявление char s[] является указателем на начало массива, а не самим массивом).
P.S. Вообще тема массивов и указателей, пожалуй, наиболее скользкая в языке C. Если хотите разобраться, рекомендую книгу: Ted Jensen. Tutorial on Pointers and Arrays in C.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
PS: В инете нашел только на английском языке эту книгу "Ted Jensen. Tutorial on Pointers and Arrays in C."
Да, это она и есть, мне не попадался ее перевод на русский. Впрочем, обычная ситуация - хороших книг почти не переводят, в основном макулатуру.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Доброго времени суток, форумчане. Появилось свободное время, начал ковырять отправку данных через COM-port. Написал какой-никакой код. Естественно, не компилится =) Голову себе сломал, не пойму в чем ошибка
Код:
if ((FLAGS & RESEIVED) == RESEIVED) { // взять символ из буфера reseive[RI] = USART_GetChar();
// c каждым новым символом обновляем CRC if ((RI > 0) && (RI < reseive[1] + 3)) Calculate_CRC16(reseive[RI],CRC16);
неплохо бы проект целиком, возможно где то в макросе ошибка сделана, а показывает здесь, потому что макрос вставляется компилятором как текст бездумно, а потом уже компилируется.
Код:
#define RESEIVED 0x01;//приведет к ошибке, которую вы указали #define RESEIVED 0x01 //правильно
Код:
if ((FLAGS & RESEIVED) == RESEIVED)
если проверяется только один флаг, то можно опустить сравнение так как это еще одна команда.Можно вот так
Код:
if (FLAGS & RESEIVED) { }
Возможно конечно компилятор опустит эту команду ввиду однозначнсти решения, но не факт. Хотя в общем можно и оставить для лучшей читаемости.
_________________ В поисках истины человек развивается.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения