全局使用C ++中的2D数组

时间:2014-03-18 04:21:00

标签: c++ dynamic pthreads multidimensional-array

我的问题是我想要使用线程更新一个矩阵乘以两个矩阵。以下是我的代码

#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <ctime>
#include <cmath>
#include <vector>

using namespace std;

int thread_count; // For Command Line Argument
int l;
int m;
int n;
int start_Task;
int stop_Task;

void *Hello(void* rank); // Prototype of a thread function

int main(int argc,char* argv[])
{      
int thread_id;

thread_count = atoi(argv[1]);
int l = atoi(argv[2]);  
int m = atoi(argv[3]);  
int n = atoi(argv[4]);  

int A[l][m]; //creates A l*m matrix or a 2d array. 

for(int i=0; i<l; i++)    //This loops on the rows.
{
    for(int j=0; j<m; j++) //This loops on the columns
    {
        A[i][j] = i+j; // Allocating values to A matrix
    }
}

int B[m][n]; //creates B m*n matrix or a 2d array.
for(int i=0; i<m; i++)    //This loops on the rows.
{
    for(int j=0; j<n; j++) //This loops on the columns
    {
        B[i][j] = i+j+1; // Allocating values to B matrix
    }
}

int C[l][n]; //creates C m*n matrix or a 2d array.

int remainder = l % thread_count;
int allocatedProcess = l/thread_count;
start_Task =0; 
//cout<<remainder<<" "<<allocatedProcess<<endl;
pthread_t myThreads[thread_count]; 

//creates a certain number of threads
for(thread_id = 0; thread_id < thread_count; thread_id++)
   {    
    stop_Task = start_Task + allocatedProcess;
    pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
start_Task = stop_Task; 
}

cout<<"Hello from the main thread \n"<<endl;

for(int i=0; i<l; i++)    //This loops on the rows.
{
    for(int j=0; j<n; j++) //This loops on the columns
    {
        cout<<"Values in Final Matrix is"<<C[i][j]<<endl;
    }
}
 //wait until all threads finish
 for(thread_id = 0; thread_id<thread_count; thread_id++)        
pthread_join(myThreads[thread_id],NULL);

 return 0;
 }//main

 void *Hello(void* rank)
 {
for(int i=start_Task; i<stop_Task; i++)    //This loops on the rows.
{
    for(int j=0; j<n; j++) //This loops on the columns
    {
        int sum = 0;
        for(int k=0; k<m; k++) //This loops on the columns
        {
             sum += A[i][k] * B[k][j]; // Allocating values to C matrix
              //product[row][col] += aMatrix[row][inner] * bMatrix[inner][col];
            }
     C[i][j] = sum;
    cout << C[i][j] << "  ";
          }
       cout << "\n";
}

  int my_rank = (long)rank;

  cout<<"Thread_"<<my_rank<<" of "<<thread_count<<endl;

  return NULL;
  }

我面临的问题是,由于维度本身是全球性的,因此我无法全局化我的Matrix。请更新我正确的方式来实现它。

2 个答案:

答案 0 :(得分:1)

简短的回答是C和C ++中的数组必须使用常量设置,而不是变量。

你的例子中的l和m不是常量。你可以使用std :: vector。如果您使用的是C ++ 11编译器,那么您还有其他几个选项。这是一个可能有用的线程,但是认真;谷歌&#34; 2d动态数组c ++&#34;看看还有什么。它对你来说是一个很好的练习,可以帮助我避免复制和粘贴所有这些精彩的文章!

http://www.cplusplus.com/forum/beginner/12409/

答案 1 :(得分:0)

你可以通过声明一个指针来完成它。

int *my_array;

在任何方法中,您都可以使用以下行:

std::cin >> n;
my_array = new int[n];

希望这会有所帮助.. :)