Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Структуры

48K
04 сентября 2009 года
andrey32
19 / / 22.08.2009
В изучении структуры. Набросал программку по аналогии с кусками из учебника Павловской. И чего то при обращении к полям через указатель во время выполнения выдается ошибка, что указатель юзается без инициализации.
Код:
using namespace std;

int main()
{
    struct
    {  
        int one;
        int two;
    } *ps, var;

    var.one = 10;
    var.two = 20;

    ps->one =40;
    ps->two =50;   
   
    return 0;
}


var.one = работает. Объясните пожалуйста в чем проблема?
11
04 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
ps - указатель, на еще не созданный объект
 
Код:
ps = &var;
ps->one =40;
ps->two =50;
48K
04 сентября 2009 года
andrey32
19 / / 22.08.2009
То есть
 
Код:
struct{.......} *ps;
создает только переменную, которая может хранить адрес на объект, описываемый структурой и не создает сам объект?
Получается, указатель на структуру может указывать только на именованный объект?
602
04 сентября 2009 года
KPI Student
265 / / 16.12.2006
Цитата:
создает только переменную, которая может хранить адрес на объект, описываемый структурой и не создает сам объект?


Именно так. Указатель - это просто указатель. Как только вы его создали он указывает фиг знает на что. Для того, чтобы пользоваться им, вам нужно присвоить ему адрес нужной переменной.

Цитата:
Получается, указатель на структуру может указывать только на именованный объект?

Нет. Он может указывать на объект, созданный как статически, так и динамически.

 
Код:
MyStruct a, b[10];
MyStruct* pointer;

pointer = &a;   // указывает на а
pointer = &b[3]; // указывает на 3й элемент массива бэ
pointer = new MyStruct; // указывает на динамически созданный объект ( назовем номер 1), как видите, своего имени у объекта нет
pointer = new MyStruct; // создали еще один динамический объект и присвоили его адрес указателю. Теперь указатель указывает на динамический объект номер два. Объект номер один безвозвратно потерян
48K
05 сентября 2009 года
andrey32
19 / / 22.08.2009
Цитата: KPI Student

Нет. Он может указывать на объект, созданный как статически, так и динамически.


Спасибо, теперь понятно. Ну и , как я понял, создать динамический объект можно только в том случае, если у структуры есть имя?

87
05 сентября 2009 года
Kogrom
2.7K / / 02.02.2008
KPI Student, зачем учишь создавать утечки памяти? Где delete?
602
05 сентября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: Kogrom
KPI Student, зачем учишь создавать утечки памяти? Где delete?



Как где? delete в деструкторе std::auto_ptr =) Там дальше по коду

 
Код:
std::auto_ptr safePointer( pointer );
А если серьёзно, думаю автор динамической памяти пока не касался, вот и не хотел его сразу грузить.

З.Ы. Аж хочется нормально объяснить, когда человек сам думает... Побольше бы таких:)
602
05 сентября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: andrey32
Спасибо, теперь понятно. Ну и , как я понял, создать динамический объект можно только в том случае, если у структуры есть имя?



Да, new требует имя типа. Может, конечно, через мягкое место и можно сделать (не ручаюсь) void* f = new struct {int a; int b;}; Но за такой код могут посадить в дурку.

Кстати, раз коснулись динамической памяти: не забывайте о ее освобождении после использования. Обычно для этого используются операторы delete - для памяти, выделенной new, и delete[] для памяти, выделенной new[].

Кстати, если интересно, подумайте, что делать с таким кодом:

Код:
void f()
{
    MyStruct* p = new MyStruct;  // выделяем память

    g();  // функция г() то генерит, то не генерит исключение

    delete p; // освобождаем память. Если, конечно выполнение сюда дойдет. Если г() сгенерила исключение, то мы сюда не попадаем... И не освобождаем ничего.
}

int main()
{
    try
    {
        f();
    }
    catch (...)
    {
         // ля ля ля
    }
    return 0;
}
260
05 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата:

Кстати, если интересно, подумайте, что делать с таким кодом:



Не писать.:D

48K
05 сентября 2009 года
andrey32
19 / / 22.08.2009
Цитата:
автор динамической памяти пока не касался, вот и не хотел его сразу грузить.


Да нет, уже потрогал руками. Написал функцию вычисления корней уравнения N-й степени. N от единицы до любое. По алгоритму: если N-нечетное-находим действительный корень по Ньютону x1=x-F/F', делим на него , N=N-1; выделяем квадратичный множитель методом Хичкока, делим на него (на квадратичный член), находим корни квадратичного члена; N=N-2 и т.д. Действительные и комплексные корни. Функция получает массив коэффициентов и N. Корни возвращает в этот же массив. Ну и с массивами работал динамически. Кстати детали объявления указателя на многомерный массив у некоторых авторов или не описываются вообще, или как у Павловской довольно неудобным способом в цикле, как массив указателей. Так что только книжками не обойдешься, буду обращаться к вашему опыту.

602
07 сентября 2009 года
KPI Student
265 / / 16.12.2006
В плюсах нет динамических многомерным массивов. Есть массивы указателей, именно так в вашем учебнике и реализован многомерный массив. Со временем привыкните. Еще можно написать свой класс многомерного массива, синтаксиса a[1][2][3] уже, конечно не будет, но вполне можно сделать внутри пересчет адресов, чтобы представить большой одномерный буффер как многомерный массив.
11
07 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: KPI Student
В плюсах нет динамических многомерным массивов. Есть массивы указателей, именно так в вашем учебнике и реализован многомерный массив. Со временем привыкните. Еще можно написать свой класс многомерного массива, синтаксиса a[1][2][3] уже, конечно не будет, но вполне можно сделать внутри пересчет адресов, чтобы представить большой одномерный буффер как многомерный массив.


а как же std::vector<std::vector<std::vector<... > > > ?
чем не многомерный динамический массив?

602
07 сентября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: oxotnik333
а как же std::vector<std::vector<std::vector<... > > > ?
чем не многомерный динамический массив?



Я считаю, что по сути это массив векторов, так же, как и массив обычных указателей. Хотя не будем придираться к буквам, хз как назвать, работать можно и удобно.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог