Сам долго вгонял.
Вопросы по С/С++ (СИ)
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
_BV(PD7) - это видимо такой макрос, который делает так: (1<<PD7)
Сам долго вгонял.
Сам долго вгонял.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Это его личные трудности. Я же Вам говорю о языке С как таковом.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));
}Как видим, sizeof(*array) для обеих массивов дал 12. Что в точности соответствует 3*sizeof(float) и не имеет ничего общего с размерностью массивов (с первым случайно совпало, о чём я уже сказал).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)/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: Вопросы по С/С++ (СИ)
Пример 2, заодно на «подумать о порядке выполнения и приоритетах операций»
Ну и???? © DX168B
Пошёл я спать... А вы себе объясняйте, как оно работает (как, как -- в полном соответствии со стандартом!) и почему во втором примере перед [array] вынесено i а не j
Код: Выделить всё
#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: Вопросы по С/С++ (СИ)
Вы прям так говорите, что мне стало жутко стыдно. 
Тут что, переменная i вот так вот просту выступает в роли указателя?
Не надо срочно достать соответствующие книжки...
Тут что, переменная i вот так вот просту выступает в роли указателя?
Не надо срочно достать соответствующие книжки...
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Да я сам запутался. Видимо я что-то недопонял, когда книжки читал.
Откомпилировал это и получил 12х4, когда ожидалось 16х3
Ещё раз почитаю про массивы. признаю, мой затуп.
Откомпилировал это и получил 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;
}
Ещё раз почитаю про массивы. признаю, мой затуп.
I am DX168B and this is my favourite forum on internet!
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Нет!!!IfoR писал(а):Тут что, переменная i вот так вот просту выступает в роли указателя?
Облегчу рытье по стандарту.
Согласно стандарту С запись
Код: Выделить всё
name1 [ name2 ]Код: Выделить всё
* ( name1 + name2 )Код: Выделить всё
name1 [ name2 ]
name2 [ name1 ]Код: Выделить всё
* ( name1 + name2 )
* ( name2 + name1 )Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
IfoR писал(а):_BV(PD7) - это видимо такой макрос, который делает так: (1<<PD7)
Сам долго вгонял.
ладно,а что за макрос тогда должен быть при?
Код: Выделить всё
PORTD&=~_BV(PD5);
В поисках истины человек развивается.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Это тоже самое, что и:
Код: Выделить всё
PORTD&=~(1<<PD5);
I am DX168B and this is my favourite forum on internet!
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
avreal, да я это, уже всё, открыл стандарт, пытаюсь читать. Спасибо Вам!
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну тогда все нормально, можно таки идти спатьIfoR писал(а):открыл стандарт, пытаюсь читать
«Не знать -- не стыдно. Стыдно не хотеть узнать.»
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: Вопросы по С/С++ (СИ)
vitalik_1984 писал(а):PORTD&=~_BV(PD7);
У меня стоит 74HC595 что бы вывести результат нужно подать импульс на защелку
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: Вопросы по С/С++ (СИ)
IfoR
Компилятор ругается на
{ result = (result>>8)|(indikator[(unsigned char)(i%10)]<<32); i/=10; }
не хочет сдвигать на 32 бита, меняю 32 на 8 компилируется нормально, но не работает
Компилятор ругается на
{ result = (result>>8)|(indikator[(unsigned char)(i%10)]<<32); i/=10; }
не хочет сдвигать на 32 бита, меняю 32 на 8 компилируется нормально, но не работает
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
разумеется не хочет, т.к. по умолчанию все операнды в выражении приводятся к типу int, а его сдвиг на 32 бита даст в итоге 0, как не крути. вы вообще какой-такой тип данных собрались на 32 разряда двигать? даже long после сдвига на 32 разряда даст всегда 0.alexey6522 писал(а):не хочет сдвигать на 32 бита, меняю 32 на 8 компилируется нормально, но не работает
битва с дураками проиграна, победители торжествуют. слава победителям!
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
alexey6522, а если так попробовать:
Код: Выделить всё
{ result = (result>>8)|((long long int)indikator[(unsigned char)(i%10)]<<32); i/=10; }-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
на самом деле надо попробовать задуматься...IfoR писал(а):alexey6522, а если так попробовать...
битва с дураками проиграна, победители торжествуют. слава победителям!
- shurikss123
- Грызет канифоль
- Сообщения: 271
- Зарегистрирован: Пн окт 25, 2010 20:47:04
- Откуда: Казахстан, Астана
Re: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
Для чего эта библиотека sfr_defs.h?
Отойду от темы в сторону, с индикацией мне пока что все понятно, до тех пор пока не полезу в дальше )))
Есть функция она имеет тип const char необходимо ей передать переменную s, тип которой unsigned long int
Как теперь состыковать два типа данных
в переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое функции и работать дальше
Отойду от темы в сторону, с индикацией мне пока что все понятно, до тех пор пока не полезу в дальше )))
Есть функция она имеет тип 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: Вопросы по С/С++ (СИ)
Вот функция передачи текста в порт COM
Это работает! а вот как она вызывается USART_vSendByte("Hello World"); //Отправляем данные в порт
Но так как я работаю с int мне нужно как-то его передать в порт с помощью этой функции, возможно есть и другие способы, но я о них не знаю, по этому пытаюсь приделать к велосипеду мотор, что бы тот поехал....
Код: Выделить всё
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 - выясняется, что это не тип результата функции, а тип ее параметра - это опять же разные вещи.
из всего этого вывод: берем букварь Си и ... "учиться, учиться и еще раз учиться!"
битва с дураками проиграна, победители торжествуют. слава победителям!

