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

Массив: заполнить пространство определенным количеством атомов - C++

Войти
Регистрация
Восстановить пароль
 
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
16.03.2013, 17:18     Массив: заполнить пространство определенным количеством атомов #1
Доброго времени суток!
Я делаю проект для учебы. Передо мной стоит задача заполнить пространство определенным количеством атомов. Для этого я использовал трехмерный массив Atom [10][10][10]. Этим массивом я обозначаю 1000 атомов. Кроме того, каждый элемент массива должен хранить сведения о пространственных координатах. Для этого я создаю класс Atom с переменными x, y, z и создаю на его базе новый тип данных AtomType. Теперь все мои координаты могут быть получены следующим выражением: Atom [i][j][k].x (или Atom [i][j][k].у, Atom [i][j][k].z). Теперь, чтобы задать координаты, соответствующие положениям атомов я использую 3 вложенных цикла for.
Привожу для наглядности код:
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
27
28
29
30
#include <iostream>
 
class Atom
{
  public:
    float x, y, z; // Coordinates of the atoms
};
 
typedef class Atom AtomType;
 
    AtomType Atom1 [10][10][10]; // Create a 3 dimensional array to fill the space with atoms of type 1
 
    int i, j, k; // Variables for array Atom [i][j][k]
 
int main ()
{
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            for (k=0; k<10; k++)
            {
                Atom1 [i][j][k].x=i-4; // We get '-4' because we want our origin to be in the centre of array
                Atom1 [i][j][k].y=j-4;
                Atom1 [i][j][k].z=k-4;
            }
        }
    }
return 0;
}
Вопрос: как мне получить этот же результат, используя указатели?

Заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2013, 17:18     Массив: заполнить пространство определенным количеством атомов
Посмотрите здесь:

Дан массив A[N]. заполнить массив В[N] элементами массива A[N], которые удовлетворяют двойному неравенству C++
Задан массив с количеством элементов n C++
C++ Динамический массив с большим количеством элементов
Массив с неизвестным заранее количеством элементов C++
C++ Написать программу, которая выводит матрицу смежности графа с определенным количеством вершин и ребер
Вычислить разность между количеством отрицательных и количеством положительных элементов одномерного массива C++
Массив в функции с переменным количеством параметров C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50
16.03.2013, 17:35     Массив: заполнить пространство определенным количеством атомов #2
Оператор a[i] эквивалентен *(a + i).
А Вам нужно трижды разыменовать:
C++
1
2
3
*(*(*(Atom1 + i) + j) + k).x = i - 4;
*(*(*(Atom1 + i) + j) + k).y = j - 4;
*(*(*(Atom1 + i) + j) + k).z = k - 4;
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
16.03.2013, 18:01  [ТС]     Массив: заполнить пространство определенным количеством атомов #3
Цитата Сообщение от shau-kote Посмотреть сообщение
Оператор a[i] эквивалентен *(a + i).
А Вам нужно трижды разыменовать:
C++
1
2
3
*(*(*(Atom1 + i) + j) + k).x = i - 4;
*(*(*(Atom1 + i) + j) + k).y = j - 4;
*(*(*(Atom1 + i) + j) + k).z = k - 4;
Спасибо за ответ. Скажите пожалуйста, а почему мы суммируем "а" и "i"? Мне казалось, что у "а" нет значения.
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
16.03.2013, 18:19     Массив: заполнить пространство определенным количеством атомов #4
Цитата Сообщение от Skrypnyk Посмотреть сообщение
Скажите пожалуйста, а почему мы суммируем "а" и "i"?
Это адресная арифметика. Пусть объявлено Atom a[10]. Операция (a+i) прибавляет i*sizeof(Atom) байт к адресу, записанному в a (это адрес первого элемента массива).
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50
16.03.2013, 19:02     Массив: заполнить пространство определенным количеством атомов #5
Skrypnyk, почитайте немного про адресную арифметику в C\C++.
Там всё несколько своеобразно.

Попробую изложить кратко.
В C определена операция сложения над указателями. Если мы к указатели прибавим, допустим единицу, то указатель увеличится на количество байт, которое занимает единица того, типа, на который указывает указатель.
То есть
C++
1
2
3
int a, *p;
p = &a; // p указывает на a
++p; // p сместился на 4 байта
Формально мы можем записать в эту новую ячейку памяти число, но лучше так не делать, поскольку мы не выделяли там память, и компилятор может использовать эту память как-то по своему.

Но когда объявляете массив
C++
1
int a[100]
то компилятор делает следующее:
1) создаёт переменную-указатель типа int*;
2) выделяет под неё 400 байт памяти;
3) устанавливает указатель a на начало этого куска памяти.

А когда вы обращаетесь к i-ому элементу массива - a[i] - компилятор фактически заменяет этот код на *(a + i) - сдвинуть указатель на i ячеек по 4 байта от начала области памяти, на которую указывает a и работать с этой ячейкой.

Таким образом, с C\C++ массивы - и не массивы вовсе, а указатели на области памяти. И всё.

Если всё же не понятно - почитайте ещё про адресную арифметику в С, на эту тему много написано.
Я бы посоветовал классиков - Кернигана и Ритчи.
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
16.03.2013, 20:46  [ТС]     Массив: заполнить пространство определенным количеством атомов #6
shau-kote, спасибо, кажется, понял. Но на всякий случай прочту.

Цитата Сообщение от shau-kote Посмотреть сообщение
Я бы посоветовал классиков - Кернигана и Ритчи.
Их "Язык программирования С" не рекомендуется для новичков. Я сейчас читаю Харви Дейтела "Как программировать на С++". Что скажете, сгодится для старта?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2013, 02:25     Массив: заполнить пространство определенным количеством атомов
Еще ссылки по теме:

C++ Как пользоваться cout.fill (Заполнить пространство звездочками)?
Массив с неизвестным количеством элементов C++
C++ Как заполнить двумерный массив определенным числом определенное количество раз?
C++ Создать массив с n-ым количеством измерений
Двумерный массив с рандомным количеством строк C++

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

Или воспользуйтесь поиском по форуму:
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50
20.03.2013, 02:25     Массив: заполнить пространство определенным количеством атомов #7
Skrypnyk, не рекомендуется?..
Удивлён, честно. Книга написана прекрасным языком, я сам читал её с большим удовольствием - как первую книгу по Си.

Добавлено через 9 минут
Другой вопрос, что надо понимать, что книга именно по С, а не по C++.
Тем не менее, её стоит прочитать даже если Вы собираетесь на C++. Дело в том, что C++, принеся в С много нового, немало оставил по-старому - та же адресная арифметика с массивами, которые не массивы, тот же оператор switch-case-break, совершенно неприличный для высокоуровневого языка.

Что касается книг именно по C++, то того же Дейтела многие хвалят, но я его не читал.
Могу порекомендовать Подбельского В.В., "Язык Си++", могу не рекомендовать читать Страуструпа, по крайней мере, пока Вы не освоитесь в языке достаточно хорошо.
Yandex
Объявления
20.03.2013, 02:25     Массив: заполнить пространство определенным количеством атомов
Ответ Создать тему
Опции темы

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