1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
1

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

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

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

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

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 .*
А если убрать звездочку при объевлении масива, то потом в ходе выполнения выдает, что доступ запрещен.

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

А как сделать тоже самое, только с динамическим масивом?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2009, 09:29
Ответы с готовыми решениями:

Удаление динамической памяти
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1...

Освобождение динамической памяти в vs
Вообщем попался я тут, и так, код: //#define _CRT_SECURE_NO_WARNINGS добавить в vs #include...

Переменная в динамической памяти
class SimpleCircle { public: SimpleCircle (); //Basic constructor SimpleCircle (int...

Освобождение динамической памяти
Добрый день, объясните, пожалуйста, как правильно удалять выделенную динамическую память? Вот...

7
Эксперт С++
2254 / 769 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
12.04.2009, 11:25 2
Ну,звездочку надо убирать. Тут fild[i][j] имеет тип vec*,если я не ошибаюсь.Доступ к приватным членам класса извне запрещен - поэтому про доступ и говорит.
0
1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
12.04.2009, 11:42  [ТС] 3
Это публичный член класса.

Ошибку выдает в конструкторе.
0
2814 / 1405 / 107
Регистрация: 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);
                }
        }
0
1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
12.04.2009, 11:57  [ТС] 5
vec **fild = new vec*[10];
А как это должно выглядеть в классе?

у меня класс (форма), я же не могу в конструкторе написать
Код
vec **fild = new vec*[10];
(или могу?)
0
2814 / 1405 / 107
Регистрация: 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 секунд
просто на двумерный массив нельзя делать одинарный указатель *..только двойной **
0
4860 / 3282 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.04.2009, 12:05 7
Код
fild[i][j].transparent=1;
Код
fild[i][j]->transparent=1;
0
2814 / 1405 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 12:19 8
Цитата Сообщение от accept Посмотреть сообщение
fild[i][j].transparent=1;
fild[i][j]->transparent=1;
нет, accept, в данном случае нет.. потому-что мы работаем с указателем как с массивом..поэтому использует операция '.' а не '->', если бы мы работали через адресную арифметику
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2009, 12:19
Помогаю со студенческими работами здесь

Массив в динамической памяти
какая разница между int *x=new int(10); и int *x=new int; ?

Очистка динамической памяти
Добрый день, у меня такой вопрос: Есть функция принимающая на вход три аргумента: указатель на...

Выделение динамической памяти
Доброго времени суток! я начинающий программист, столкнулась с такой проблемой: выделяю память...

Освобождение динамической памяти
Здравствуйте! Была задача реализовать сложение длинных чисел с помощью стеков. Сам стек...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru