Страница 4 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср ноя 17, 2010 20:38:40
avreal
«Кстати, о птичках»™
Раз уж зашёл разговор о редко используемых и малоизвестных возможностях.
И С, и С++ позволяют символьные литералы из нескольких символов. Одно требование — должно влазить в
int.
Т.е. на платформе с 16-битным int позволяется запись
'AB', с 32-битным —
'ABCD'.
Размещение в памяти зависит от порядка следования байтов на заданной платформе. Самый правый символ сидит в младшем байте
числа, а не по младшему байту памяти, например,
На IBM PC программа
Код: Выделить всё
#include <stdio.h>
int a = 'ABCD';
int main()
{
printf( "%4.4s\n", (char *)&a );
return 0;
}
печатает
Кстати, пример показывает, как правильно печатать строки известного размера без концевого 0

«точность» в спецификаторе формата вывода строки выполняет ту же роль, что и длина в str
ncpy()
Тут тоже есть тонкое различие между C и C++.
С: тип литералов 'A' и 'AB' — int
С++: тип литерала 'AB' — int, а вот 'A' - char.
Т.е. односимвольные литералы в C++ сменили тип с int на char, это сделано для возможности их ввода/вывода операторами
>> и
<<Код: Выделить всё
#include <iostream>
int main()
{
std::cout << "1-ch literal (" << 'A' << "), 2-ch literal (" << 'AB' << ")" << std::endl;
}
печатает
Если бы для 1-символьного сохранился тип int, нельзя было бы напрямую напечатать литерал.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 08:31:36
asteroid7
avreal писал(а):...
А что касается третьего массива — его обязан делать любой компилятор, претендующий на звание компилятора языка С.
По стандарту ANSI C89...
Ещё раз про себя убеждаюсь, век учись всё одно дураком останешься )
Подтверждаю, что "третий массив" в IAR (только С) работает.
Нашёл репродукцию второго издания от "ANSI standard for C". Параграфа приведённого вами там нет, но есть
Код: Выделить всё
If you do give a size, бла-бла-бла. Too many is an error, too few will just initialize the first elements of the array.
Т.е. элементы строки инициализации не влезающие в массив отбрасываются. Отбросить можно не только конец строки но и полстроки запросто )
Кстати, у K&R этот интересный момент как то не расписан.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 09:30:34
demonchik
Всем МЯУ ! хлопцы (может и девушки тоже) помогите разобраться. пишу меню с помощью структур. кот простой. откомпилился в CVAVR без проблем. все вроде хорошо. а на деле не работает... обидно... может поможете? код прикрепляю. но часть приведу:
struct menu
{
char Pos1[];
char Pos2[];
};
struct menu MENU_1= {"LED1", "LED2"};
struct menu *ptr=&MENU_1;
потом нада вывести на дисплей -
put_string(10,50, (*ptr).Pos1, red);
но ничего не выводится...
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 09:32:33
demonchik
так тож не хочет:
struct menu
{
char Pos1[];
char Pos2[];
};
struct menu MENU_1= {"LED1", "LED2"};
put_string(10,30,MENU_1.Pos1, red);
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 09:46:39
ARV
вообще-то так строки в структуру помещать некорректно... Pos1 и Pos2 у вас получаются массивами неопределенной длины, на сколько я в курсе, такие массивы могут помещаться в структуры только единственный раз - в самом конце, т.е. "открытый" массив должен быть последним.
вам надо объявить ваши поля простыми указателями char* и работать с ними соответственно
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 12:02:24
demonchik
а можно подробней. при объявлении полей как указатели char* CVAVR матюкается. наверно я чт то не так понял. и если я задам размер полей char от этого ничего вроде не изменится.... вроде
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 12:11:29
ARV
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 18, 2010 12:14:32
demonchik
ARV, спасибо большое.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 25, 2010 03:19:54
Chip115
Всем привет! Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))
MSC-51 C8051F410.
3х3
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт дек 07, 2010 20:05:57
romazan
Народ такой вопрос:
Создаю функцию:
static void send(byte dta,LcdCmdData cd)
{
if (cd == DATA)
{
PORTD|=_BV(RS);
}
else
{
PORTD&=~(_BV(RS));
}
PORTD&=~(_BV(CS));
SPDR = dta;
while ( (SPSR & 0x80) != 0x80 );
PORTD|=_BV(CS)|_BV(RS);
}
Суть в том, что функция отправляет данные в дисплей send(данные, 0-комманда или 1-данные)
В конце её выполнения контроллер уходит в астрал!!! - не возвращается из функции и улетает за пределы кода(как-будто нет инициализации стека)
И ещё проблема при инициализации SPI, устанавливаю флаг MSTR, но мотом он сбивается - становится равным 0
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт дек 07, 2010 20:16:37
Gudd-Head
А вы сами-то свой код понимаете?

