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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

_BV(PD7) - это видимо такой макрос, который делает так: (1<<PD7)
Сам долго вгонял. :))
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

DX168B писал(а):Добавление ещё одного элемента вызывает нервный тик у компилятора.
Это его личные трудности. Я же Вам говорю о языке С как таковом.

DX168B писал(а):Ну и????
«Караул, устал!».

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

#include <stdio.h>

float arr1[12][3];

float arr2[7][3];

#define PR(a) printf( #a " = %ld\n", a)

int main()
{
        PR(sizeof(*arr1));
        PR(sizeof(arr1)/sizeof(*arr1));
        PR(sizeof(*arr2));
        PR(sizeof(arr2)/sizeof(*arr2));
}

real@REALPC:~/temp$ gcc -O2 -s -o siz siz.c && ./siz
sizeof(*arr1) = 12
sizeof(arr1)/sizeof(*arr1) = 12
sizeof(*arr2) = 12
sizeof(arr2)/sizeof(*arr2) = 7
Как видим, sizeof(*array) для обеих массивов дал 12. Что в точности соответствует 3*sizeof(float) и не имеет ничего общего с размерностью массивов (с первым случайно совпало, о чём я уже сказал).
А вот sizeof(array)/sizeof(*array) дал правильный ответ.

Что касается эквивалентности записей
**array
и
array[0][0]
(а не «рассматривания массива как набора указателей», нет там никакого набора) так эта... «почитайте книжки», лучше сразу стандарт. Про то, какие превращения испытывает имя массива в выражениях и про то, что именно в языке С означает запись name1[ name2 ]

Вот для затравки

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

#include <stdio.h>

int array[3] = { 10, 11, 12 };

#define PR(a) printf( #a " = %d\n", a )

int main()
{
        for( int i = 0; i < sizeof(array)/sizeof(*array); ++i) {
                PR( array [ i ] );
                PR( i [ array ] );
        }
}

real@REALPC:~/temp$ gcc -std=c99 -O2 -s -o ar ar.c && ./ar
array [ i ] = 10
i [ array ] = 10
array [ i ] = 11
i [ array ] = 11
array [ i ] = 12
i [ array ] = 12
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Пример 2, заодно на «подумать о порядке выполнения и приоритетах операций»

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

#include <stdio.h>

int array[2][3] = {
        { 11, 12, 13 },
        { 21, 22, 23 },
};

#define PR(a) printf( #a " = %d\n", a )

int main()
{
        for( int i = 0; i < sizeof(array)/sizeof(*array); ++i) {
                for (int j = 0; j < sizeof(*array)/sizeof(**array); ++j ) {
                        PR( array [i] [j] );
                        PR( i [array] [j] );
                }
        }
}
real@REALPC:~/temp$ gcc -std=c99 -O2 -s -o ar2 ar2.c && ./ar2
array [i] [j] = 11
i [array] [j] = 11
array [i] [j] = 12
i [array] [j] = 12
array [i] [j] = 13
i [array] [j] = 13
array [i] [j] = 21
i [array] [j] = 21
array [i] [j] = 22
i [array] [j] = 22
array [i] [j] = 23
i [array] [j] = 23


Ну и???? © DX168B

Пошёл я спать... А вы себе объясняйте, как оно работает (как, как -- в полном соответствии со стандартом!) и почему во втором примере перед [array] вынесено i а не j
Последний раз редактировалось avreal Вс авг 21, 2011 23:16:47, всего редактировалось 2 раза.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Вы прям так говорите, что мне стало жутко стыдно. :oops:
Тут что, переменная i вот так вот просту выступает в роли указателя?
Не надо срочно достать соответствующие книжки...
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Да я сам запутался. Видимо я что-то недопонял, когда книжки читал.
Откомпилировал это и получил 12х4, когда ожидалось 16х3

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

int main(void)
{
   float array[16][3] = {{0.0, 2.5, 0.0},
                     {0.5, 3.0, 0.0},

                     {1.5, 3.0, 0.0},
                     {2.0, 3.5, 0.0},

                     {2.5, 3.5, 0.0},
                     {3.0, 3.0, 0.0},

                     {3.0, 2.0, 0.0},
                     {2.5, 1.5, 0.0},

                     {2.5, 0.5, 0.0},
                     {2.0, 0.0, 0.0},

                     {0.5, 0.0, 0.0},
                     {0.0, 0.5, 0.0},

                     {2.5, 0.5, 0.0},
                     {2.0, 0.0, 0.0},

                     {2.5, 0.5, 0.0},
                     {2.0, 0.0, 0.0}};
   int a=0;
   a = sizeof(*array);
   printf("%d\n", a);
   a = sizeof(**array);
   printf("%d\n", a);
   return 0;
}


Ещё раз почитаю про массивы. признаю, мой затуп. :oops:
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

IfoR писал(а):Тут что, переменная i вот так вот просту выступает в роли указателя?
Нет!!!
Облегчу рытье по стандарту.
Согласно стандарту С запись

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

 name1 [ name2 ]
есть всего лишь сокращенно-удобной записью

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

* ( name1 + name2 )
В силу чего

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

