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

Динамические структуры Book - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Bykva_Iob
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
27.10.2012, 00:25     Динамические структуры Book #1
Подскажите пожалуйста, как запихнуть в элемент (BOOK** k) структуры (KART) адрес созданной одиночной динамической переменной структуры (BOOK)?
Вот, что я имею:

C++
1
2
3
4
5
6
7
8
9
10
book.h:
struct BOOK {
    int pos;
    int prise;
};
struct KART {
    BOOK** k;
    int curent_pos;
    int capacity;
};
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
#include "book.h"
#include <cstdio>
#define   stop __asm nop    
void main()
{
    struct KART* b=new KART[3]
    b->capacity=3;
    b->curent_pos=0;
 
    for(int i=0;i<b->capacity;i++)
    {
        BOOK* book = new BOOK;
        b[i].k = &book; //<<-----тут записываю адрес.
        book->pos = i*10;
        book->prise=10+i;
        printf("%d. book->pos: %-5d book->prise: %-5d b[%d].k = %d\n", i,(*book).pos,(*book).prise, i, &book);
    }
    for(int i=0;i<b->capacity;i++)
    {
        printf("%d  %d\n",(*(*(b[i]).k)).pos, (*(*(b[i]).k)).prise);
    }
delete[] b;
b=nullptr;
}
Привел код который сделал. Что я не так делаю, почему у меня записывается постоянно один и тот же адрес?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
27.10.2012, 02:30     Динамические структуры Book #2
1. Это C++. В C нет new и delete, для выделения памяти пользоваться malloc либо calloc, для уничтожения free
2.
C++
1
2
BOOK* book = new BOOK;
        b[i].k = &book; //<<-----тут записываю адрес.
Тут на каждой итерации цикла выделяется память под структуру типа BOOK и ее адрес записывается в переменную book. Потом адрес переменной в которой хранится адрес структуры записывается в другую переменную. После завершения каждой итерации переменная book будет уничтожена (но не то на что она указывает) и создана новая переменная book, которая вполне может записаться на место предыдущей, что и происходит в вашем коде.
Не очень понятно зачем вам вообще нужен в структуре KART указатель на указатель, одного указателя вполне достаточно.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
27.10.2012, 04:46     Динамические структуры Book #3
ах как тяжело
воспрос...
Цитата Сообщение от doctor_lecter Посмотреть сообщение
2. Код C++12 BOOK* book = new BOOK; b[i].k = &book; //<<-----тут аписываю адрес. Тут на каждой итерации цикла выделяется память под структуру па OOK и ее адрес записывается в переменную book. Потом адрес переменной в которой ранится дрес структуры записывается в другую переменную. После завершения каждой итерации еременная book будет уничтожена (но не то на что она указывает) и создана новая переменная ook, которая вполне может записаться на место предыдущей, что и происходит в вашем коде. Не чень понятно зачем вам вообще нужен в структуре KART указатель на указатель, одного указателя вполне достаточно.


Цитата Сообщение от Bykva_Iob Посмотреть сообщение
Подскажите пожалуйста, как запихнуть в элемент (BOOK** k) структуры (KART) адрес созданной одиночной динамической переменной структуры (BOOK)?
дак тут без пары геры точек не разойтись... сформулируй, ибо все помрут в нирване.
Bykva_Iob
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
27.10.2012, 11:39  [ТС]     Динамические структуры Book #4
Цитата Сообщение от doctor_lecter Посмотреть сообщение
1. Это C++. В C нет new и delete, для выделения памяти пользоваться malloc либо calloc, для уничтожения free
блин, по ошибке не туда нажал, как перенести в тот раздел?

