C: правильно помещать массивы в массивы - PullRequest
0 голосов
/ 15 января 2010

myRainfallDB - это трехмерный массив, содержащий информацию о количестве осадков в случайных местах на земле. Я хочу установить следующую структуру массива:

myRainfallDB[] содержит список записей мест. Эти координаты должны храниться в двойных числах.

myRainfallDB[][] содержит

  • По индексу 0: двойник, содержащий координату X места
  • По индексу 1: двойник, содержащий координату Y места
  • По индексу 2: массив, содержащий двенадцать двойных, хранящих количество осадков в месяц

Я знаю, что, возможно, я смогу добиться более эффективного результата с помощью классов, но я только изучаю C, поэтому пока хочу играть только с массивами. Как мне объявить этот трехмерный массив?

Ответы [ 5 ]

4 голосов
/ 15 января 2010

Вам нужна структура или просто поместите пользовательскую структуру данных. Что-то вроде:

struct rainfall_t {
   double x, y; /* location */
   double monthly_rainfall[ 12 ];
};

В C массивы однородны, то есть они могут хранить данные только одного типа. Даже для многомерных массивов. Возможно, вы не можете иметь массив для всех описываемых вами данных, не обернув его в struct.

Затем вы можете создать массив rainfall_t и использовать его по своему желанию:

struct rainfaill_t db[ 100 ]; /* a DB of 100 locations */

Вам также следует искать динамически выделенную память на случай, если вы заранее не знаете, сколько локаций вам придется иметь дело.

2 голосов
/ 15 января 2010

Вы действительно не хотите использовать для этого 3D-массив - C не очень хорошо справляется с многомерными массивами. Кроме того, гораздо проще работать с именами, а не с индексами массивов, поэтому вместо этого создайте структуру:

typedef struct {
   double x, y;
   double rainfall[12];
} places;

, а затем создайте одномерный массив из них:

places p[100];   // 100 places
2 голосов
/ 15 января 2010

Я думаю, что больше, чем массив, вам сначала понадобится структура для хранения информации, которую вы упомянули. Вам требуется массив структуры, а не трехмерный массив.

struct RainfallDB
{
double XCord;
double YCord;
double Mnths[12];
};

Теперь в функции вы можете объявить массив следующим образом.

struct RainFallDB raininfo[100];

Это будет хранить информацию 100 записей. Если вы не знаете, сколько записей пользователь хотел бы сохранить, вы можете создать список ссылок из структуры и динамически распределить его с помощью malloc.

Надеюсь, это поможет.

0 голосов
/ 15 января 2010

В многомерном массиве старшие измерения состоят из массивов меньших размеров.

Таким образом, только ваш последний массив будет содержать что-то кроме массива.

Кажется, вам не нужно это третье измерение, верно?

Итак:

rfd[][14] = { 
                   { X_coord, Y_coord, rain, rain, rain, ... },
                   { X_coord, Y_coord, rain, rain, rain, ... },
                   { X_coord, Y_coord, rain, rain, rain, ... },
};

Вам понадобится параллельный массив для названий мест. Вот почему обычно используют структуру для данных такого типа.

char *places[] = { "Spain, the plains", ... };

(ИЛИ, struct Rain { char *place, double x,y; double rain[12]; };)

0 голосов
/ 15 января 2010

Да, использовать структуры для работы

struct myRainfallRecord {
     double x;
     double y;
     double **monthlyrainfall;
}

и иметь массив myRainfallRecords. В месячном потоке можно использовать malloc с помощью malloc (12 * sizeof (double)) при заполнении значения структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...