Re: Вопросы по С/С++ (СИ)
Добавлено: Вт дек 07, 2010 23:34:02
romazan
короче разобрался что было с вылетом из функции, решилось переустановкой AvrStudio, но вот с SPI проблема, как только происходит установка бита, в следующий же цикл он вылетает.
Попробовал в настройках симулятора поставить вместо 64 меги - 8, и проблема ушла
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт дек 10, 2010 22:09:44
O-LED
Подскажите, отчего могут "портится" массивы. периодически меняется значение некоторых ячеек. Если объявить массив константой, то проблема уходит, и массивы не портятся.
я бы так и оставил, но один элемент этого массива должен изменятся в процессе работы. Да и понять охота, почему. Тем более и другие массивы сбивались, но их значение менять не нужно, и я их просто объявил как константы.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт дек 10, 2010 22:41:42
Gudd-Head
Если меняться должен только один элемент, м.б. не делать его частью массива?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт дек 10, 2010 22:53:58
O-LED
Но разве это выход..... скорее заплатка какая то.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт дек 10, 2010 23:03:57
Gudd-Head
Вы же код не привели... М.б. у вас какая-нить локальная переменная, не объявленная как static

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт дек 10, 2010 23:20:58
O-LED
глобальная. не объявленная как static.
код могу предоставить, но боюсь в 7кб чужого кривого кода все равно никто ничего не поймет.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 11, 2010 00:47:55
T0lik
Господа помогите написать правильную маску
Есть такое выражение
Код: Выделить всё
Допустим
1.
0xEE&0xEE&0x0F=0x0E устраивает
но если
2.
0xED&0xEE&0x0F=0x0C
или в общем виде
B&A = С
Если c!=A то нужно чтобы результат был 0, если c=A то результат должен быть A
какую следует написать маску чтобы получить требуемый результат
IF или конструкцию типа a==c:c?0; не хочу использовать.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 11, 2010 13:57:30
avreal
T0lik писал(а):IF или конструкцию типа a==c:c?0; не хочу использовать.
В любом случае нужно проверять биты совместно, так как если даже в каком-то
одном бите несовпадение, то занулить нужно
все биты. Одними инверсиями и маскированиями ~ & | ^ не отделаться.
А можно поинтересоваться, почему? Конструкция с IF будет компактнее и быстрее, так в чём причина отказа?
Код: Выделить всё
uint8_t foo(uint8_t c, uint8_t A)
{
if( c != A ) c = 0;
return c;
}
avr-gcc -Os -S
Код: Выделить всё
.global foo
foo:
cpse r24,r22 ; никаких условных переходов, всего две команды
ldi r24,lo8(0)
ret
arm-kgp-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -S
Код: Выделить всё
foo:
cmp r0, r1
ite eq
moveq r0, r1 ; тоже без условнх переходов, хотя эта команда и лишняя
movne r0, #0
bx lr
Даже для пентиума, у которого как бы страшны IF-ы (точнее, переходы) возможным разрушением конвейера, тут после CMP будет вкомпилрована команда CMOVNE, условного перехода не будет.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 11, 2010 16:54:58
T0lik
Спасибо за отклик
Решение проблема пока нашлось ввиде