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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Rise of Death
1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
#1

Вопрос по динамической памяти - C++

12.04.2009, 09:29. Просмотров 1568. Ответов 7
Метки нет (Все метки)

мне надо создать масив содержащий структуры.

У меня вот код какой:

Код
vec *fild[10][10];//vec это название структуры
конструктор

Код
for(i=0;i<20;i++)
        {
        for(j=0;j<20;j++)
                {
                fild[i][j]=new (vec);
                fild[i][j].transparent=1;
                fild[i][j].x=i;
                fild[i][j].y=j;
                fild[i][j].sov=sqrt((player1.x-fild[i][j].x)*(player1.x-fild[i][j].x)+(player1.y-fild[i][j].y)*(player1.y-fild[i][j].y));
                
                fild[i][j].ox=(fild[i][j].x)/(fild[i][j].sov);
                fild[i][j].oy=(fild[i][j].y)/(fild[i][j].sov);
                }
        }
Вобщем он у меня все время какие-нибудь ошибки выдает
[C++ Error] Unit1.cpp(31): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(32): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(33): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(34): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(34): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(34): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(34): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(34): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(35): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(36): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(36): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(36): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(37): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(37): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(37): E2294 Structure required on left side of . or .*
А если убрать звездочку при объевлении масива, то потом в ходе выполнения выдает, что доступ запрещен.

Что я не так делаю?

А как сделать тоже самое, только с динамическим масивом?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
2221 / 736 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
12.04.2009, 11:25     Вопрос по динамической памяти #2
Ну,звездочку надо убирать. Тут fild[i][j] имеет тип vec*,если я не ошибаюсь.Доступ к приватным членам класса извне запрещен - поэтому про доступ и говорит.
Rise of Death
1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
12.04.2009, 11:42  [ТС]     Вопрос по динамической памяти #3
Это публичный член класса.

Ошибку выдает в конструкторе.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 11:50     Вопрос по динамической памяти #4
пробуй вот так вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vec **fild = new vec*[10];
for (int i=0; i<10; i++) fild[i] = new vec[10];
 
for(i=0;i<20;i++)
        {
        for(j=0;j<20;j++)
                {
                fild[i][j].transparent=1;
                fild[i][j].x=i;
                fild[i][j].y=j;
                fild[i][j].sov=sqrt((player1.x-fild[i][j].x)*(player1.x-fild[i][j].x)+(player1.y-fild[i][j].y)*(player1.y-fild[i][j].y));
                
                fild[i][j].ox=(fild[i][j].x)/(fild[i][j].sov);
                fild[i][j].oy=(fild[i][j].y)/(fild[i][j].sov);
                }
        }
Rise of Death
1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
12.04.2009, 11:57  [ТС]     Вопрос по динамической памяти #5
vec **fild = new vec*[10];
А как это должно выглядеть в классе?

у меня класс (форма), я же не могу в конструкторе написать
Код
vec **fild = new vec*[10];
(или могу?)
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 12:03     Вопрос по динамической памяти #6
C++
1
2
vec **fild = new vec*[10];
for (int i=0; i<10; i++) fild[i] = new vec[10];
это создание двумерного массива (матрицы) размером 10 на 10, каждый элемент которой есть класс fild. если у тебя суть была чтоб динамически создать, тогда так.... это почи равносилььно
C++
1
vec fild[10][10];
я просто не знаю что ты собирался делать,..

Добавлено через 38 секунд
просто на двумерный массив нельзя делать одинарный указатель *..только двойной **
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.04.2009, 12:05     Вопрос по динамической памяти #7
Код
fild[i][j].transparent=1;
Код
fild[i][j]->transparent=1;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2009, 12:19     Вопрос по динамической памяти
Еще ссылки по теме:

Теория по динамической памяти C++
C++ Удаление динамической памяти
Выделение динамической памяти C++
Удаление new из динамической памяти C++
C++ Освобождение динамической памяти в vs

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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 12:19     Вопрос по динамической памяти #8
Цитата Сообщение от accept Посмотреть сообщение
fild[i][j].transparent=1;
fild[i][j]->transparent=1;
нет, accept, в данном случае нет.. потому-что мы работаем с указателем как с массивом..поэтому использует операция '.' а не '->', если бы мы работали через адресную арифметику
Yandex
Объявления
12.04.2009, 12:19     Вопрос по динамической памяти
Ответ Создать тему
Опции темы

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