не понял - это хорошо или плохо?VladislavS писал(а):Ух, забористо!
Вопросы по С/С++ (СИ)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
NStorm, не, разыменовывать и не надо! я не понял из ваших слов, где ожидать указателя на указатель на чар - VladislavS нарисовал пример, и я увидел, что это item должен быть указателем на указатель! а я думал, массив неверно описан.
ясен пень, с указателми из флеша не так-то просто... но зато в сишном виде красиво, и ОЗУ не тратится 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Ну правильно, вы передавали указатель на указатель. А теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3833363#p3833363"]Тут весь смак как раз во __flash
...
Ух, забористо! Это AVR.[/uquote]
Ну забористо конечно, но варнинг как я понимаю всё-таки из-за неверного типа по указателю был, о чем я говорил и что в моем примере (ссылка на godbolt ранее) я показал в обычном x86_64. Или я что-то не так понял?
[uquote="VladislavS",url="/forum/viewtopic.php?p=3833363#p3833363"]Тут весь смак как раз во __flash
...
Ух, забористо! Это AVR.[/uquote]
Ну забористо конечно, но варнинг как я понимаю всё-таки из-за неверного типа по указателю был, о чем я говорил и что в моем примере (ссылка на godbolt ранее) я показал в обычном x86_64. Или я что-то не так понял?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
хм... логично.NStorm писал(а):теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче
то ли уже вообще тупею, то ли просто к вечеру
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Это ни хорошо, ни плохо, это так еать. И вообще, там не варнинг должен быть, а смачный такой error. ARV, переходите уже на компилятор С++. Можно не пользоваться С++, но одно то что он не пропускает такие вольности с типами уже больше чем ++.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
нет, не тупею! или не совсем 
дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь
Добавлено after 1 minute 6 seconds:
дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь
Добавлено after 1 minute 6 seconds:
и не просите! я от его синтаксиса классов (не говоря про шаблоны) просто умираю. уж лучше руками на Си...VladislavS писал(а):переходите уже на компилятор С++
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3833390#p3833390"]и не просите! я от его синтаксиса классов (не говоря про шаблоны) просто умираю. уж лучше руками на Си...[/uquote]Вы читать умеете? Не пользуйтесь классами, если не нравится. Он обычный Си более строго компилирует. Уж подобный варнинг для него точно смачный еррор будет.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
нетVladislavS писал(а):Вы читать умеете?
и чем это мне помогло бы? вы могли заметить, что и на варнинг я отреагировал вполне адекватно, только не уразумел, в чем беда и где. чем бы мне еррор помог?VladislavS писал(а):Уж подобный варнинг для него точно смачный еррор будет
поиметь кучу неожиданных проблем при переходе - зачем?! мне и так хорошо. тем более что единственный реальный смысл применять С++ - это как раз классы и шаблоны. но раз от них меня тошнит - то других смыслов нет
классами я в free pascal балуюсь. и шаблонами тоже немножко - хватает
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3833390#p3833390"]дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь[/uquote]
Ну вроде только указатель попадет в раму, а сама строка во флэше остается. Вы ведь разыменовываете только первый указатель. Если я сам на ночь глядя тупить не начал.
В принципе объявив item как указатель на указатель во флэше, вопрос решен как я понимаю. Ну хотя теперь адрес указателя тоже из флэша загружается.
Ну вроде только указатель попадет в раму, а сама строка во флэше остается. Вы ведь разыменовываете только первый указатель. Если я сам на ночь глядя тупить не начал.
В принципе объявив item как указатель на указатель во флэше, вопрос решен как я понимаю. Ну хотя теперь адрес указателя тоже из флэша загружается.
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3833099#p3833099"]Библиотека оптимизируется под конкретную железку[/uquote]нэ савсэм.
библиотека оптимизируется под архитектуру, в лучшем случае - под семейство. Дальше уже дело конечного программиста сказать компилятору, чего там его конкретная железка не умеет или чего программист сам не хочет. У gcc, например, есть флаг mno-unaligned-access.
библиотека оптимизируется под архитектуру, в лучшем случае - под семейство. Дальше уже дело конечного программиста сказать компилятору, чего там его конкретная железка не умеет или чего программист сам не хочет. У gcc, например, есть флаг mno-unaligned-access.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3833449#p3833449"]библиотека оптимизируется под архитектуру,[/uquote]Это я и имел в виду.
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3833449#p3833449"]в лучшем случае - под семейство.[/uquote]В случае ARM - под ядро. Как на уровне компилятора, так и на уровне исходного кода библиотек. При такой конкуренции среди компиляторов под ARM иметь неоптимизированные библиотеки непозволительная роскошь.
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3833449#p3833449"]У gcc, например, есть флаг mno-unaligned-access.[/uquote]Это не панацея. C/C++ так устроен, что можно заставить компилятор сделать невыровненный доступ. Это грубый косяк, но он всё ещё в библиотеках встречается. Ответственный разработчик встретив такое отправит багрепорт автору.
Это мы говорили про тулчейн. Он должен всё об архитектуре чипа знать. Вон, чуть выше код под AVR былУбери одну __flash и код кардинально меняется.
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3833449#p3833449"]в лучшем случае - под семейство.[/uquote]В случае ARM - под ядро. Как на уровне компилятора, так и на уровне исходного кода библиотек. При такой конкуренции среди компиляторов под ARM иметь неоптимизированные библиотеки непозволительная роскошь.
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3833449#p3833449"]У gcc, например, есть флаг mno-unaligned-access.[/uquote]Это не панацея. C/C++ так устроен, что можно заставить компилятор сделать невыровненный доступ. Это грубый косяк, но он всё ещё в библиотеках встречается. Ответственный разработчик встретив такое отправит багрепорт автору.
Это мы говорили про тулчейн. Он должен всё об архитектуре чипа знать. Вон, чуть выше код под AVR был
Код: Выделить всё
const __flash char __flash *strs_pwr[] = {};- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
хочется верить, что для ARM код будет вполне рабочим, если предварительно сделатьVladislavS писал(а):Убери одну __flash и код кардинально меняется
#define __flash /* */
интересно, каким предопределенным макросом можно отличить arm-gcc от avr-gcc?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3833509#p3833509"]интересно, каким предопределенным макросом можно отличить arm-gcc от avr-gcc?[/uquote]Не только что это ARM и какое конкретно ядро, но ещё и тип и версию компилятора. RTFM.
Пример из моего стартапа
Добавлено after 5 minutes 30 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3833509#p3833509"]#define __flash /* */[/uquote]Какой ужас!
Пример из моего стартапа
Код: Выделить всё
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION>=6100100)
#define __KEIL_CODE__
#elif defined(__GNUC__)
#define __GCC_CODE__
#elif defined(__ICCARM__)
#define __IAR_CODE__
#elif defined( __CC_ARM ) || defined(__MICROLIB)
#error "ARMCC v5 and MICROLIB not supported"
#else
#error "Can't detect compiler"
#endif[uquote="ARV",url="/forum/viewtopic.php?p=3833509#p3833509"]#define __flash /* */[/uquote]Какой ужас!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
поясните, а то ваш эмоциональный возглас несколько напрягает.VladislavS писал(а):Какой ужас!
правильнее было бы все это переопределить как-то так:
Код: Выделить всё
#if defined(__AVR__)
#define flash __flash
#elif defined(__ARM__)
#define flash
#else
#error ???
#endifя просто поленился писать сразу
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Вопросы по С/С++ (СИ)
помогите, как правильно написать, ни как не соображу.
так не работает
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=показывать часы;}
так не работает
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=показывать часы;}
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Применяйте более наглядное форматирование кода, тогда и логика работы программы будет лучше прослеживаться.
Так что-ли хотели?
Спойлер
Код: Выделить всё
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=показывать часы;
}Спойлер
Код: Выделить всё
if(mode==условие)
{
if(month==1 && day==1 && minute%10==9){бегущая строка;} // новый год
else if(month==1 && day==20&& minute%10==9){бегущая строка;} // день рож Сережи
else if(month==5 && day==1 && minute%10==9){бегущая строка;} // день рож у мамы
else if(month==5 && day==9 && minute%10==9){бегущая строка;} // день победы
else if(month==6 && day==26&& minute%10==9){бегущая строка;} // день рож Илюши
else if(month==8 && day==13&& minute%10==9){бегущая строка;} // день рож Вани
else if(hour==21&&minute==55){бегущая строка;} // пора спать
else disp=показывать часы;
}Re: Вопросы по С/С++ (СИ)
Serzh2000, потому что else if надо, иначе условие "else disp=показывать часы;" будет срабатывать всегда, когда не срабатывает "if(hour==21&&minute==55){бегущая строка;} // пора спать" только, наплевав на остальные.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Вопросы по С/С++ (СИ)
if(условие А){Применяйте более наглядное форматирование кода
if(условие Б){...;}
if(условие В){...;}
if(условие Г){...;}
else условие Д;
}
нужно что бы было : если условие А верно
проверяем условие Б ,условие В, условие Г ( если одно из них верно бежит строка)
если не одно не верно выполняем else условие Д;
я кавычки не правильно ставлю {} , как правильно?
Спойлер
prevDisp=disp; // сохраняем предыдущий дисплейSerial.print(month);Serial.print(day);Serial.print(minute%10);
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;} // пора спать
else disp=dispTab[second/3];
}
if(mode==1) disp=CLOCKBIG;
if(mode==2){if(hour==21&&minute==55){disp=dispTabMED[second/3];prevTrans=0;}
else disp=dispTab1[second/3];}
if(mode==3) disp=CLOCKMED1;
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;} // пора спать
else disp=dispTab2[second/3];
}
if(mode==5) disp=CLOCK1;
if(mode==6) disp=TEMP;
if(mode==7) disp=CLOCKBIGJMP;
у меня таких условий А несколько...
Re: Вопросы по С/С++ (СИ)
Вам же написали как надо - else if, чтобы "если ни одно условие не верно".я кавычки не правильно ставлю {} , как правильно?
Код: Выделить всё
if(условие А){
if(условие Б){...;}
else if(условие В){...;}
else if(условие Г){...;}
else условие Д;
}
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Вопросы по С/С++ (СИ)
спасибо
Re: Вопросы по С/С++ (СИ)
Написал вот такую убогую програмку:
И пытаюсь ее скомпилять с помощью AVR-GCC. А он такой мне говорит: мол, конфликт типов в подпрограмме sh_pulse().
хотя, она ничего не принимает, и ничего не возвращает. Но если заменить void на int, то становится все хорошо. На другие void почему-то не ругается
Почему компилятору не понравилась именно эта подпрограмма?
И еще вопрос: пытался делать это под линуксом (debian 10 x64), там AVR-GCC (установленный через APT) выдает типа:
avr-libs установлен. Файлы *.h физически присутствуют, проверил. Другие файлы (в. т ч с этим DDRB) компилирует. В интернете - пространные рассуждения на 20 страниц по английски.
Код: Выделить всё
#define F_CPU 1000000UL
#define sclock PB1
#define sdata PB2
#define ledpin PB0
#include <avr/io.h>
#include <util/delay.h>
void setup(void)
{
DDRB |= (1 << ledpin)|(1 << sclock)|(1 << sdata);
}
void hc164send(unsigned char sh_data)
{
int i;
for (i=0; i<8; i++)
{
if (sh_data & 0x80)
{
PORTB |= (1 << sdata);
}
else
{
PORTB &= ~(1 << sdata);
}
sh_data = sh_data<<1;
sh_pulse();
}
}
void hc164reset(void)
{
hc164send(0x00);
}
void sh_pulse(void)
{
PORTB |= (1 << sclock);
PORTB &= ~(1 << sclock);
}
void ledflash(void)
{
PORTB |= (1 << ledpin);
_delay_ms(5);
PORTB &= ~(1 << ledpin);
_delay_ms(5);
}
void main(void)
{
setup();
hc164reset();
unsigned char j = 0x00;
while(1)
{
hc164send(j);
ledflash();
j++;
_delay_ms(300);
}
}
Код: Выделить всё
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();
^
Почему компилятору не понравилась именно эта подпрограмма?
И еще вопрос: пытался делать это под линуксом (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