C#で作成したマルチタスクの処理をC++で実装しようとしています。
まず、C#では以下のコードを実装しています。
C#
1namespace TaskArray 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 int[] a = { 1, 2, 3, 4}; 8 int[] b = { 2, 3, 4, 5 }; 9 int[] ans = new int[4]; 10 11 Task[] taskArray = new Task[4]; 12 13 for (int i = 0; i < 4; i++) 14 { 15 // コンストラクタの第二引数に渡した値は、コンストラクタ定義時に入れた値がStart時に入る 16 taskArray[i] = new Task(obj => AddCalc(a[(int)obj], b[(int)obj], ref ans[(int)obj]), i); 17 taskArray[i].Start(); 18 } 19 20 Task.WaitAll(taskArray); 21 22 for (int j = 0; j < 4; j++) 23 { 24 Console.WriteLine(ans[j]); 25 } 26 27 Console.ReadKey(); 28 } 29 30 static void AddCalc(int a, int b, ref int c) 31 { 32 c = a + b; 33 } 34 35 } 36}
上記の結果では、aとbの各要素が足されて「3,5,7,9」が出力されます。
これをC++で以下のように実装しようとしたのですが、「auto型はトップレベルの配列型では設定できません」、
「外側の関数のローカル変数は、キャプチャリストに含まれていない限り、lambd本体で参照できません。」
のビルドエラーが発生してしまいます。
原因、解決方法が分かる方がおられましたら宜しくお願い致します。
C++
1using namespace concurrency; 2using namespace std; 3 4int _tmain(int argc, _TCHAR* argv[]) 5{ 6 int a[] = { 1, 2, 3, 4}; 7 int b[] = {2, 3, 4, 5 }; 8 int ans[4]; 9 10 auto t[4]; 11 12 for (int i = 0; i < 4; i++) 13 { 14 t[i] = create_task([]() { AddCalc(a[i], b[i], &ans[i]); }); 15 } 16 17 for (int i = 0; i < 4; i++) 18 { 19 t[i].then([]{}).wait(); 20 } 21 22 return 0; 23} 24 25// 加算 26void AddCalc(int a, int b, int* c) 27{ 28 *c = a + b; 29}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/25 15:02