Страница 133 из 386

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

Добавлено: Пт янв 11, 2013 10:26:45
vitalik_1984
Все сомнения устраняются способом, что вам выше предложили.
Вместо того, чтобы перелопачивать весь массив 300 символов вдруг меню увеличится или нужно будет сделать вложенные меню тогда увидите, что это лишний геморрой.Так в массиве указателей точно видно где какой элемент, можно массивов сделать несколько.А как у вас это нужно будет постоянно пересчитывать вручную все строки, чтобы отправить на нужную строку.

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

Добавлено: Пт янв 11, 2013 11:21:50
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 писал(а):нужно будет постоянно пересчитывать вручную все строки, чтобы отправить на нужную строку.
Тоже не совсем понял о чем речь..... но если речь идет об активизации выбранного пункта меню, то это и в моем и в вашем случае вручную определяется, какая именно функция будет вызываться.....

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

Добавлено: Пт янв 11, 2013 11:31:19
Tolmi
:facepalm:
Чего только люди не придумывают, чтобы не изучать тот инструмент, котором они пользуются. Писать на Сях и не использовать указатели, да ещё на МК с их убогими ресурсами - редкостное извращение. Ну ок, ваш вариант может и будет работать. А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет. Ничего страшного, можно ещё раз программу переписать :tea:

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

Добавлено: Пт янв 11, 2013 12:07:51
shads
Tolmi писал(а):Чего только люди не придумывают, чтобы не изучать тот инструмент, котором они пользуются. Писать на Сях и не использовать указатели
Гы.....
Эт с чего вы взяли что я не использую указатели..... на прошлой страничке приведен код функции реализующей мой способ, посмотрите внимательнее.....
Я веду речь только о том, чтобы не создавать дополнительный список указателей..... т.к. это можно сделать по другому, и это уже работает..... вопрос только в том как оформить текстовые константы в PROGMEM, чтобы они не разбросались компилятором, (создать аналог структуры).
Tolmi писал(а):да ещё на МК с их убогими ресурсами.
А вы что уже попробовали использовать оба этих варианта, и убедились, что вариант с дополнительным списком указателей, кушает меньше ресурсов?????
Tolmi писал(а):Ну ок, ваш вариант может и будет работать.
Прекрасно работает..... (правда пока только в протеусе)
Tolmi писал(а):А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет.
А что при выходе новой версии, разработчики компилятора начинают отказыватся от стандартов языка Си ?????


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

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

Добавлено: Пт янв 11, 2013 13:41:20
vitalik_1984
Вообще, насколько я понял, в структуре только последний элемент может быть неопределенного размера.Или это не так?Может поэтому он не дает вам создать такой массив как у вас?

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

Добавлено: Сб янв 12, 2013 16:25:56
Cheba
shads писал(а):
Tolmi писал(а):А потом в новой версии компиллятора сделают какую-нибудь оптимизацию, и он работать перестанет.
А что при выходе новой версии, разработчики компилятора начинают отказыватся от стандартов языка Си ?????
1. В стандартах языка Си ничего не говорится о том, каким образом компиллятор обязан размещать данные
2. Фирмы-производители в погоне за новомодными фишками могут наплевать даже и на стандарты тоже, не говоря уж о такой мелочи.
зы Понятное дело что, пока я не нашел способа, закрепить, последовательность констант в PROGMEM, я и не настаиваю на таком решении..... Но я думаю что такй способ должен быть.....
PROGMEM действует только на стандартные предопределенные типы. Можно создать одну длинню-ющу-у-у-ю строку со спецсимволоами разделителями внутри, потом заменить спецсимволы на нули, ну а дальше работать с ней по предложенной Вами схеме.

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

Добавлено: Чт янв 17, 2013 08:28:24
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);	
}

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

Добавлено: Чт янв 17, 2013 08:48:05
А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);

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

Добавлено: Чт янв 17, 2013 10:10:20
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 как младшей и старшей ячейкам ЭСПЗУ соответствует, хоть это к делу и не относится?

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

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

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

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

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

unsigned int tv;
/* Чтение */
unsigned char *p=(unsigned char*)&tv;
*p++ = EEPROM_READ(0);
*p++ = EEPROM_READ(1);
Он как-то странно пишет? Так и должен - на старший байт переменной с инкрементом показывать, а потом на младший ещё с инкрементом одним? При инициализации просто на имя переменной указывает или куда?

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

Добавлено: Чт янв 17, 2013 11:17:47
Аlex
А мне прочитать ведь надо?
Что прочитать нужно ? Переменную ?

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

Добавлено: Чт янв 17, 2013 11:19:52
nicname
Аlex писал(а):
А мне прочитать ведь надо?
Что прочитать нужно ? Переменную ?
Нет, эспзу

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

Добавлено: Чт янв 17, 2013 11:20:35
Аlex
А куда прочитать ?

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

Добавлено: Чт янв 17, 2013 11:35:39
nicname
в переменную эту, ну условно, в младших адресах ЭСПЗУ если старший байт её? А вообще они у меня не по порядку. В смысле младшим байтом может быть любая ячейка. Ну и всё это правильно записать в переменную. То есть нет никакого смысла в пойнтерах. Дребедень какая-то, ну если только покороче компилируется...

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

Добавлено: Чт янв 17, 2013 11:54:52
Аlex
в переменную эту
Ну а чем тогда Вам не понравился мой ответ :
Через него будут записываться данные в Вашу 2-х байтную переменную.
? :)
То есть нет никакого смысла в пойнтерах
Ну почему же ? Не все компиляторы Вам "скажут спасибо" за всяческие сдвиги, умножения, деления, .... А с указателем, Вы по байтикам работаете с переменной.

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

Добавлено: Пт янв 18, 2013 19:08:27
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:

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

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

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

[img]C:\Documents%20and%20Settings\Admin\Мои%20документы\Мои%20рисунки\Безымянный.GIF[/img]

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

Добавлено: Сб фев 02, 2013 15:31:07
blackx
Инклюдить нужно только заголовочные файлы, "*.c" уберите.

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

Добавлено: Сб фев 02, 2013 15:35:25
Аlex
Интересно..., библиотеки создавать научился, а подключать - нет... :)))
Курим - Как оформлять модули