Re: Вопросы по С/С++ (СИ)
Добавлено: Ср апр 30, 2014 09:58:12
под переменную выделяется минимум 1 Байт
а сколько выделяется памяти под указатель на оную переменную ?
а сколько выделяется памяти под указатель на оную переменную ?
размер указателя обычно совпадает с размером int для платформы. собственно, с адресным пространством памяти размер int и [должен быть]связан... но, естественно, полно исключений.FreshMan писал(а):для 8 битных AVR
Код: Выделить всё
unsigned char BrightnessOldDigits[6]={10,10,10,10,10,10};
unsigned char BrightnessNewDigits[6]={10,10,10,10,10,10};
Код: Выделить всё
uint8_t *p_brightness[12] = {&BrightnessOldDigits[2], // когда var=0
&BrightnessOldDigits[3], // когда var=1
&BrightnessOldDigits[4], // когда var=2
&BrightnessOldDigits[5], // когда var=3
&BrightnessNewDigits[0], // когда var=4
&BrightnessNewDigits[1], // когда var=5
&BrightnessNewDigits[2], // когда var=6
&BrightnessNewDigits[3], // когда var=7
&BrightnessNewDigits[4], // когда var=8
&BrightnessNewDigits[5], // когда var=9
&BrightnessOldDigits[0], // когда var=10
&BrightnessOldDigits[1]}; // когда var=11
на самом деле у вас МАССИВ УКАЗАТЕЛЕЙFreshMan писал(а):имеется два массива и указатель
Код: Выделить всё
uint8_t p_brightness[12]={BrightnessOldDigits[2], // êîãäà var=0
BrightnessOldDigits[3], // êîãäà var=1
BrightnessOldDigits[4], // êîãäà var=2
BrightnessOldDigits[5], // êîãäà var=3
BrightnessNewDigits[0], // êîãäà var=4
BrightnessNewDigits[1], // êîãäà var=5
BrightnessNewDigits[2], // êîãäà var=6
BrightnessNewDigits[3], // êîãäà var=7
BrightnessNewDigits[4], // êîãäà var=8
BrightnessNewDigits[5], // êîãäà var=9
BrightnessOldDigits[0], // êîãäà var=10
BrightnessOldDigits[1]}; // êîãäà var=11
Че эт безобразие-то?!! Вполне естественно.FreshMan писал(а):а допускается ли такое безобразие
Код: Выделить всё
*p_brightness=BrightnessOldDigits[2] // имя массива указатель на нуевой элемент
p_brightness[2]=BrightnessOldDigits[4] // Одинаково
*(p_brightness+2)=BrightnessOldDigits[4] //
uint8_t p_brightness[]={......} // можно число не указывать если инициализируете
Код: Выделить всё
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_VECTOR_PRE (void)
{
char buf = UCA0RXBUF; //сбрасываем прерывание
addItem(ch_exp,buf); //добавляем символ buf к массиву символов ch_exp
UARTWriteString(ch_exp);
//далее заводим таймер на 100мс
}Код: Выделить всё
void addItem(char *&c, char sim)
{
char *tt; //использую свой метод определения длины строки, это наверно почти бред:)
tt = c;
int ii = 0;
while (*tt)
{
ii++;
tt++;
}
char *t = new char[ii+1]; //но даже если задавать размерность вручную, то тоже виснет
for (int i=0; i<ii;i++)
t[i] = c[i];
t[ii] = sim;
delete[] c;
c = t;
}
Как ты приравниваешь указатель на адрес переменной к указателю на переменную?VLeshka писал(а):В чём проблема?Код: Выделить всё
void addItem(char *&c, char sim) { char *tt; // это бред tt = c;
Спасибо за указание на эту ошибку. Накидал код:GARMIN писал(а):Как ты приравниваешь указатель на адрес переменной к указателю на переменную?VLeshka писал(а):В чём проблема?Код: Выделить всё
void addItem(char *&c, char sim) { char *tt; // это бред tt = c;
Код: Выделить всё
void addItem(char &c, char sim) //тут была ошибка
{
char *tt;
tt = &c;
int ii = 0;
while (*tt)
{
ii++;
tt++;
}
char *t = new char[ii+1];
for (int i=0; i<ii;i++)
{
t[i] = c;
c++;
}
t[ii] = sim;
c = t[0];
}
Код: Выделить всё
addItem(ch_exp[0],'a');Опять двадцать пять:void addItem(char &c, char sim) //тут была ошибка
{}
и вызываем его:
addItem(ch_exp[0],'a');
спасибо.GARMIN писал(а): Опять двадцать пять:
ch_exp[0] передаётся по значению.
А ты объявляешь его адресом:
char &c
Код: Выделить всё
char *ch_exp="Mod";
int cnt=3;
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_VECTOR_PRE (void)
{
char buf = UCA0RXBUF; //сбрасываем прерывание
P1OUT ^= (BIT0 + BIT6); //вкл и выкл диоды
UARTWriteString(ch_exp); //выводит строку в uart; всегда нормально работает
UARTWriteString("Ура"); //всегда нормально работает
char *t = new char[cnt+1]; //здесь на второй раз зависает
for (int i=0; i<cnt;i++)
t[i] = ch_exp[i];
t[cnt] = 'a';
t[cnt+1] = '\0';
cnt++;
ch_exp = t;
UARTWriteString(ch_exp);
}
Код: Выделить всё
char *t = new char[cnt+1];Код: Выделить всё
//delete(t); //впрочем, вставлял - не помогаетКаким ерундовым софтом ты пользуешься, если он тебе компилирует этот код без ошибок?VLeshka писал(а): При первом проходе через этот код всё нормально. Но не могу понять, почему намертво зависает при втором проходе на строке:Указатель t - локальный и не требует такого удаленияКод: Выделить всё
char *t = new char[cnt+1];
Упёрся уже в тупой угол. В чём ошибаюсь???
спасибо за наводку.GARMIN писал(а): Каким ерундовым софтом ты пользуешься, если он тебе компилирует этот код без ошибок?
ок. Вопросы закончились.GARMIN писал(а): Ну разберись с указателями и массивами наконец. Почитай, чем отличается элемент массива от указателя на этот элемент.
Тебе дважды говорил разобраться. Опять те же грабли.
Жевать не буду. Читай учебник до просветления.
GARMIN писал(а): Каким ерундовым софтом ты пользуешься, если он тебе компилирует этот код без ошибок?
Код: Выделить всё
char *t = new char[cnt+1];Гм.. категоричное заявлениеЖевать не буду. Читай учебник до просветления.
Посмотрите чему равно cnt в момент выделения памяти. Вполне возможно что в этот момент переменная не инициализирована и содержит мусор, соответственно память выделиться не может. Поставьте также ловушку на исключение std::bad_alloc - скорее всего в него программа и влетает.спасибо за наводку.
Не знаю диалекта вашего С++, но обычно массив правильно удаляют такУказатель t - локальный и не требует такого удаления:Код: Выделить всё
//delete(t); //впрочем, вставлял - не помогает
Код: Выделить всё
delete[] t;Код: Выделить всё
template<typename Type,
typename Owner,
Type (Owner::*Getter)(),
void (Owner::*Setter)(Type)>
class Property
{
protected:
Owner * m_owner;
public:
operator Type () const
{
return (m_owner->*Getter)();
}
Type get() const
{
return (m_owner->*Getter)();
}
void operator =(Type data)
{
(m_owner->*Setter)(data);
}
Property() :
m_owner(0)
{}
Property(Owner * const owner) :
m_owner(owner)
{}
};Код: Выделить всё
class Rectangle
{
public:
int X;
int Y;
int Width;
int Height;
Rectangle() :
X(0),
Y(0),
Width(0),
Height(0)
{}
};
class Control
{
private:
Rectangle bounds;
int width;
void setBounds(Rectangle value) { bounds = value;}
Rectangle getBounds() { return bounds; }
void setWidth(int value) { width = value;}
int getWidth() { return width; }
public:
Control() :
Bounds(this),
Width(this)
{}
Property<Rectangle, Control, &Control::getBounds, &Control::setBounds> Bounds;
Property<int, Control, &Control::getWidth, &Control::setWidth> Width;
};
int main()
{
int x, width;
Control* c = new Control();
width = c->Width;
x = ((Rectangle)c->Bounds).X; //такой вариант работает
x = c->Bounds.get().X; //и такой
Rectangle bounds = c->Bounds; //и такой
x = bounds.X;
x = c->Bounds.X; //!!! а такой - нет
return 0;
}Код: Выделить всё
x = c->Bounds.X; Код: Выделить всё
x = ((Rectangle)c->Bounds).X;Код: Выделить всё
x = c->Bounds.get().X;