#c #pointers #vector #struct #malloc
#c #указатели #вектор #структура #мэллок
Вопрос:
(Я не писал этот код. Это существующий фрагмент кода из домашней работы по параллельным алгоритмам Калифорнийского университета в Беркли, который я должен распараллелить с помощью Pthreads) В функции моего домашнего задания по параллельным алгоритмам есть этот фрагмент кода int main()
:
particle_t *particles = (particle_t*) malloc( n * sizeof(particle_t) ); init_particles( n, particles ); vectorlt;particle_t*gt; *bins = new vectorlt;particle_t*gt;[numbins];
с particle_t
определением вне int main()
как:
typedef struct { double x; double y; double vx; double vy; double ax; double ay; } particle_t;
и init_partciles()
как :
void init_particles( int n, particle_t *p ) { srand48( time( NULL ) ); int sx = (int)ceil(sqrt((double)n)); int sy = (n sx-1)/sx; int *shuffle = (int*)malloc( n * sizeof(int) ); for( int i = 0; i lt; n; i ) shuffle[i] = i; for( int i = 0; i lt; n; i ) { // // make sure particles are not spatially sorted // int j = lrand48()%(n-i); int k = shuffle[j]; shuffle[j] = shuffle[n-i-1]; // // distribute particles evenly to ensure proper spacing // p[i].x = size*(1. (k%sx))/(1 sx); p[i].y = size*(1. (k/sx))/(1 sy); // // assign random velocities within a bound // p[i].vx = drand48()*2-1; p[i].vy = drand48()*2-1; } free( shuffle ); }
Фрагмент кода, который я не могу понять, находится здесь
// clear bins at each time step for (int m = 0; m lt; numbins; m ) bins[m].clear(); // place particles in bins for (int i = 0; i lt; n; i ) bins[binNum(particles[i],bpr)].push_back(particles i);
Как я понимаю, ячейки bins
, являются указателями на particle_t
объекты, а не сами векторы. К сожалению, в первом цикле bins
клетки обрабатывались как сами векторы, потому .clear()
что на них использовалась функция. Во втором цикле также bins
клетки обрабатывались как векторы сами по себе, используя .push_back()
на них. Где же это недоразумение? Код каждый раз успешно компилируется.
Комментарии:
1. Почти никогда не бывает причин иметь указатель на стандартный контейнер. Для чего следует использовать
bins
вектор векторов.2. На аналогичной ноте вы почти никогда не должны использовать
malloc
в коде C .particles
также должен быть вектор. На самом деле, всякий раз, когда вам нужно выполнить приведение в стиле C в C (как вы делаете дляmalloc
), вы должны воспринимать это как признак того, что вы делаете что-то не так. Если показанный код был передан вам от кого-то другого, то этому другому человеку нужно вернуться в школу и правильно выучить C .3. «Как я понимаю, ячейки
bins
, являются указателями наparticle_t
объекты, а не сами векторы». — неточно. Подумайте так:bins
является ли указатель на что-то, назовем это X. Мыслите абстрактно. Если бы X былint
(то есть у вас было что-то вродеint *intptr
), то что бы у вас было, если бы вы использовали индекс в своей переменной? То есть, какой был бы типintptr[0]
? В этом конкретном случае замените Xint
, чтобы вернуться к абстрактному, затем замените «вектор указателей» на X, чтобы вернуться к вашему вопросу.4.
bins
это указатель, но в вашем случае он указывает на динамически распределенный массив векторов. Как уже было сказано, вместо этого следует использовать вектор векторов.5. (Я бы подумал об ответе, но вся предпосылка указателя на вектор настолько противоречит обычной практике C , что я задаюсь вопросом о долгосрочной ценности наличия этого вопроса-ответа в переполнении стека.)