Динамический массив массивов
У меня есть файл со списком точек и их координат в трехмерном пространстве. Мне нужно хранить их координаты в массиве (где индекс- номер точки) массивов.
К примеру точка
(i = 0 : 0.000, 214.000, 73.000)
Должна выглядеть как
coords[0][0] = 0.000; coords[0][1] = 214.000; coords[0][2] = 73.000;
Количество точек известно (записано в начале файла), но может меняться, так что мне потребуется динамический массив (malloc), а вот измерений всегда будет 3. Как лучше мне реализовать это, учитывая то, что в дальнейшем мне придется обходить этот массив для поиска соседей (точек, находящихся в пределах заданного радиуса)?
Если использовать такой способ, (Nat- количество точек)
float* coords = (float*)malloc(Nat * 3 * sizeof(float));
то у меня выйдет одномерный массив. Этот способ хуже (в плане быстродействия), чем следующий, где я выделяю память под массив указателей на массивы координат (состоящие из трех элементов)?
float** coords = (float**)malloc(Nat * sizeof(float));
И еще одно- во втором способе как мне присвоить указателю адрес нового (пустого) массива? В C ведь нет "new". Можно это и здесь сделать через malloc, но мне кажется это излишним, ведь размер здесь задается не переменной, он всегда 3. Так нет ли способа сделать это как-нибудь наподобие
coords[i] = new int[3]
?
Ответы (2 шт):
Если вы будете заниматься расширением массива часто, то его стоит сделать как можно более простым, так что в этом случае я бы делал его одномерным и использовал либо структуру
struct point { double x,y,z; }
point * p = malloc(....);
И обращение к элементам как к
p[i].x, p[i].y, p[i].z
или как одномерный же массив троек (если нужно обращаться именно через индекс) -
double * coord = malloc(3*sizeof(double)*.....)
и обращаться через
coord[i*3+0], coord[i*3+1], coord[i*3+2]
Замедления не будет, потому что именно в такое обращение компилятор превращает
coord[i][j]
в двумерном массиве.
В варианте
double ** coord = malloc(3*sizeof(double*));
coord[0] = malloc(sizeof(double)*....);
coord[1] = malloc(sizeof(double)*....);
coord[2] = malloc(sizeof(double)*....);
будет сложнее работать при изменении количества точек (потребуется три realloc'а вместо одного).
Да используйте статический массив это круче.Проверяйте вход через макрос:
#define check_s(i,max_buf,func,var) if(i>max_buf){ms0;_e_(func,var);}
#define _e_(func,var) \
printf("in func->%s\n",func);printf("var->%s\n",var);
#define ms0 printf ("Static memory error\n")
#define md0 printf ("Dinamic memory error\n")
#define ne0 printf ("Null error\n")