在c++中动态声明2D数组
Dynamicaly declaring 2D array in C++
我在主函数中创建了一个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,请建议我正确的实现。
首先注意二维数组是不可序列化的,因此正如其他答案所建议的那样,在您的情况下,一维数组可能是更好的方法。下面是原始的实现:
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)
{ }
如果你有任何问题请告诉我们。:)
二维数组在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
首先,您应该在堆中为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;
之后,您可以从Hello()
函数更新数组A
。
下面是一个没有任何错误检查的例子:
#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("%dt", array[0][0]);
array[0][0] = 4;
printf("%dt", array[0][0]);
return;
}
如果你不想让数组歪斜;
如何创建一个一维数组并以二维方式访问它。
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;
}
相关文章:
- 2D数组来自文本输入,中间有空格
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 使用矢量将文本文件中的输入存储到 2D 数组中
- 获取 2D 数组 c++ 中的所有数字对
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 如何在构造函数中使用初始值设定项设置具有相同值的 2d 数组?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 使用指针算法修改函数中的 2D 数组
- 在C++中初始化和打印 2D 数组
- 有没有办法使用输入的维度初始化 2d 数组中的所有项目而不循环C++?
- C++ 2D 数组写入多个位置
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 如何从initializer_list初始化 2D 数组
- 交换函数不是在 C++ 中交换 2D 数组的元素