Назначение массива массивов в C / C ++ - PullRequest
0 голосов
/ 13 декабря 2010

Привет, я не "родной" программист C / C ++.Я могу написать некоторые основные вещи и сделать кодирование, которое является общим для других языков.Но у меня есть эта проблема, и я даже не знаю, как спрашивать по-другому, чем объяснять ее (таким образом, поиск в Google мне не подходит).

У меня есть код

typedef float point3[3]; 

И теперь я инициализирую несколько точек в 3D (x, y, z) следующим образом:

point3 cpoint = {computeX(u,v),computeY(u,v)-5,computeZ(u,v)};

Какие функции и значения u и v не имеют отношения к моему вопросу (но яможет предоставить код, если будет предложено).

Теперь я хочу объявить массив (одномерный) из point3.Поэтому, когда я вызову array [0], я получу переменную типа point3.Как я могу это сделать?

РЕДАКТИРОВАТЬ:

Я предоставил недостаточно информации.Виноват.Мне нужно сохранить: typedef float point3 [3];потому что я использую OpenGL с GLUT и использую эту функцию glVertex3fv (cpoint);где cpoint - это тип point3.Так что я уверен, что не могу использовать struct.

Ответы [ 5 ]

2 голосов
/ 13 декабря 2010

Предполагая, что C ++, самый простой способ - создать класс для инкапсуляции вашей точечной структуры, а затем создать вектор этого типа:

struct Point
{
    Point(float x, float y, float z) : x_(x), y_(y), z_(z)
    float x_;
    float y_;
    float z_;
};

typedef std::vector<Point> Points;

Затем вы можете создать коллекцию для хранения очков:

Points points;

затем в коде, после заполнения вы можете получить доступ с помощью:

Point a = points[ 3 ]; // for example
2 голосов
/ 13 декабря 2010
point3 cpoint[2] = {
   {computeX(a, b), computeY(a,b)-5, computeZ(a,b)},
   {computeX(c, d), computeY(c,d)-5, computeZ(c,d)}
}
1 голос
/ 13 декабря 2010

Сначала объявите, что у вас есть точка3, как это

struct point3
{
 float x;
 float y;
 float z;
};

затем объявите ваш массив

point3 points[2] = {{calculateX(a1, b1), calculateY(a1, b1), calculateZ(a1, b1)},{calculateX(a2, b2), calculateY(a2, b2), calculateZ(a2, b2)}};
0 голосов
/ 13 декабря 2010

Я бы хотел расширить ответ Робина Уэлча таким образом, чтобы он оставался совместимым с point3 typedef:

typedef float point3[3]; 


struct Point
{
    Point(float x, float y, float z)
    : x_(values_[0]), y_(values_[1]), z_(values_[2])
    {
        values_[0] = x;
        values_[1] = y;
        values_[2] = z;
    }

    float& x_;
    float& y_;
    float& z_;
    point3 values_;

    operator const point3&() const { return values_; }
    operator point3&() { return values_; }
};

Теперь вы можете просто использовать эту простую структуру и просто передать ее функциям OpenGLкак будто это не было этой структурой вообще.Он содержит оригинальный массив point3 для OpenGL, но удобный доступ и конструктор для вас.

0 голосов
/ 13 декабря 2010

В C я бы не инициализировал массив при его объявлении, если только это не маленький массив с постоянными значениями.

typedef float point3[3]; /* point is a type */
point3 *pp;              /* pp points to objects of type point3 */
point3 ap[NELEMS];       /* each (of NELEMS) element of ap is of type point3 */

pp = malloc(NELEMS * sizeof *pp);
if (pp) {
    /* use pp */
    pp[0][0] = computeX(); pp[0][1] = computeY(); pp[0][2] = computeZ();
    (*(pp+42))[0] = computeX(); (*(pp+42))[1] = computeY(); (*(pp+42))[2] = computeZ();
    free(pp);
}

ap[0][0] = computeX(); ap[0][1] = computeY(); ap[0][2] = computeZ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...