Как мне вернуть индексы многомерного элемента массива в C? - PullRequest
0 голосов
/ 09 апреля 2010

Скажем, у меня есть двумерный массив случайных логических единиц и нулей, называемый «решеткой», и у меня есть одномерный массив, называемый «список», в котором перечислены адреса всех нулей в двумерном массиве. Вот как определяются массивы:

define n 100  
bool lattice[n][n];  
bool *list[n*n];

После заполнения решетки единицами и нулями я сохраняю адреса нулей в списке:

for(j = 0; j < n; j++)
{   
    for(i = 0; i < n; i++)
    {
        if(!lattice[i][j])  // if element = 0
        {
            list[site_num] = &lattice[i][j];  // store address of zero
            site_num++;
        }
    }
}

Как извлечь координаты x, y каждого нуля в массиве? Другими словами, есть ли способ вернуть индексы элемента массива через ссылку на его адрес?

РЕДАКТИРОВАТЬ: Мне нужно сделать код максимально эффективным, так как я делаю много других сложных вещей с гораздо большими массивами. Так что быстрый способ сделать это был бы великолепен

Ответы [ 4 ]

1 голос
/ 09 апреля 2010

Одним из решений является сопоставление (x, y) с натуральным числом (скажем, z).

z = N * x + y
x = z / N (integer division)
y = z % N

В этом случае вы должны использовать int list[N * N];

Другое решение - просто сохранить координаты, когда вы найдете ноль, что-то вроде:

list_x[site_num] = x;
list_y[site_num] = y;
site_num++;

Или вы можете определить структуру из двух int s.

1 голос
/ 09 апреля 2010

Ну, это возможно с некоторой арифметикой указателя.

У вас есть адрес вашего первого элемента решетки и адреса всех нулевых полей в списке. Вы знаете размер bool. Вычитая адрес первого элемента из адреса нулевого поля и деля его на размер bool, вы получаете линейный индекс. Этот линейный индекс может быть вычислен в 2-мерный индекс с использованием модуля и деления.

Но почему бы вам не сохранить двухцветный индекс в вашем списке вместо адреса? Вам нужен адрес или просто указатель?
И вам следует подумать о том, чтобы повернуть циклы for (внешний цикл i, внутренний цикл j).

0 голосов
/ 09 апреля 2010
struct ListCoords
{
   int x, y;
} coords[n*n];

for(i = 0; i < site_num; i++)
{
    int index = list[i] - &lattice[0][0];
    coords[i].x = index % n;
    coords[i].y = index / n;
}

Я могу использовать% и / операторов в обратном направлении для ваших нужд, но это должно дать вам представление.

0 голосов
/ 09 апреля 2010

Как извлечь координаты x, y каждого нуля в массиве? Другими словами, есть ли способ вернуть индексы элемента массива, ссылаясь на его адрес?
Ты не можешь Просто как тот. Если вам нужна эта информация, вам нужно передать ее вместе с соответствующими массивами.

bool *list[n*n]; - недопустимое утверждение в C89 (РЕДАКТИРОВАТЬ: Если вы не сделали макрос (черт!)), Вы можете заметить, что массивы переменной длины являются функцией C99.

...