Вопросы по С/С++ (СИ)
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Все сомнения устраняются способом, что вам выше предложили.
Вместо того, чтобы перелопачивать весь массив 300 символов вдруг меню увеличится или нужно будет сделать вложенные меню тогда увидите, что это лишний геморрой.Так в массиве указателей точно видно где какой элемент, можно массивов сделать несколько.А как у вас это нужно будет постоянно пересчитывать вручную все строки, чтобы отправить на нужную строку.
Вместо того, чтобы перелопачивать весь массив 300 символов вдруг меню увеличится или нужно будет сделать вложенные меню тогда увидите, что это лишний геморрой.Так в массиве указателей точно видно где какой элемент, можно массивов сделать несколько.А как у вас это нужно будет постоянно пересчитывать вручную все строки, чтобы отправить на нужную строку.
Re: Вопросы по С/С++ (СИ)
Ну это всего лиш один из вариантов решения..... А мне все таки интересно реализовать свой вариант, и думаю что это как то возможно, пока не знаю как.....vitalik_1984 писал(а):Все сомнения устраняются способом, что вам выше предложили.
Не совсем понял, о каком перелопачивании идет речь.....vitalik_1984 писал(а):Вместо того, чтобы перелопачивать весь массив 300 символов, вдруг меню увеличится
Вообще этот вариант я хочу использовать для навигации по меню. Т.е. у меня есть переменная, которая содержит номер строчки менюшки, которая должна выводится в первую строку дисплея (на вторую строку дисплея, соответственно следующая строка менюшки). Теперь достаточно просто увеличивать\уменьшать переменную, чтобы прокручивать меню на 2-х строчном дисплее.... Для того чтобы внести\убрать строки меню, достаточно их просто вставить\удалить в текстовом списке в PROGMEM, ну и соответственно в навигации увеличить\уменьшить номер последней возможной строки меню. Никакого перелопачивания.....
Единственное - при изменении списка менюшек, придется корректировать выбор нужных функций, при активизации соответствующего пункта меню..... Ну так это же необходимо проделать и в вашем случае..... И кроме того как раз именно в вашем случае еще придется вручную перелапачивать таблицу списка указателей.....
Tут тоже все элементарно, делаю в массиве связанные группы текстовых строк, и при активизации соответствующей менюшки, указываю первую строку нужной группы. Так можно организовать кучу менюшек, неважно вложенные или еще какие..... Вот например главная менюшка и вложенная, вызываемая из последнего пункта главной....vitalik_1984 писал(а):нужно будет сделать вложенные меню тогда увидите, что это лишний геморрой.
Код: Выделить всё
//МЕНЮ ОСНОВНОЕ "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: Вопросы по С/С++ (СИ)
Чего только люди не придумывают, чтобы не изучать тот инструмент, котором они пользуются. Писать на Сях и не использовать указатели, да ещё на МК с их убогими ресурсами - редкостное извращение. Ну ок, ваш вариант может и будет работать. А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет. Ничего страшного, можно ещё раз программу переписать