name1 [ name2 ]
name2 [ name1 ]
«оба вместе» превращаются компилятором в

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

* ( name1 + name2 )
* ( name2 + name1 )
что эквивалентно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

IfoR писал(а):_BV(PD7) - это видимо такой макрос, который делает так: (1<<PD7)
Сам долго вгонял. :))

ладно,а что за макрос тогда должен быть при?

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

PORTD&=~_BV(PD5);

:dont_know:
В поисках истины человек развивается.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Это тоже самое, что и:

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

PORTD&=~(1<<PD5);
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

avreal, да я это, уже всё, открыл стандарт, пытаюсь читать. Спасибо Вам!
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

IfoR писал(а):открыл стандарт, пытаюсь читать
Ну тогда все нормально, можно таки идти спать :-)

«Не знать -- не стыдно. Стыдно не хотеть узнать.»
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

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

Сообщение alexey6522 »

vitalik_1984 писал(а):
PORTD&=~_BV(PD7);

У меня стоит 74HC595 что бы вывести результат нужно подать импульс на защелку
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

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

Сообщение alexey6522 »

IfoR
Компилятор ругается на
{ result = (result>>8)|(indikator[(unsigned char)(i%10)]<<32); i/=10; }
не хочет сдвигать на 32 бита, меняю 32 на 8 компилируется нормально, но не работает
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

alexey6522 писал(а):не хочет сдвигать на 32 бита, меняю 32 на 8 компилируется нормально, но не работает
разумеется не хочет, т.к. по умолчанию все операнды в выражении приводятся к типу int, а его сдвиг на 32 бита даст в итоге 0, как не крути. вы вообще какой-такой тип данных собрались на 32 разряда двигать? даже long после сдвига на 32 разряда даст всегда 0.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

alexey6522, а если так попробовать:

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

 { result = (result>>8)|((long long int)indikator[(unsigned char)(i%10)]<<32); i/=10; }
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

IfoR писал(а):alexey6522, а если так попробовать...
на самом деле надо попробовать задуматься...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

alexey6522 писал(а):
vitalik_1984 писал(а):
PORTD&=~_BV(PD7);

У меня стоит 74HC595 что бы вывести результат нужно подать импульс на защелку


sfr_defs.h и там

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

/** \def _BV
    \ingroup avr_sfr

    \code #include <avr/io.h>\endcode

    Converts a bit number into a byte value.

    \note The bit shift is performed by the compiler which then inserts the
    result into the code. Thus, there is no run-time overhead when using
    _BV(). */
   
#define _BV(bit) (1 << (bit))
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

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

Сообщение alexey6522 »

Для чего эта библиотека sfr_defs.h?
Отойду от темы в сторону, с индикацией мне пока что все понятно, до тех пор пока не полезу в дальше )))
Есть функция она имеет тип const char необходимо ей передать переменную s, тип которой unsigned long int
Как теперь состыковать два типа данных
в переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое функции и работать дальше
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

по-моему тип const char для результата функции - это абсурд. вы уверены, что не ошибаетесь? и с чего вы взяли, что const char - это "только текст в двойных кавычках"?
битва с дураками проиграна, победители торжествуют. слава победителям!
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

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

Сообщение alexey6522 »

Вот функция передачи текста в порт COM

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

void USART_vInit(void) {
// Set baud rate
UBRRH=0;
UBRRL=0x8; //скорость обмена 57600 бод
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);  //размер слова 8 разрядов
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
}

void USART_vSendByte(const char *u8Data) {
  while (*u8Data) {
    while((UCSRA&(1<<UDRE)) == 0); // Wait if a byte is being transmitted
    UDR = *u8Data;
    u8Data++; // Transmit data
 }
}

Это работает! а вот как она вызывается USART_vSendByte("Hello World"); //Отправляем данные в порт
Но так как я работаю с int мне нужно как-то его передать в порт с помощью этой функции, возможно есть и другие способы, но я о них не знаю, по этому пытаюсь приделать к велосипеду мотор, что бы тот поехал....
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

alexey6522 писал(а):Это работает! а вот как она вызывается USART_vSendByte("Hello World"); //Отправляем данные в порт
Но так как я работаю с int мне нужно как-то его передать в порт с помощью этой функции, возможно есть и другие способы, но я о них не знаю, по этому пытаюсь приделать к велосипеду мотор, что бы тот поехал....
мда... надеюсь, к велосипеду вы лепите мотор от КРАЗа? ну, чтоб ехал поскорее? может, для начала стоило бы хорошенько изучить матчасть? то есть Си? а то ведь можно сто лет строить допик на песке, а он все равно будет рушиться...

1. наименование функции USART_vSendByte намекает, что она передает ОДИН БАЙТ, однако ее параметр и реальное содержимое говорит, что она на самом деле передает СТРОКУ, что несколько разные вещи. нехорошо-с....
2. вы определитесь: вам надо выдать в USART число или его текстовое представление, т.е. число 123 или строку "123" - это разные вещи.
3. к вопросу о const char - выясняется, что это не тип результата функции, а тип ее параметра - это опять же разные вещи.

из всего этого вывод: берем букварь Си и ... "учиться, учиться и еще раз учиться!"
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

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