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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

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

Сообщение Tolmi »

Но, по хорошему, подобные вопросы относятся к разделу "Обучалка"->"Теория", а здесь было бы уместней обсуждать вопросы особенностей программирования именно под МК.
Я бы так предположил.
Оказывается я был не прав.
vitalik_1984 писал(а): или есть более разумные варианты?
достаточно в нужном месте указатель привести к нужному типу:
//////
flash uchar *string1="String";
//////
char *string2;
string2=(char*)string1;
In theory, theory and practice are the same. In practice, they're not.
Реклама
illarionovsp
Прорезались зубы
Сообщения: 234
Зарегистрирован: Ср апр 29, 2009 22:22:13
Откуда: СПб

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

Сообщение illarionovsp »

Конечно, "обучалка". Но мысль у меня была совершенно прагматичная: выводить в mcc18 на консоль SIM Uart плавающие числа. Причём выводить так:
printf((far const rom char*)"f_val=%s\n", ftos(f_val));
и с этой задачей мы справились. Я бы, без вашей помощи, дорогие коты, неделю кувыркался, а так в сумме день потратил, да научился кой-чему.
ЗЫ. Друзья, стоит всю функцию ftos выкладывать? 6 строк. Со знаком, выбором кол-ва знаков после запятой и округлением? Или каждый сам специалист?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Tolmi писал(а):достаточно в нужном месте указатель привести к нужному типу:
//////
flash uchar *string1="String";
//////
char *string2;
string2=(char*)string1;
Этого не достаточно.
Строку нужно переместить из флеши в РАМ, т.к. функция ждёт указатель на область РАМа. А приведение типа всего-лишь поможет присвоить одному указателю(string2) значение другого(string1) без варнингов и ошибок. Но указывать он будет всё равно на область флеши.
Или нет ?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

В большинстве случаев достаточно...
Но здесь другое... строки типа "lol.txt" в WINAVR сохраняются дважды... в DATA и PROGRAM...
Первоначально строка находится в PROGRAM (иначе - откуда ей взяться), потом она загружается в DATA... И дальше уже идёт работа с копией в DATA...
А вот как с этим делом в Кодэвижэне... ХЗ...
Если нет никаких опций в настройках СV, то Ченовский исходник придётся основательно перелопачивать... или определять все нужные строки с последующим приведением типов...
vitalik_1984 высказывал там здравые мысли...
Может проще в студии все сделать?Пример то для нее и много #IF #ELSE под нее в библиотеке заточено.
Если эта строка во флешь, то так и будет считать, что указатель на флешь.
Но лучше сразу забить на этот КодэВздроч... раз и навсегда...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

В любом случае, нужно иметь копию в области данных и указатель на него. Иначе - "БытьБеда" :))) Функция думает, что указатель на дату, а ему суют на флешь...
Реклама
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

В том то и дело...
Как копировать строку "lol.txt"... или делать приведение типов, если "lol.txt" нигде и никак не определена??? К чему привязываться???
Ченовский исходник придётся основательно перелопачивать...
или определять все нужные строки с последующим приведением типов...
Последний раз редактировалось HHIMERA Чт окт 18, 2012 18:48:15, всего редактировалось 1 раз.
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

illarionovsp писал(а):Но мысль у меня была совершенно прагматичная: выводить в mcc18 на консоль SIM Uart плавающие числа. Причём выводить так:
printf((far const rom char*)"f_val=%s\n", ftos(f_val));
...
стоит всю функцию ftos выкладывать? 6 строк.
Почему бы и нет? Для завершённости подтемы.
Хотя у большинства компиляторов библиотечная printf() умеет работать с %f (или есть несколько версий, урезанные по разному и полная с %f), но printf фактически интерпретатор некого языка управления выводом, поэтому размер у него больше, чем просто для преобразования разных чисел в строку.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

Ребята, всплыл вопрос, на который не могу найти нормального решения!
Вот допустим, есть массив {10,35,60,100}
Как программно взять ближайшее число из массива, например к числу 33, или 50!
тоесть мне нужно в результате получить номер члена, к которому ближе всего это число!
Кто подскажет, как это организовать ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Я бы сделал перебором и вычитанием. Искомым элементом будет тот, у которого результат вычитания будет меньшим. Отрицательные результаты вычитания, перед сравнением, переводим в положительные.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Вот сообразил на скору руку, вроде работает.....
Спойлер

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

//аргумент1 - указатель на массив
//аргумент2 - длина массива
//аргумент3 - число для поиска
//значение - номер ближайшего по значению элемента в массиве 

int FindNear (char* mass, int len, unsigned char byte){ 

    unsigned char diff; 
    unsigned char TotalDiff = 255;
    unsigned int position = 0;

    for (unsigned int i=0; i<len; i++){
        unsigned char temp = *(mass + i);
        if (byte < temp)
            diff = temp - byte;
        else
            diff = byte - temp;
        
        if (diff < TotalDiff){
            TotalDiff = diff;
            position = i;
        }
    }
    return position;
} 
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Sceam73 писал(а):...всплыл вопрос, на который не могу найти нормального решения! Вот допустим ...
.. в любом случае многое зависит от "допустим", а именно от размера массива и его характеристик ( наверное массив упорядочен ?). Если массив мал, то как написал Аlex - простой перебор, если массив большой - наверное лучше бинарный поиск...
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

