Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Ср ноя 17, 2010 20:38:40

«Кстати, о птичках»™
Раз уж зашёл разговор о редко используемых и малоизвестных возможностях.
И С, и С++ позволяют символьные литералы из нескольких символов. Одно требование — должно влазить в 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;
}
печатает
Код:
DCBA
Кстати, пример показывает, как правильно печатать строки известного размера без концевого 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

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

Всем МЯУ ! хлопцы (может и девушки тоже) помогите разобраться. пишу меню с помощью структур. кот простой. откомпилился в 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);
но ничего не выводится...
Вложения
s65_8MHz.c
(1.08 KiB) Скачиваний: 574

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

Чт ноя 18, 2010 09:32:33

так тож не хочет:

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

вообще-то так строки в структуру помещать некорректно... Pos1 и Pos2 у вас получаются массивами неопределенной длины, на сколько я в курсе, такие массивы могут помещаться в структуры только единственный раз - в самом конце, т.е. "открытый" массив должен быть последним.
вам надо объявить ваши поля простыми указателями char* и работать с ними соответственно

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

Чт ноя 18, 2010 12:02:24

а можно подробней. при объявлении полей как указатели char* CVAVR матюкается. наверно я чт то не так понял. и если я задам размер полей char от этого ничего вроде не изменится.... вроде

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

Чт ноя 18, 2010 12:11:29

а куда уж подробнее?
Код:
struct menu
{
char *Pos1;
char *Pos2;
};

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

Чт ноя 18, 2010 12:14:32

ARV, спасибо большое.

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

Чт ноя 25, 2010 03:19:54

Всем привет! Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))
MSC-51 C8051F410.
3х3

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

Вт дек 07, 2010 20:05:57

Народ такой вопрос:
Создаю функцию:
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
Последний раз редактировалось romazan Вт дек 07, 2010 20:29:22, всего редактировалось 3 раз(а).

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

Вт дек 07, 2010 20:16:37

А вы сами-то свой код понимаете? :)

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

Вт дек 07, 2010 23:34:02

короче разобрался что было с вылетом из функции, решилось переустановкой AvrStudio, но вот с SPI проблема, как только происходит установка бита, в следующий же цикл он вылетает.
Попробовал в настройках симулятора поставить вместо 64 меги - 8, и проблема ушла

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

Пт дек 10, 2010 22:09:44

Подскажите, отчего могут "портится" массивы. периодически меняется значение некоторых ячеек. Если объявить массив константой, то проблема уходит, и массивы не портятся.
я бы так и оставил, но один элемент этого массива должен изменятся в процессе работы. Да и понять охота, почему. Тем более и другие массивы сбивались, но их значение менять не нужно, и я их просто объявил как константы.

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

Пт дек 10, 2010 22:41:42

Если меняться должен только один элемент, м.б. не делать его частью массива?

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

Пт дек 10, 2010 22:53:58

Но разве это выход..... скорее заплатка какая то.

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

Пт дек 10, 2010 23:03:57

Вы же код не привели... М.б. у вас какая-нить локальная переменная, не объявленная как static :roll:

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

Пт дек 10, 2010 23:20:58

глобальная. не объявленная как static.
код могу предоставить, но боюсь в 7кб чужого кривого кода все равно никто ничего не поймет.

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

Сб дек 11, 2010 00:47:55

Господа помогите написать правильную маску
Есть такое выражение
Код:
Допустим
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

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

Спасибо за отклик

Решение проблема пока нашлось ввиде
Код:
A^B
Ответить