-
Постов
344 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Сообщения, опубликованные Quasar
-
-
Ну либо:
static void (*rputchar)(unsigned char c); void rprintfInit(void (*putchar_func)(unsigned char c)) { rputchar = putchar_func; } void rprintfChar(unsigned char c) { rputchar(c); }
Тогда при инициализации:
rprintfInit(lcd_putchar);
И печатаем, что хотим :)
rprintfChar('Y'); . . .
Так сделано например в AVRlib.
-
Отправил немного о себе на маил :)
-
И не может работать в принципе. Все правильно.
В смысле не может, всё работает, если использовать только один массив (ну во всяком случае в gcc), вот с двумя уже нет.
А что значит, наложение на уже существующую память?
-
В теории цепей обычно рассматриваются установивщиеся режимы, а тут переходной процесс.
Да вы что, одна из тем курса теории цепей так и звучит "Ресчет переходных процессов в цепях первого - второго порядка", так что, это именно ТЭЦ, и даже ОТЦ (основы теории цепей).
А формула U(t)=E*(1-exp(-t/tau)) есть переходная характеристика данной RC цепочки. Находить её можно разными способами, изначально, это конечно решение диф.ур-я цепи. Ну, а проще юзать либо преобразование Лапласа, либо Фурье...(только это разве, что в целях повышения образованности :) )
-
И как, допустим, в цикле их перебирать если все структуры разной длины???
Да, с перебором в цикле - проблема :) . Но как Вы могли догадаться, в массиве Text[] храниться текст :) , и вообщем-то данный приём только для текста-то и полезен, ибо в цикле чаще всего стоит условие while ( '\0' != Text[i++]) то есть перебираем весь массив, допустим для печати.
Ну а в плане инициализации то:
typedef struct { void *Next; void *Previous; void *Parent; void *Sibling; FuncPtr SelectFunc; FuncPtr EnterFunc; const char Text[]; } Menu_Item PROGMEM; Menu_Item MyStruct = {(void*)&SomePtr, (void*)&SomePtr, (void*)&SomePtr, (void*)&SomePtr, (FuncPtr)SomeFnc, (FuncPtr)SomeFnc, { "SomeTEXT" }};
Ну а полный код взят собственно здесь:
-
Опубликовано · Изменено пользователем Quasar · Пожаловаться
ИМХО это очччень не хорошо, если это на самом деле работает. Ни когда не известно, какого размера структураНу почему не известно, длинна всех типов в структуре, плюс длинна массива, полученная при инициализации, так получается. Кстати именно поэтому видимо и требование такое, что бы массив был в конце структуры, вот два и не получится разместить :crying: .
В определении типа не нужно указывать атрибутов (PROGMEM), они указываются при обьявлении переменных этого типа :
Ну почему же не нужно, смотря для чего, в данном случае надо что бы всё было во флеш, зачем же тогда по сто раз PROGMEM писать. :)
-
Можно сделать немного по другому, если Вы не знаете точно, какой длины массивы будут
typedef struct { const char *pEngl; /* указатель на массив Engl */ const char pRuss; /* указатель на массив Russ */ } LangStruct PROGMEM;
А далее в конструкторе (функции инициализации) указателям присваивать конкретные адреса массивов... Еще бы я добавил, в таком случае, в структуру размеры массивов.
Ну да, видимо так и сделаю.
Интересно, а какой размер массива Text??? Зеро байт? :) Или миллион?А ни какой, это примерно аналогично extern char Mass[], то есть происходит определение, а память выделяется при создании экземпляра.
-
Опубликовано · Изменено пользователем Quasar · Пожаловаться
Нет конечно! Ни один, ни два и не десять массивов (в структуре или нет) так определять нельзя. И компилятор ругается справедливо, ибо размеры массивов не заданы, соответственно, компилятор не знает, сколько памяти надо для размещения переменной такого типа.Почему это ни одного?
typedef struct { void *Next; void *Previous; void *Parent; void *Sibling; FuncPtr SelectFunc; FuncPtr EnterFunc; const char Text[]; } Menu_Item PROGMEM;
Прекрасно компилится и работает. (Это из MicroMenu взято). Проблема именно в двух таких массивах.
Да, и к тому же опеределение типа
extern char mass[]; тоже вполне работает, но это уже отдельный разговор...
-
При таком определении компилятор ругается:
typedef struct { const char Engl[]; const char Russ[]; } LangStruct PROGMEM;
Мол переменной длинны, массив не в конце.
Собственно вопрос, а возможно ли вообще в С размещать таким образом два массива?
-
Опубликовано · Изменено пользователем Quasar · Пожаловаться
Const скажет компилятору о том, что это не модифицируется, но расположение всё равно будет в sram.
Я делал так:
#include <avr/pgmspace.h> const uint8_t nameMas0[] PROGMEM= { ..... }; ..... //Считывание i = pgm_read_byte(&nameMas0[нумбер]);
umup
Опередил :)
-
Толк будет только от того кто сам хочет что-то получить за время обучения, другого толка я не знаю.
Прально, но согласитесь, что в данном случае, для такого человека и ВУЗ уже не нужен... Парадокс :blink:
-
Опубликовано · Изменено пользователем Quasar · Пожаловаться
Если кто знает или сам учился, поделитесь впечатлениями о качестве обучения в предложенном Вами СУЗе.Я заканчивал МРТК им А.А.Расплетина... года 3 назад. Вообщем качество ни какое. Но всё равно лучше, чем идти в 10 и 11 класс школы, тут хотя бы какую-нибудь корочку с профилем дают. Могу сказать, что на радио-специальностях у них последние годы вроде как недобор.
В СУЗах вообщем-то такая же ситуация как и в ВУЗ'ах бардак, да особо ни чему толковому не учат, всему надо самостоятельно учиться :)
Плата и пленочный фоторезист
в в домашних условиях
Опубликовано · Пожаловаться
Кстати, в ЧИПиДИПе имеются в наличии платы с нанесенным фоторезистом, это снимает большое кол-во гемороя с нанесением :) .Я правда пока балончиком пользуюсь...но надо как-нибудь и это попробывать...
http://www.chipdip.ru/product0/9000036029.aspx