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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

Ну правильно, вы передавали указатель на указатель. А теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3833363#p3833363"]Тут весь смак как раз во __flash
...
Ух, забористо! Это AVR.[/uquote]
Ну забористо конечно, но варнинг как я понимаю всё-таки из-за неверного типа по указателю был, о чем я говорил и что в моем примере (ссылка на godbolt ранее) я показал в обычном x86_64. Или я что-то не так понял?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

NStorm писал(а):теперь item сделали таким. Я предложил просто с другой стороны подойти - разыменовывать при передаче
хм... логично.
то ли уже вообще тупею, то ли просто к вечеру :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Это ни хорошо, ни плохо, это так еать. И вообще, там не варнинг должен быть, а смачный такой error. ARV, переходите уже на компилятор С++. Можно не пользоваться С++, но одно то что он не пропускает такие вольности с типами уже больше чем ++.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

нет, не тупею! или не совсем :)

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

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

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3833390#p3833390"]и не просите! я от его синтаксиса классов (не говоря про шаблоны) просто умираю. уж лучше руками на Си...[/uquote]Вы читать умеете? Не пользуйтесь классами, если не нравится. Он обычный Си более строго компилирует. Уж подобный варнинг для него точно смачный еррор будет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

классами я в free pascal балуюсь. и шаблонами тоже немножко - хватает :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

[uquote="ARV",url="/forum/viewtopic.php?p=3833390#p3833390"]дело в том, что разыменовывание дает не константное значение, которое не попадает на этапе компиляции во флешь[/uquote]
Ну вроде только указатель попадет в раму, а сама строка во флэше остается. Вы ведь разыменовываете только первый указатель. Если я сам на ночь глядя тупить не начал.
В принципе объявив item как указатель на указатель во флэше, вопрос решен как я понимаю. Ну хотя теперь адрес указателя тоже из флэша загружается.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3833099#p3833099"]Библиотека оптимизируется под конкретную железку[/uquote]нэ савсэм.
библиотека оптимизируется под архитектуру, в лучшем случае - под семейство. Дальше уже дело конечного программиста сказать компилятору, чего там его конкретная железка не умеет или чего программист сам не хочет. У gcc, например, есть флаг mno-unaligned-access.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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 и код кардинально меняется.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

интересно, каким предопределенным макросом можно отличить arm-gcc от avr-gcc?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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]Какой ужас!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

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

Сообщение 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=показывать часы;}
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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=показывать часы;
}
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

Serzh2000, потому что else if надо, иначе условие "else disp=показывать часы;" будет срабатывать всегда, когда не срабатывает "if(hour==21&&minute==55){бегущая строка;} // пора спать" только, наплевав на остальные.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

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

Сообщение 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;

у меня таких условий А несколько...
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

я кавычки не правильно ставлю {} , как правильно?
Вам же написали как надо - else if, чтобы "если ни одно условие не верно".

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

if(условие А){
  if(условие Б){...;}
  else if(условие В){...;}
  else if(условие Г){...;}
  else условие Д;
}
PS: Используйте отступы, а на форуме код свой заключайте в тег code, иначен форматирование съезжает.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

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

Сообщение Serzh2000 »

:))) :beer: :beer: спасибо ! все получилось :beer: :beer:


спасибо
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение 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 страниц по английски.
Ответить

Вернуться в «Разные вопросы по МК»