我在主函数中创建了一个2D数组,并希望在另一个函数中更新它。根据我的第一个想法,我需要动态声明数组,但问题是维度也应该是动态的 -
以下是我正在尝试的事情 -
int l;
int m;
int n;
void *Hello(void* rank); // Prototype of a thread function
int main(int argc,char* argv[])
{
int l = atoi(argv[2]);
int m = atoi(argv[3]);
int n = atoi(argv[4]);
int A[l][m];
pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
}
void *Hello(void* rank)
{ }
我想从* Hello函数更新数组A,请建议我正确实现。
答案 0 :(得分:3)
首先请注意,二维数组不可序列化,因此正如其他答案所推荐的那样,在您的情况下,一维数组可能是更好的方法。这是天真的实现:
static int l, m, n; // static: local to compilation unit
int **A;
void *Hello(void* rank); // Prototype of a thread function
int main(int argc,char* argv[])
{
l = atoi(argv[2]);
m = atoi(argv[3]);
n = atoi(argv[4]);
A = new int*[l]; // remember to free this!
for (int i = 0; i < l; ++i) {
A[i] = new int[m];
}
pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
}
void *Hello(void* rank)
{ }
这是另一个,带有可序列化的1-D数组来保存数据:
static int l, m, n; // static: local to compilation unit
int **A, *A_data;
void *Hello(void* rank); // Prototype of a thread function
int main(int argc,char* argv[])
{
l = atoi(argv[2]);
m = atoi(argv[3]);
n = atoi(argv[4]);
A_data = new int[l*m]; // remember to free this!
for (int i = 0; i < m; ++i) {
A[i] = &A_data[i*l];
}
pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
}
void *Hello(void* rank)
{ }
如果您有任何疑问,请告诉我们。 :)
答案 1 :(得分:2)
二维数组在C ++中并不常见:通常更简单(通常更好)只有一维数组并用它来存储你的所有数据:
int *A = new int[ l*m ];
// A[i][j] == A[ i*l + j%l ]
此外,在C ++中避免原始内存分配通常是一种很好的做法:而是使用std::vector
或其他与数组语义相关的内容:
std::vector<int> A( l*m );
// A[i][j] == A[ i*l + j%l ]
或者,如果由于某些原因你真的需要一个二维数组:
std::vector< std::vector<int> > A( l, std::vector<int>(m) );
// A is a vector of l vectors of m ints
答案 2 :(得分:1)
首先,您应该为堆中的2D数组分配内存:
int **A = (int **)malloc(sizeof(int *) * l);
/* Error checking */
int i;
for(i = 0; i < l; ++i)
A[i] = (int*)malloc(sizeof(int) * m);
请注意,数组不在连续的内存区域中
然后你需要使用第四个参数将A
传递给Hello()
:
pthread_create(&myThreads[thread_id], NULL, Hello, (void*)A);
然后在函数Hello()
中,将void*
投回int**
int **array = (int**)rank;
之后,您可以从A
函数更新数组Hello()
。
这是一个没有任何错误检查的例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int l,m;
void *Hello(void* rank); // Prototype of a thread function
int main(int argc,char* argv[])
{
l = atoi(argv[2]);
m = atoi(argv[3]);
int **A = (int **)malloc(sizeof(int *) * l);
int i;
for(i = 0; i <m; ++i)
A[i] = (int*)malloc(sizeof(int) * m);
A[0][0] = 3;
pthread_t tid;
pthread_create(&tid, NULL,Hello, (void*)A);
pthread_join(tid, NULL);
return 0;
}
void *Hello(void* rank)
{
int **array = (int**)rank;
printf("%d\t", array[0][0]);
array[0][0] = 4;
printf("%d\t", array[0][0]);
return;
}
答案 3 :(得分:0)
如果你不想制作歪斜阵列;
如何创建一个d阵列并以二维方式访问它。
int l;
int m;
int n;
#define idx(i,j) i*m+j
int main(int argc,char* argv[])
{
int l = atoi(argv[2]);
int m = atoi(argv[3]);
int n = atoi(argv[4]);
int *A=(int*)malloc(sizeof(int)*l*m);
memset(A,0,sizeof(int)*l*m);
// Use the array like this
// A[idx(i,j)]=10;
}