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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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

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

Сообщение shads »

vitalik_1984 писал(а):Все сомнения устраняются способом, что вам выше предложили.
Ну это всего лиш один из вариантов решения..... А мне все таки интересно реализовать свой вариант, и думаю что это как то возможно, пока не знаю как.....

vitalik_1984 писал(а):Вместо того, чтобы перелопачивать весь массив 300 символов, вдруг меню увеличится
Не совсем понял, о каком перелопачивании идет речь.....
Вообще этот вариант я хочу использовать для навигации по меню. Т.е. у меня есть переменная, которая содержит номер строчки менюшки, которая должна выводится в первую строку дисплея (на вторую строку дисплея, соответственно следующая строка менюшки). Теперь достаточно просто увеличивать\уменьшать переменную, чтобы прокручивать меню на 2-х строчном дисплее.... Для того чтобы внести\убрать строки меню, достаточно их просто вставить\удалить в текстовом списке в PROGMEM, ну и соответственно в навигации увеличить\уменьшить номер последней возможной строки меню. Никакого перелопачивания.....
Единственное - при изменении списка менюшек, придется корректировать выбор нужных функций, при активизации соответствующего пункта меню..... Ну так это же необходимо проделать и в вашем случае..... И кроме того как раз именно в вашем случае еще придется вручную перелапачивать таблицу списка указателей.....

vitalik_1984 писал(а):нужно будет сделать вложенные меню тогда увидите, что это лишний геморрой.
Tут тоже все элементарно, делаю в массиве связанные группы текстовых строк, и при активизации соответствующей менюшки, указываю первую строку нужной группы. Так можно организовать кучу менюшек, неважно вложенные или еще какие..... Вот например главная менюшка и вложенная, вызываемая из последнего пункта главной....

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

//МЕНЮ ОСНОВНОЕ                         "0123456789abcdef0123456789abcdef"
unsigned char TxtSens1            [] PROGMEM= " ";                    //строка первого термодатчика
unsigned char TxtSens2            [] PROGMEM= " ";                    //строка второго термодатчика
unsigned char TxtTime            [] PROGMEM= "время:";                //время
unsigned char TxtDate            [] PROGMEM= "дата:";                //дата
unsigned char TxtAlarm            [] PROGMEM= "будильник:";            //будильник
unsigned char TxtSetupBase        [] PROGMEM= "сист. настройки";        //установки

//МЕНЮ ВЫБОРА НАСТРОЕК                    "0123456789abcdef0123456789abcdef"
unsigned char TxtSetupAlarm        [] PROGMEM= "будильник";            //настройка будильника
unsigned char TxtSetupSens        [] PROGMEM= "настройка часов";        //программирование сенсоров
unsigned char TxtSetupTime        [] PROGMEM= "повтор тревоги";        //настройка часов
unsigned char TxtSetupTReg        [] PROGMEM= "период рег-ции";        //программирование времени регистрации
unsigned char TxtSetupTRpt        [] PROGMEM= "термо датчики";        //программирование времени повтора тревоги    


vitalik_1984 писал(а):Так в массиве указателей точно видно где какой элемент, можно массивов сделать несколько.
В моем случае и без массива видно где какой элемент, достаточно взглянуть на список строк меню..... А групп менюшных можно сделать хоть завались.....

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

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

Сообщение Tolmi »

:facepalm:
Чего только люди не придумывают, чтобы не изучать тот инструмент, котором они пользуются. Писать на Сях и не использовать указатели, да ещё на МК с их убогими ресурсами - редкостное извращение. Ну ок, ваш вариант может и будет работать. А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет. Ничего страшного, можно ещё раз программу переписать :tea:
In theory, theory and practice are the same. In practice, they're not.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Tolmi писал(а):Чего только люди не придумывают, чтобы не изучать тот инструмент, котором они пользуются. Писать на Сях и не использовать указатели
Гы.....
Эт с чего вы взяли что я не использую указатели..... на прошлой страничке приведен код функции реализующей мой способ, посмотрите внимательнее.....
Я веду речь только о том, чтобы не создавать дополнительный список указателей..... т.к. это можно сделать по другому, и это уже работает..... вопрос только в том как оформить текстовые константы в PROGMEM, чтобы они не разбросались компилятором, (создать аналог структуры).

Tolmi писал(а):да ещё на МК с их убогими ресурсами.
А вы что уже попробовали использовать оба этих варианта, и убедились, что вариант с дополнительным списком указателей, кушает меньше ресурсов?????

Tolmi писал(а):Ну ок, ваш вариант может и будет работать.
Прекрасно работает..... (правда пока только в протеусе)

Tolmi писал(а):А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет.
А что при выходе новой версии, разработчики компилятора начинают отказыватся от стандартов языка Си ?????


зы Понятное дело что, пока я не нашел способа, закрепить, последовательность констант в PROGMEM, я и не настаиваю на таком решении..... Но я думаю что такй способ должен быть.....
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Вообще, насколько я понял, в структуре только последний элемент может быть неопределенного размера.Или это не так?Может поэтому он не дает вам создать такой массив как у вас?
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

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

Сообщение Cheba »

shads писал(а):
Tolmi писал(а):А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет.
А что при выходе новой версии, разработчики компилятора начинают отказыватся от стандартов языка Си ?????

1. В стандартах языка Си ничего не говорится о том, каким образом компиллятор обязан размещать данные
2. Фирмы-производители в погоне за новомодными фишками могут наплевать даже и на стандарты тоже, не говоря уж о такой мелочи.

зы Понятное дело что, пока я не нашел способа, закрепить, последовательность констант в PROGMEM, я и не настаиваю на таком решении..... Но я думаю что такй способ должен быть.....

PROGMEM действует только на стандартные предопределенные типы. Можно создать одну длинню-ющу-у-у-ю строку со спецсимволоами разделителями внутри, потом заменить спецсимволы на нули, ну а дальше работать с ней по предложенной Вами схеме.
nicname
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 16, 2006 22:20:04

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

Сообщение nicname »

Есть вопрос для профей в HI-TECH C Compiler for PIC10/12/16 MCUs, ну и вообще в Си. Вот есть некий код с 16 разрядной(двух байтовой) беззнаковой переменной. Как её записывать в ЭСПЗУ - это понятно, а как оттуда значение из двух ячеек ЭСПЗУ в неё записать?

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

{
 unsigned int tv;
EEPROM_WRITE(2,tv>>7);
EEPROM_WRITE(cnt,tv&255);
....
tv=(EEPROM_READ(2)<<7)*255;
tv=tv*EEPROM_READ(cnt);   
}
nicname
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

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

unsigned int tv;

........
........
/* Запись */
unsigned char *p=(unsigned char*)&tv;
EEPROM_WRITE(0,*p++);
EEPROM_WRITE(1,*p++);
........
........
/* Чтение */
unsigned char *p=(unsigned char*)&tv;
*p++ = EEPROM_READ(0);
*p++ = EEPROM_READ(1);
nicname
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 16, 2006 22:20:04

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

Сообщение nicname »

Аlex писал(а):

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

unsigned int tv;

........
........
/* Запись */
unsigned char *p=(unsigned char*)&tv;
EEPROM_WRITE(0,*p++);
EEPROM_WRITE(1,*p++);
........
........
/* Чтение */
unsigned char *p=(unsigned char*)&tv;
*p++ = EEPROM_READ(0);
*p++ = EEPROM_READ(1);

Чего потом-то делать после чтения с этой unsigned char *p ? Да и по внешнему виду тут она одинакова, только из разных ячеек читается? Как она отсовокупливается от unsigned int tv понятно, только опять же вроде одинаково от обоих байтов этой unsigned int tv , а как после присовокупить её к этой unsigned int tv ? Да и декремент этой unsigned char *p как младшей и старшей ячейкам ЭСПЗУ соответствует, хоть это к делу и не относится?
nicname
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Не нужно с ней потом ничего делать, это указатель. Через него будут записываться данные в Вашу 2-х байтную переменную.
nicname
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 16, 2006 22:20:04

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

Сообщение nicname »

Аlex писал(а):Не нужно с ней потом ничего делать, это указатель. Через него будут записываться данные в Вашу 2-х байтную переменную.

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

unsigned int tv;
/* Чтение */
unsigned char *p=(unsigned char*)&tv;
*p++ = EEPROM_READ(0);
*p++ = EEPROM_READ(1);

Он как-то странно пишет? Так и должен - на старший байт переменной с инкрементом показывать, а потом на младший ещё с инкрементом одним? При инициализации просто на имя переменной указывает или куда?
Последний раз редактировалось nicname Чт янв 17, 2013 11:19:23, всего редактировалось 1 раз.
nicname
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

А мне прочитать ведь надо?
Что прочитать нужно ? Переменную ?
nicname
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 16, 2006 22:20:04

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

Сообщение nicname »

Аlex писал(а):
А мне прочитать ведь надо?
Что прочитать нужно ? Переменную ?

Нет, эспзу
nicname
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

А куда прочитать ?
nicname
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 16, 2006 22:20:04

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

Сообщение nicname »

в переменную эту, ну условно, в младших адресах ЭСПЗУ если старший байт её? А вообще они у меня не по порядку. В смысле младшим байтом может быть любая ячейка. Ну и всё это правильно записать в переменную. То есть нет никакого смысла в пойнтерах. Дребедень какая-то, ну если только покороче компилируется...
nicname
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

в переменную эту
Ну а чем тогда Вам не понравился мой ответ :
Через него будут записываться данные в Вашу 2-х байтную переменную.
? :)

То есть нет никакого смысла в пойнтерах
Ну почему же ? Не все компиляторы Вам "скажут спасибо" за всяческие сдвиги, умножения, деления, .... А с указателем, Вы по байтикам работаете с переменной.
nicname
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 16, 2006 22:20:04

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

Сообщение nicname »

Аlex писал(а):
в переменную эту
....
Не все компиляторы Вам "скажут спасибо" за всяческие сдвиги, умножения, деления, .... А с указателем, Вы по байтикам работаете с переменной.

Ну. попробую - с другими вариантами

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

{
unsigned int tv;
#define EE_ADR 2
EEPROM_WRITE(EE_ADR,(unsigned char)tv>>8;                  // high byte
EEPROM_WRITE(EE_ADR+1,(unsigned char)tv&255);               // low byte
...
tv=EEPROM_READ(EE_ADR)<<8;                        // high byte
tv+=EEPROM_READ(EE_ADR+1);                        // low byte
}

union
{
unsigned int tv;
unsigned char cByte[2];
}my_union;
my_union.tv=0x1234;
EEPROM_WRITE(0,my_union.cByte[0]);
EEPROM_WRITE(1,my_union.cByte[1]);

{
unsigned int tv;
EEPROM_WRITE(2,tv>>8);
EEPROM_WRITE(cnt,tv&255);
....
tv=(EEPROM_READ(2)<<8);
tv |= EEPROM_READ(cnt);   
}

ерунда полнейшая в прошивке получается. Компилятор Хай-Тека виноват, справедливо вы заметили :evil:
nicname
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

Проблемма- помогите разобрать:
Работаю в IAR STM32,проблемма подключения библиотек(которые создал сам): отдельно сделал SPI,UART,инициализацию MMC карту,и главную программу.
Если все скинуть в один файл работает,если делать по библиотекам нет(

Посмотрите я правильно ИНКЛЮДЮ?))

[img]C:\Documents%20and%20Settings\Admin\Мои%20документы\Мои%20рисунки\Безымянный.GIF[/img]
Вложения
Безымянный.GIF
(66.9 КБ) 309 скачиваний
include.rar
(3.38 КБ) 198 скачиваний
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

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

Сообщение blackx »

Инклюдить нужно только заголовочные файлы, "*.c" уберите.
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Интересно..., библиотеки создавать научился, а подключать - нет... :)))
Курим - Как оформлять модули
Ответить

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