массив содержит 270 элементов! Самые большие числа 5тизначные , самое малое - 0 ! массив упорядочен, тоесть от большего к нулю! И еще нужно минимум вычислительных операций! Так как это будит система зажигания мотоцикла, и вычисляться все будит в плоть до 14 тыс раз в минуту! Так же контроллер будит отображать информацию на лсд, и я боюсь перегрузить контроллер, что б он не тормозил и не тупил! Контроллер атмега8а, кварц 10мгц, как думаете не сильно ли ему накладно будит ?
NickB53
Родился
Сообщения: 10
Зарегистрирован: Вт июл 10, 2012 21:59:47

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

Сообщение NickB53 »

Если массив монотонный как Вы говорите метод дихотомии Вам поможет
illarionovsp
Прорезались зубы
Сообщения: 234
Зарегистрирован: Ср апр 29, 2009 22:22:13
Откуда: СПб

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

Сообщение illarionovsp »

Прошу прощения, но чтобы предыдущую тему закончить:

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

char* ftos(float ff) {
 int g, l, z=1; static char s[20]; float fz=4.0, ft, fp=pow(10.0, fz);
 if(ff<0) { z=-1; ff=-ff; } g=ff; ft=fp*(ff-g)+0.5;
 l=ft; if(ft>=fp) { g++; l-=fp; } g=z*g; 
 sprintf(s, (far const rom char*)"%i.%i", g, l); return s;
}
здесь fz - сколько знаков после запятой нужно иметь. Для int не более 4.
Ещё раз благодарю коллег. Все рекомендации учтены. Прога проверена.
Последний раз редактировалось Аlex Сб окт 20, 2012 23:52:19, всего редактировалось 1 раз.
Причина: Тег CODE
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

Sceam73 писал(а):массив содержит 270 элементов ... и вычисляться все будит в плоть до 14 тыс раз в минуту!
Ваш параметр будет изменяться достаточно медленно - как я понимаю, Вы таким образом хотите получить угол опережения.
Из этого следует такой вариант решения.

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

#define TABLE_SIZE  270 // Размер массива table.


// На самом деле массив содержит на один элемент больше.
// Последний элемент - ограничитель для предовращения
// зацикливания и выхода за границы массива.
unsigned int table [TABLE_SIZE + 1]={
0, 10, 33,



65535}; // Ограничитель - максимально возможное число.

// Функция возврашает число I, удовлетворяющее условию
//      table[I] < X <= table[I+1]
unsigned int convert(unsigned int X)
{
    static int index=0;
    static unsigned int top=0, bottom=0;


    while ((index >= 0) && (index < TABLE_SIZE))
    {
        if (X > top)
        {
            index++;
            bottom=top;
            top=table[index];
            continue;
        }

        if (X < bottom)
        {
            index--;
            top=bottom;
            bottom=table[index];
            continue;
        }

        break;
    }
    return (unsigned int) index;
}
UPD. Алгоритм рассчитан на возрастание чисел в массиве.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

U235 писал(а):
Sceam73 писал(а):массив содержит 270 элементов ... и вычисляться все будит в плоть до 14 тыс раз в минуту!
Ваш параметр будет изменяться достаточно медленно - как я понимаю, Вы таким образом хотите получить угол опережения.
Из этого следует такой вариант решения.
Огромное спасибо ! Сейчас буду пробовать!
illarionovsp
Прорезались зубы
Сообщения: 234
Зарегистрирован: Ср апр 29, 2009 22:22:13
Откуда: СПб

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

Сообщение illarionovsp »

В моей программе avreal обнаружил ошибку. Прошу модератора заменить мой пост на этот.
char* ftos(float ff) {
int g, l, z=1, n=3; static char s[20]; float ft, fp=pow(10.0, n);
if(ff<0) { z=-1; ff=-ff; } g=ff; ft=fp*(ff-g)+0.5;
l=ft; if(ft>=fp) { g++; l-=fp; } g=z*g;
sprintf(s, (far const rom char*)"%i.%0*i", g, n, l);
return s;
}
здесь n - кол-во знаков после запятой.
Прога проверена на DevC++ и mcc18. Ошибок, вроде, нет.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

illarionovsp писал(а):здесь n - кол-во знаков после запятой.
Ну так подпрограмма уже совсем готова принимать число знаков после запятой вторым аргументом.
Интересно -- обычно printf-ы без float и хитрые форматривования с переменной шириной поля не поддерживают. А тут с float обленились, а %0* сделали.
А что оно напечатает, если вывести

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

printf( "|%*.*s|", -6, 3, "12345");
В смысле оно таки да полный набор имеет или нет?
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Выведет
|123xxx|
где х - пробел...
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

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