NStorm, не, разыменовывать и не надо! я не понял из ваших слов, где ожидать указателя на указатель на чар - VladislavS нарисовал пример, и я увидел, что это item должен быть указателем на указатель! а я думал, массив неверно описан.
VladislavS писал(а):
Ух, забористо!
не понял - это хорошо или плохо? ясен пень, с указателми из флеша не так-то просто... но зато в сишном виде красиво, и ОЗУ не тратится
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ну правильно, вы передавали указатель на указатель. А теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче.
Тут весь смак как раз во __flash ... Ух, забористо! Это AVR.
Ну забористо конечно, но варнинг как я понимаю всё-таки из-за неверного типа по указателю был, о чем я говорил и что в моем примере (ссылка на godbolt ранее) я показал в обычном x86_64. Или я что-то не так понял?
Это ни хорошо, ни плохо, это так еать. И вообще, там не варнинг должен быть, а смачный такой error. ARV, переходите уже на компилятор С++. Можно не пользоваться С++, но одно то что он не пропускает такие вольности с типами уже больше чем ++.
и не просите! я от его синтаксиса классов (не говоря про шаблоны) просто умираю. уж лучше руками на Си...
Вы читать умеете? Не пользуйтесь классами, если не нравится. Он обычный Си более строго компилирует. Уж подобный варнинг для него точно смачный еррор будет.
Уж подобный варнинг для него точно смачный еррор будет
и чем это мне помогло бы? вы могли заметить, что и на варнинг я отреагировал вполне адекватно, только не уразумел, в чем беда и где. чем бы мне еррор помог?
поиметь кучу неожиданных проблем при переходе - зачем?! мне и так хорошо. тем более что единственный реальный смысл применять С++ - это как раз классы и шаблоны. но раз от них меня тошнит - то других смыслов нет
классами я в free pascal балуюсь. и шаблонами тоже немножко - хватает
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь
Ну вроде только указатель попадет в раму, а сама строка во флэше остается. Вы ведь разыменовываете только первый указатель. Если я сам на ночь глядя тупить не начал. В принципе объявив item как указатель на указатель во флэше, вопрос решен как я понимаю. Ну хотя теперь адрес указателя тоже из флэша загружается.
нэ савсэм. библиотека оптимизируется под архитектуру, в лучшем случае - под семейство. Дальше уже дело конечного программиста сказать компилятору, чего там его конкретная железка не умеет или чего программист сам не хочет. У gcc, например, есть флаг mno-unaligned-access.
В случае ARM - под ядро. Как на уровне компилятора, так и на уровне исходного кода библиотек. При такой конкуренции среди компиляторов под ARM иметь неоптимизированные библиотеки непозволительная роскошь.
Это не панацея. C/C++ так устроен, что можно заставить компилятор сделать невыровненный доступ. Это грубый косяк, но он всё ещё в библиотеках встречается. Ответственный разработчик встретив такое отправит багрепорт автору.
Это мы говорили про тулчейн. Он должен всё об архитектуре чипа знать. Вон, чуть выше код под AVR был
помогите, как правильно написать, ни как не соображу.
так не работает if(mode==условие){ if(month==1 && day==1 && minute%10==9){бегущая строка;} // новый год if(month==1 && day==20&& minute%10==9){бегущая строка;} // день рож Сережи if(month==5 && day==1 && minute%10==9){бегущая строка;} // день рож у мамы if(month==5 && day==9 && minute%10==9){бегущая строка;} // день победы if(month==6 && day==26&& minute%10==9){бегущая строка;} // день рож Илюши if(month==8 && day==13&& minute%10==9){бегущая строка;} // день рож Вани if(hour==21&&minute==55){бегущая строка;} // пора спать
else disp=показывать часы; } так все работает if(mode==условие){ if (month==1 && day==1 && minute%10==9) {бегущая строка;} // новый год else disp=показывать часы;}
Serzh2000, потому что else if надо, иначе условие "else disp=показывать часы;" будет срабатывать всегда, когда не срабатывает "if(hour==21&&minute==55){бегущая строка;} // пора спать" только, наплевав на остальные.
нужно что бы было : если условие А верно проверяем условие Б ,условие В, условие Г ( если одно из них верно бежит строка) если не одно не верно выполняем else условие Д;
if(mode==0){ if(month==1 && day==1 && minute%10==9){disp=dispTabB[second/3];prevTrans=0;} // новый год if(month==1 && day==20&& minute%10==9){disp=dispTabB[second/3];prevTrans=0;} // день рождения у папы if(month==5 && day==1 && minute%10==1){disp=dispTabB[second/3];prevTrans=0;} // день рождения у мамы if(month==5 && day==9 && minute%10==9){disp=dispTabB[second/3];prevTrans=0;} // день победы if(month==6 && day==26&& minute%10==9){disp=dispTabB[second/3];prevTrans=0;} // день рождения Илюша if(month==8 && day==13&& minute%10==9){disp=dispTabB[second/3];prevTrans=0;} // день рождения Ваня if(hour==21&&minute==55) {disp=dispTabB[second/3];prevTrans=0;} // пора спать
if(mode==4){ if(month==1 && day==1 && minute%10==9){disp=dispTabANM[second/3];prevTrans=0;} // новый год if(month==1 && day==20&& minute%10==9){disp=dispTabANM[second/3];prevTrans=0;} // день рождения у папы if(month==5 && day==1 && minute%10==9 ){disp=dispTabANM[second/3];prevTrans=0;} // день рождения у мамы if(month==5 && day==9 && minute%10==9){disp=dispTabANM[second/3];prevTrans=0;} // день победы if(month==6 && day==26&& minute%10==9){disp=dispTabANM[second/3];prevTrans=0;} // день рождения Илюша if(month==8 && day==13&& minute%10==9){disp=dispTabANM[second/3];prevTrans=0;} // день рождения Ваня if(hour==21&&minute==55) {disp=dispTabANM[second/3];prevTrans=0;} // пора спать
И пытаюсь ее скомпилять с помощью AVR-GCC. А он такой мне говорит: мол, конфликт типов в подпрограмме sh_pulse().
Код:
D:\comp\avr8-gnu-toolchain\bin>avr-gcc -Os -mmcu=atmega48 -o d:\avr\hc164.elf d: \avr\hc164.c d:\avr\hc164.c:38:6: warning: conflicting types for 'sh_pulse' [enabled by defau lt] void sh_pulse(void) ^ d:\avr\hc164.c:30:3: note: previous implicit declaration of 'sh_pulse' was here sh_pulse(); ^
хотя, она ничего не принимает, и ничего не возвращает. Но если заменить void на int, то становится все хорошо. На другие void почему-то не ругается Почему компилятору не понравилась именно эта подпрограмма? И еще вопрос: пытался делать это под линуксом (debian 10 x64), там AVR-GCC (установленный через APT) выдает типа:
Код:
/mnt/ntfs_d/avr/hc164.c:13:2: error: 'DDRB' undeclared (first use in this function) DDRB |= (1 << ledpin)|(1 << sclock)|(1 << sdata); ^ /mnt/ntfs_d/avr/hc164.c:13:2: note: each undeclared identifier is reported only once for each function it appears in
avr-libs установлен. Файлы *.h физически присутствуют, проверил. Другие файлы (в. т ч с этим DDRB) компилирует. В интернете - пространные рассуждения на 20 страниц по английски.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения