Форум программистов, компьютерный форум CyberForum.ru

Массив структур, непонимание деталей - C++

Восстановить пароль Регистрация
 
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 12:16     Массив структур, непонимание деталей #1
Всем добрый день.
Есть несколько маленьких вопросов по массивам структур. И извините за странные названия переменных.

я создаю структуру такого типа
C++
1
2
3
4
5
6
7
class Lancuch
{
public:
    char cos;
    Lancuch * nastepny;
};
Lancuch * poczatek = NULL;

в main создаю свой массив структур и пытаюсь создать массив в котором буду хранить начало каждого списка
C++
1
2
Lancuch * elem= new Lancuch[n]; // массив структур
    Lancuch * poczatek= new Lancuch[n] = NULL; //сюда хочу записывать начало каждого элемента из массива
И тут сразу же первый вопрос
C++
1
Lancuch * poczatek= new Lancuch[n] = NULL;
Нормально ли так "нуллить" каждый элемент массива?


Дальше пытаюсь добавлять данные к выбранному элементу массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        int numer;
    char p;
    cin >> numer;
    cin >> p;
    if (poczatek==NULL)
    {
        (elem+numer)->cos=p;
        poczatek=(elem+numer); // для того чтобы все работало по задумке,
        elem->nastepny=NULL;   //тут должно быть (poczatek+numer)=(elem+numer);
    }                                        //но именно так не работает и выкидывает ошибку
    else
    {
        (elem+numer)->nastepny = new Lancuch;
        elem= (elem+numer)->nastepny;   // так же как и тут, мне кажется что для того чтобы работало нужно
        (elem+numer)->cos=p;                // написать (elem+numer)= (elem+numer)->nastepny;
        (elem+numer)->nastepny=NULL;
 
    }
В двух местах которые я прокомментировал выдает ошибку, я просто не могу понять из-за чего. Подскажите что нужно исправить и из-за чего не работает?

и последний вопрос. Может лучше тогда просто в структуру добавить
C++
1
Lancuch * poczatek;
просто чтобы каждый элемент тогда сохранял в себе указатель на первый?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
23.12.2012, 12:58     Массив структур, непонимание деталей #2
Вы присваиваете NULL не элементам структуры, а тому указателю, который вернула вам операция new. При этом память выделенную под массив вы сразу же потеряли.
Дальше непонятно, какой тип у elem. Если это указатель на структуру, то прибавление к нему целого числа сдвинет указатель не на целое число структур, а на целое число байтов. Так что скорее всего после этой операции указатель будет указывать не на начало очередной структуры, а в ее середину.
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 13:23  [ТС]     Массив структур, непонимание деталей #3
спасибо за ответы, а как тогда выбирать в какаю именно структур из массива я буду записывать?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
23.12.2012, 13:54     Массив структур, непонимание деталей #4
Извините, был неправ. Сдвиг действительно происходит не по байтам, а по элементам массива. Если же отвечать на ваш вопрос, то лучше использовать синтаксис массива. Инициализировать каждую структуру можно прописав в нее конструктор по умолчанию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
class Lancuch
{
public:
    char cos;
    Lancuch * nastepny;
    Lancuch() {this->cos='w'; this->nastepny=NULL;}
};
Lancuch * poczatek = NULL;
int main(void)
{
    poczatek = new Lancuch[10];
    int i=5;
    poczatek[i].cos='t';
    char c=(poczatek+i)->cos;
    cout << c << endl; // t
    delete poczatek;
    return 0;
}
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
23.12.2012, 14:20  [ТС]     Массив структур, непонимание деталей #5
Но мне все еще не понятно , как сохранить начало каждой из структур записанных в массиве.
Я пытаюсь сделать такой же массив для сохранения в нем начал, но он вообще не принимает данные значения.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
23.12.2012, 14:54     Массив структур, непонимание деталей #6
Указатель на структуру указывает на ее начало. То есть нам надо завести массив указателей и присвоить им указатели. Примерно так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
class Lancuch
{
public:
    char cos;
    Lancuch * nastepny;
    Lancuch() {this->cos='w'; this->nastepny=NULL;}
};
Lancuch * poczatek = NULL;
Lancuch ** begin_poczatek;
int main(void)
{
    int n=10;
    int i;
    poczatek = new Lancuch[n];
    begin_poczatek= new Lancuch* [n];
    for (i=0; i<n; i++) begin_poczatek[i] = &poczatek[i];
    i=5;
    poczatek[i].cos='t';
    char c=begin_poczatek[i]->cos;
    cout << c << endl; // t
    delete begin_poczatek;
    delete poczatek;
    return 0;
}
Yandex
Объявления
23.12.2012, 14:54     Массив структур, непонимание деталей
Ответ Создать тему
Опции темы

Текущее время: 17:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru