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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение 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, нельзя было бы напрямую напечатать литерал.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

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

Сообщение 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 этот интересный момент как то не расписан.
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение 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);
но ничего не выводится...
Вложения
s65_8MHz.c
(1.08 КБ) 638 скачиваний
радиоэлектроника - жизнь моя...
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

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

struct menu
{
char Pos1[];
char Pos2[];
};
struct menu MENU_1= {"LED1", "LED2"};

put_string(10,30,MENU_1.Pos1, red);
радиоэлектроника - жизнь моя...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

а можно подробней. при объявлении полей как указатели char* CVAVR матюкается. наверно я чт то не так понял. и если я задам размер полей char от этого ничего вроде не изменится.... вроде
радиоэлектроника - жизнь моя...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

а куда уж подробнее?

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

struct menu 
{
char *Pos1;
char *Pos2;
};
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

ARV, спасибо большое.
радиоэлектроника - жизнь моя...
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Всем привет! Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))
MSC-51 C8051F410.
3х3
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение 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
Последний раз редактировалось romazan Вт дек 07, 2010 20:29:22, всего редактировалось 3 раза.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

А вы сами-то свой код понимаете? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение romazan »

короче разобрался что было с вылетом из функции, решилось переустановкой AvrStudio, но вот с SPI проблема, как только происходит установка бита, в следующий же цикл он вылетает.
Попробовал в настройках симулятора поставить вместо 64 меги - 8, и проблема ушла
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

Подскажите, отчего могут "портится" массивы. периодически меняется значение некоторых ячеек. Если объявить массив константой, то проблема уходит, и массивы не портятся.
я бы так и оставил, но один элемент этого массива должен изменятся в процессе работы. Да и понять охота, почему. Тем более и другие массивы сбивались, но их значение менять не нужно, и я их просто объявил как константы.
KIT
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Если меняться должен только один элемент, м.б. не делать его частью массива?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

Но разве это выход..... скорее заплатка какая то.
KIT
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Вы же код не привели... М.б. у вас какая-нить локальная переменная, не объявленная как static :roll:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

глобальная. не объявленная как static.
код могу предоставить, но боюсь в 7кб чужого кривого кода все равно никто ничего не поймет.
KIT
T0lik
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб авг 07, 2010 18:38:37
Откуда: Таганрог
Контактная информация:

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

Сообщение T0lik »

Господа помогите написать правильную маску
Есть такое выражение

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

Допустим
1.
0xEE&0xEE&0x0F=0x0E устраивает

но если
2.
0xED&0xEE&0x0F=0x0C

или в общем виде
B&A = С


Если c!=A то нужно чтобы результат был 0, если c=A то результат должен быть A
какую следует написать маску чтобы получить требуемый результат
IF или конструкцию типа a==c:c?0; не хочу использовать.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение 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, условного перехода не будет.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
T0lik
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб авг 07, 2010 18:38:37
Откуда: Таганрог
Контактная информация:

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

Сообщение T0lik »

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

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

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