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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

это можно сделать только передавая в функцию еще один параметр, по которому будет определяться тип указателя.

Что-то типа такого ?

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

USART_SEND(void *c,unsigned char  type)
{
while ((UCSR1A & (1<<UDRE1))==0);
if(type==1){
    UDR1=(unsigned char)c;
}
else{
    UDR1=(eeprom unsigned char)c;
}
}


Там мне надо на самом деле массив передать просто для примера не охота было циклы городить.


А просто каст к (unsigned char*) не поможет?

Это первое что я сделал но был удивлён тем что он начинает брать данные из SRAM .
Либо я где-то накосячил. Завтра по пробую ещё по экспериментировать с этим.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

pokk писал(а):Это первое что я сделал но был удивлён тем что он начинает брать данные из SRAM .

На самом деле не особо удивительно :) У вас AVR?
На msp430 такая штука катит для констант записанных во флеш, но там общее адресное пространство, поэтому указатели уникальны.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Ага AVR. Ну теперь всё понятно значит указатели уникальны.
В общем сделал примерно как писал выше.
Благодарю всех за помощь.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

В AVR они как раз НЕ уникальны :)
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

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

Сообщение xVekx »

копал ядро линухи

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

int * temp;
temp = a + 1;
temp = &a[1];

temp = a + 1; = temp = &a[1]; ?
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Если ещё и int * a; ,то, как бы, да.
Или int a[];

Т.е. для определений
int * temp;
int a[];

получается, что a[N] это N-тый элемент типа int в массиве. А сам a это указатель на самый первый элемент массива. И так как это указатель, то... со всеми вытекающими (почитайте про арифметику с указателями).

Т.е. запись temp = a + 1; эквивалентна записи temp = &a[1]; при условии, что a и temp являются указателями на одинаковый тип (или переменными типа массива).

Как-то так.
Дополнения? Исправления? :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Если a - тоже указатель (на начало массива), то по сути
a = &a[0]
Но &a[1] будет равно a + 4, а не a + 1, (на тех архитектурах, где int четырёхбайтовый).
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

А если ещё и BIG индейцев добавить... то вообще всё навыворот станет... :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

WiseLord писал(а):Но &a[1] будет равно a + 4, а не a + 1, (на тех архитектурах, где int четырёхбайтовый).

не совсем так. указатель а нельзя рассматривать, как простое число, при выполнении сложения. поэтому во всех архитектурах а+4 всегда будет равно &a[4], причем не зависимо от того, какой именно размер у элемента массива. вообще эти записи эквивалентны.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Виноват, был неправ:

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

#include <stdio.h>

int main(void)
{
    int x;
    int *a;
    a = &x;
    printf("0x%08d\n", a);
    printf("0x%08d\n", &a[0]);
    printf("0x%08d\n", a + 1);
    printf("0x%08d\n", &a[1]);
    return 0;
}

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

0x1084621492
0x1084621492
0x1084621496
0x1084621496
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

ARV писал(а):во всех архитектурах а+4 всегда будет равно &a[4], причем не зависимо от того, какой именно размер у элемента массива.
Я правильно понял? Если есть uint16_t* a = 0; то после операции a += 1; (равно и a++;) в итоге a станет равно 2-м ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

shads писал(а): Если есть uint16_t* a = 0; то после операции a += 1; (равно и a++;) в итоге a станет равно 2-м ?

да, численное значение указателя при выполнении операций сложения/вычитания изменяется на величину, равную размеру типа. для uint16_t* a++ будет увеличивать на 2, для uint32_t* на 4 и т.д.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Вот блин...
А я думал что это касается только смещения в массивах... (например a=b[c+1])
И думал, что с указателями арифметика буквальная... т.е. сколько прибавил - на столько и увеличился..... теперь буду знать...

PS Хорошо что у меня наверное всегда массивы были однобайтные :)... поэтому проблем не замечал....
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

Имя массива и есть указатель.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

можно ли тело макроса разбивать на несколько строк ?
если да то как ?
#define Input_Decoder(x) {PORTB = (PORTB & 0xF6) | ((x)&1) | (((x)&2)<<2); PORTC = (PORTC & 0xFD) | (((x)&4)>>1); PORTD = (PORTD & 0xFD) | (((x)&8)>>2);}
Tell Me The Truth
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

FreshMan писал(а):можно ли тело макроса разбивать на несколько строк ?

Вроде бы обратный слэш:

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

 
#define Nenadoyvlekatsa\
             macrosami
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

FreshMan писал(а):можно ли тело макроса разбивать на несколько строк ?

В данном случае макроопределение не имеет особого смысла. Сделайте функцию.

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

void Input_Decoder(uint8_t x)
{
  PORTB = (PORTB & 0xF6) | (x&1) | ((x&2)<<2);
  PORTC = (PORTC & 0xFD) | ((x&4)>>1);
  PORTD = (PORTD & 0xFD) | ((x&8)>>2);
}
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

a_skr писал(а):В данном случае макроопределение не имеет особого смысла.

ПОЧЕМУ ?
Tell Me The Truth
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Есть у меня switch case состоящая из 10 case и таких конструкций несколько
метки делал через #define но уже и в них начинаю путаться
вспомнил что я встречал enum но до сих пор он мне был ненужен.

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

enum case2 {
EXIT,
START,
START_1,
START_2,
.....
};


Так вот если сделать все метки через него это будет эквивалентно define ?
Скорость работы программы не изменится?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

не изменится
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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