А зачем это надо, задание звучит так, создаете структуру "картотека" в которой будет содержаться информация по книжкам, (каждая книжка представляет собой еще отдельную структуру).
Суть задания сделать динамическую структуру, в которую можно будут добавлять, удалять книжки, сортировать книги по любому поля, переставлять книги местами. Из-за того, что придется добавлять еще книжки в структуру (придется динамически увеличивать размер структуры) , а предыдущую информацию из структуры необходимо переписать в новую (расширенную) структуру и появился в структуре KART указатель на указатель (т.к. указатель на указатель содержит только адрес отдельного динамически созданного экземпляра (4 байта), а если мы будем перегонять каждый элемент прошлой структуры в новый элемент новой структуры, тут мы будем ворочить больший объем данных).
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
27.10.2012, 12:31     Динамические структуры Book #5
Цитата Сообщение от Bykva_Iob Посмотреть сообщение
Из-за того, что придется добавлять еще книжки в структуру (придется динамически увеличивать размер структуры) , а предыдущую информацию из структуры необходимо переписать в новую (расширенную) структуру и появился в структуре KART указатель на указатель (т.к. указатель на указатель содержит только адрес отдельного динамически созданного экземпляра (4 байта), а если мы будем перегонять каждый элемент прошлой структуры в новый элемент новой структуры, тут мы будем ворочить больший объем данных).
Ну а что изменится если будет указатель вместо указателя на указатель, размер то у них одинаковый?
Ну если все-таки вам хочется 2 указателя, то нужно 2 раза выделять память, и не забывать 2 раза возвращать.
C++
1
2
3
4
5
6
7
BOOK** ppBook = new BOOK*;
BOOK* pBOOK = new BOOK;
*ppBook = pBook;
b[i].k = ppBook;
// Потом удалить 2 раза
delete *b[i].k;
delete b[i].k;
И если вы используете C++, не проще ли создать класс картотека, в котором будет массив книг (или наиболее подходящий для вашей задачи контейнер) и методы для добавить книгу, удалить книгу, ну и другие которые нужны по заданию.
Bykva_Iob
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
27.10.2012, 17:54  [ТС]     Динамические структуры Book #6
Цитата Сообщение от doctor_lecter Посмотреть сообщение
И если вы используете C++, не проще ли создать класс картотека, в котором будет массив книг (или наиболее подходящий для вашей задачи контейнер) и методы для добавить книгу, удалить книгу, ну и другие которые нужны по заданию.
А другое ничего использовать нельзя, т.к. проходили тему структуры, а это задание было в рамках этой темы. Каюсь, что раньше это не написал.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
27.10.2012, 18:12     Динамические структуры Book #7
Можно и структурой обойтись:
C++
1
2
3
4
5
6
7
8
9
10
struct Book {
// Поля структуры книги такие как название, автор и т.д.
};
 
struct Kart {
// Поля которые описывают картотеку
Book* books; // Массив книг (или указателей на книгу Book** books)
unsigned int bookNum; // Число книг в картотеке
unsigned int max; // Максимальный размер массива
};
Bykva_Iob
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
27.10.2012, 19:10  [ТС]     Динамические структуры Book #8
Цитата Сообщение от doctor_lecter Посмотреть сообщение
Можно и структурой обойтись:
C++
1
2
3
4
5
6
7
8
9
10
struct Book {
// Поля структуры книги такие как название, автор и т.д.
};
 
struct Kart {
// Поля которые описывают картотеку
Book* books; // Массив книг (или указателей на книгу Book** books)
unsigned int bookNum; // Число книг в картотеке
unsigned int max; // Максимальный размер массива
};
А как это использовать, как занести в Book* books книгу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 19:19     Динамические структуры Book
Еще ссылки по теме:

C++ Информационные динамические структуры
C++ Динамические структуры данных

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
27.10.2012, 19:19     Динамические структуры Book #9
C++
1
2
3
4
5
6
Book book1;
Kart kart;
kart.max = 10;
kart.books = new Book[kart.max];
kart.bookNum = 1;
kart.books[0] = book1;
Yandex
Объявления
27.10.2012, 19:19     Динамические структуры Book
Ответ Создать тему
Опции темы

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