In theory, theory and practice are the same. In practice, they're not.
Re: Вопросы по С/С++ (СИ)
Гы.....Tolmi писал(а):Чего только люди не придумывают, чтобы не изучать тот инструмент, котором они пользуются. Писать на Сях и не использовать указатели
Эт с чего вы взяли что я не использую указатели..... на прошлой страничке приведен код функции реализующей мой способ, посмотрите внимательнее.....
Я веду речь только о том, чтобы не создавать дополнительный список указателей..... т.к. это можно сделать по другому, и это уже работает..... вопрос только в том как оформить текстовые константы в PROGMEM, чтобы они не разбросались компилятором, (создать аналог структуры).
А вы что уже попробовали использовать оба этих варианта, и убедились, что вариант с дополнительным списком указателей, кушает меньше ресурсов?????Tolmi писал(а):да ещё на МК с их убогими ресурсами.
Прекрасно работает..... (правда пока только в протеусе)Tolmi писал(а):Ну ок, ваш вариант может и будет работать.
А что при выходе новой версии, разработчики компилятора начинают отказыватся от стандартов языка Си ?????Tolmi писал(а):А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет.
зы Понятное дело что, пока я не нашел способа, закрепить, последовательность констант в PROGMEM, я и не настаиваю на таком решении..... Но я думаю что такй способ должен быть.....
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Вообще, насколько я понял, в структуре только последний элемент может быть неопределенного размера.Или это не так?Может поэтому он не дает вам создать такой массив как у вас?
Re: Вопросы по С/С++ (СИ)
shads писал(а):А что при выходе новой версии, разработчики компилятора начинают отказыватся от стандартов языка Си ?????Tolmi писал(а):А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет.
1. В стандартах языка Си ничего не говорится о том, каким образом компиллятор обязан размещать данные
2. Фирмы-производители в погоне за новомодными фишками могут наплевать даже и на стандарты тоже, не говоря уж о такой мелочи.
зы Понятное дело что, пока я не нашел способа, закрепить, последовательность констант в PROGMEM, я и не настаиваю на таком решении..... Но я думаю что такй способ должен быть.....
PROGMEM действует только на стандартные предопределенные типы. Можно создать одну длинню-ющу-у-у-ю строку со спецсимволоами разделителями внутри, потом заменить спецсимволы на нули, ну а дальше работать с ней по предложенной Вами схеме.
Re: Вопросы по С/С++ (СИ)
Есть вопрос для профей в 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: Вопросы по С/С++ (СИ)
Код: Выделить всё
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);
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);
Чего потом-то делать после чтения с этой unsigned char *p ? Да и по внешнему виду тут она одинакова, только из разных ячеек читается? Как она отсовокупливается от unsigned int tv понятно, только опять же вроде одинаково от обоих байтов этой unsigned int tv , а как после присовокупить её к этой unsigned int tv ? Да и декремент этой unsigned char *p как младшей и старшей ячейкам ЭСПЗУ соответствует, хоть это к делу и не относится?
nicname
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Не нужно с ней потом ничего делать, это указатель. Через него будут записываться данные в Вашу 2-х байтную переменную.
Re: Вопросы по С/С++ (СИ)
А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: Вопросы по С/С++ (СИ)
Что прочитать нужно ? Переменную ?А мне прочитать ведь надо?
Re: Вопросы по С/С++ (СИ)
Аlex писал(а):Что прочитать нужно ? Переменную ?А мне прочитать ведь надо?
Нет, эспзу
nicname
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А куда прочитать ?
Re: Вопросы по С/С++ (СИ)
в переменную эту, ну условно, в младших адресах ЭСПЗУ если старший байт её? А вообще они у меня не по порядку. В смысле младшим байтом может быть любая ячейка. Ну и всё это правильно записать в переменную. То есть нет никакого смысла в пойнтерах. Дребедень какая-то, ну если только покороче компилируется...
nicname
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну а чем тогда Вам не понравился мой ответ :в переменную эту
?Через него будут записываться данные в Вашу 2-х байтную переменную.
Ну почему же ? Не все компиляторы Вам "скажут спасибо" за всяческие сдвиги, умножения, деления, .... А с указателем, Вы по байтикам работаете с переменной.То есть нет никакого смысла в пойнтерах
Re: Вопросы по С/С++ (СИ)
А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);
}
ерунда полнейшая в прошивке получается. Компилятор Хай-Тека виноват, справедливо вы заметили
nicname
Re: Вопросы по С/С++ (СИ)
Проблемма- помогите разобрать:
Работаю в IAR STM32,проблемма подключения библиотек(которые создал сам): отдельно сделал SPI,UART,инициализацию MMC карту,и главную программу.
Если все скинуть в один файл работает,если делать по библиотекам нет(
Посмотрите я правильно ИНКЛЮДЮ?))
[img]C:\Documents%20and%20Settings\Admin\Мои%20документы\Мои%20рисунки\Безымянный.GIF[/img]
Работаю в IAR STM32,проблемма подключения библиотек(которые создал сам): отдельно сделал SPI,UART,инициализацию MMC карту,и главную программу.
Если все скинуть в один файл работает,если делать по библиотекам нет(
Посмотрите я правильно ИНКЛЮДЮ?))
[img]C:\Documents%20and%20Settings\Admin\Мои%20документы\Мои%20рисунки\Безымянный.GIF[/img]
- Вложения
-
- Безымянный.GIF
- (66.9 КБ) 308 скачиваний
-
- include.rar
- (3.38 КБ) 198 скачиваний
- blackx
- Говорящий с текстолитом
- Сообщения: 1518
- Зарегистрирован: Пт дек 28, 2012 21:56:46
- Откуда: St. Petersburg
Re: Вопросы по С/С++ (СИ)
Инклюдить нужно только заголовочные файлы, "*.c" уберите.
only pure true norwegian blackx 