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

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

Добавлено: Ср ноя 17, 2010 20:38:40
avreal
«Кстати, о птичках»™
Раз уж зашёл разговор о редко используемых и малоизвестных возможностях.
И С, и С++ позволяют символьные литералы из нескольких символов. Одно требование — должно влазить в int.
Т.е. на платформе с 16-битным int позволяется запись 'AB', с 32-битным — 'ABCD'.
Размещение в памяти зависит от порядка следования байтов на заданной платформе. Самый правый символ сидит в младшем байте числа, а не по младшему байту памяти, например,

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

'AB' == ('A' << CHAR_BIT) | 'B';
На IBM PC программа

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

#include <stdio.h>
int a = 'ABCD';
int main()
{
        printf( "%4.4s\n", (char *)&a );
        return 0;
}
печатает Кстати, пример показывает, как правильно печатать строки известного размера без концевого 0 :-)
«точность» в спецификаторе формата вывода строки выполняет ту же роль, что и длина в strncpy()

Тут тоже есть тонкое различие между 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-ch literal (A), 2-ch literal (16706)
Если бы для 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
а куда уж подробнее?

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

struct menu 
{
char *Pos1;
char *Pos2;
};

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 :roll:

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
Спасибо за отклик

Решение проблема пока нашлось ввиде