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

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

Добавлено: Пн апр 27, 2020 22:19:00
ARV
NStorm, не, разыменовывать и не надо! я не понял из ваших слов, где ожидать указателя на указатель на чар - VladislavS нарисовал пример, и я увидел, что это item должен быть указателем на указатель! а я думал, массив неверно описан.
VladislavS писал(а):Ух, забористо!
не понял - это хорошо или плохо? ;) ясен пень, с указателми из флеша не так-то просто... но зато в сишном виде красиво, и ОЗУ не тратится :)

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

Добавлено: Пн апр 27, 2020 22:26:24
NStorm
Ну правильно, вы передавали указатель на указатель. А теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3833363#p3833363"]Тут весь смак как раз во __flash
...
Ух, забористо! Это AVR.[/uquote]
Ну забористо конечно, но варнинг как я понимаю всё-таки из-за неверного типа по указателю был, о чем я говорил и что в моем примере (ссылка на godbolt ранее) я показал в обычном x86_64. Или я что-то не так понял?

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

Добавлено: Пн апр 27, 2020 22:29:09
ARV
NStorm писал(а):теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче
хм... логично.
то ли уже вообще тупею, то ли просто к вечеру :)

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

Добавлено: Пн апр 27, 2020 22:31:26
VladislavS
Это ни хорошо, ни плохо, это так еать. И вообще, там не варнинг должен быть, а смачный такой error. ARV, переходите уже на компилятор С++. Можно не пользоваться С++, но одно то что он не пропускает такие вольности с типами уже больше чем ++.

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

Добавлено: Пн апр 27, 2020 22:34:13
ARV
нет, не тупею! или не совсем :)

дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь

Добавлено after 1 minute 6 seconds:
VladislavS писал(а):переходите уже на компилятор С++
и не просите! я от его синтаксиса классов (не говоря про шаблоны) просто умираю. уж лучше руками на Си...

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

Добавлено: Пн апр 27, 2020 22:38:37
VladislavS
[uquote="ARV",url="/forum/viewtopic.php?p=3833390#p3833390"]и не просите! я от его синтаксиса классов (не говоря про шаблоны) просто умираю. уж лучше руками на Си...[/uquote]Вы читать умеете? Не пользуйтесь классами, если не нравится. Он обычный Си более строго компилирует. Уж подобный варнинг для него точно смачный еррор будет.

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

Добавлено: Пн апр 27, 2020 22:47:46
ARV
VladislavS писал(а):Вы читать умеете?
нет :))) а как вы догадались?
VladislavS писал(а):Уж подобный варнинг для него точно смачный еррор будет
и чем это мне помогло бы? вы могли заметить, что и на варнинг я отреагировал вполне адекватно, только не уразумел, в чем беда и где. чем бы мне еррор помог?

поиметь кучу неожиданных проблем при переходе - зачем?! мне и так хорошо. тем более что единственный реальный смысл применять С++ - это как раз классы и шаблоны. но раз от них меня тошнит - то других смыслов нет :)))

классами я в free pascal балуюсь. и шаблонами тоже немножко - хватает :)

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

Добавлено: Пн апр 27, 2020 23:07:48
NStorm
[uquote="ARV",url="/forum/viewtopic.php?p=3833390#p3833390"]дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь[/uquote]
Ну вроде только указатель попадет в раму, а сама строка во флэше остается. Вы ведь разыменовываете только первый указатель. Если я сам на ночь глядя тупить не начал.
В принципе объявив item как указатель на указатель во флэше, вопрос решен как я понимаю. Ну хотя теперь адрес указателя тоже из флэша загружается.

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

Добавлено: Пн апр 27, 2020 23:47:09
arkhnchul
[uquote="VladislavS",url="/forum/viewtopic.php?p=3833099#p3833099"]Библиотека оптимизируется под конкретную железку[/uquote]нэ савсэм.
библиотека оптимизируется под архитектуру, в лучшем случае - под семейство. Дальше уже дело конечного программиста сказать компилятору, чего там его конкретная железка не умеет или чего программист сам не хочет. У gcc, например, есть флаг mno-unaligned-access.

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

Добавлено: Вт апр 28, 2020 07:21:17
VladislavS
[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 был

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

const __flash char __flash *strs_pwr[] = {};
Убери одну __flash и код кардинально меняется.

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

Добавлено: Вт апр 28, 2020 07:40:58
ARV
VladislavS писал(а):Убери одну __flash и код кардинально меняется
хочется верить, что для ARM код будет вполне рабочим, если предварительно сделать
#define __flash /* */

интересно, каким предопределенным макросом можно отличить arm-gcc от avr-gcc?

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

Добавлено: Вт апр 28, 2020 07:50:47
VladislavS
[uquote="ARV",url="/forum/viewtopic.php?p=3833509#p3833509"]интересно, каким предопределенным макросом можно отличить arm-gcc от avr-gcc?[/uquote]Не только что это ARM и какое конкретно ядро, но ещё и тип и версию компилятора. RTFM.
Пример из моего стартапа

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

#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
Добавлено after 5 minutes 30 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3833509#p3833509"]#define __flash /* */[/uquote]Какой ужас!

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

Добавлено: Вт апр 28, 2020 08:01:05
ARV
VladislavS писал(а):Какой ужас!
поясните, а то ваш эмоциональный возглас несколько напрягает.
правильнее было бы все это переопределить как-то так:

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

#if defined(__AVR__)
#define flash __flash
#elif defined(__ARM__)
#define flash
#else
#error ???
#endif
а затем везде по коду применять вместо __flash уже просто flash
я просто поленился писать сразу :)

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

Добавлено: Пт май 01, 2020 18:08:33
Serzh2000
помогите, как правильно написать, ни как не соображу. :facepalm:

так не работает
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=показывать часы;}

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

Добавлено: Пт май 01, 2020 18:40:43
VladislavS
Применяйте более наглядное форматирование кода, тогда и логика работы программы будет лучше прослеживаться.
Спойлер

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

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: Вопросы по С/С++ (СИ)

Добавлено: Пт май 01, 2020 18:48:52
NStorm
Serzh2000, потому что else if надо, иначе условие "else disp=показывать часы;" будет срабатывать всегда, когда не срабатывает "if(hour==21&&minute==55){бегущая строка;} // пора спать" только, наплевав на остальные.

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

Добавлено: Пт май 01, 2020 19:04:44
Serzh2000
Применяйте более наглядное форматирование кода
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: Вопросы по С/С++ (СИ)

Добавлено: Пт май 01, 2020 19:08:38
NStorm
я кавычки не правильно ставлю {} , как правильно?
Вам же написали как надо - else if, чтобы "если ни одно условие не верно".

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

if(условие А){
  if(условие Б){...;}
  else if(условие В){...;}
  else if(условие Г){...;}
  else условие Д;
}
PS: Используйте отступы, а на форуме код свой заключайте в тег code, иначен форматирование съезжает.

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

Добавлено: Пт май 01, 2020 19:14:22
Serzh2000
:))) :beer: :beer: спасибо ! все получилось :beer: :beer:


спасибо

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

Добавлено: Вс май 03, 2020 01:50:09
Shuspano
Написал вот такую убогую програмку:

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

#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);
		}
	}
И пытаюсь ее скомпилять с помощью 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 страниц по английски.