#include <Core/Core.h> using namespace Upp; #define ICOUNT 15 class A{ public: Buffer<int> ib; A(){ ib.Alloc(ICOUNT,0); for(int i=0;i<ICOUNT;i++) ib[i]=i+1; } void operation(int &x){ x*=2; } void operationp(int *x){ *x*=2; } void Run(){ Cout() << "ib = "; for(int i=0;i<ICOUNT;i++) Cout() << ib[i] << ", "; CoWork co; for(int i=0;i<ICOUNT;i++){ //co & [&] { operation(ib[i]); }; // Reference variant co & [&] { operationp(&ib[i]); }; // Pointer variant } co.Finish(); Sleep(400); Cout() << "\n\nib*2 = "; for(int i=0;i<ICOUNT;i++) Cout() << ib[i] << ", "; Cout() << "\n\n"; } }; CONSOLE_APP_MAIN { A ac; ac.Run(); }
CoWork co; for(int i=0;i<ICOUNT;i++){ //co & [&, i] { operation(ib[i]); }; // Reference variant co & [&, i] { operationp(&ib[i]); }; // Pointer variant } co.Finish();
Well, the second cup of coffee solved it for me:
CoWork co; for(int i=0;i<ICOUNT;i++){ //co & [&, i] { operation(ib[i]); }; // Reference variant co & [&, i] { operationp(&ib[i]); }; // Pointer variant } co.Finish();
Must have 'copy capture' for i, or otherwise the index i will run away before used.
Sorry for bothering with such trivial issue.
Best regards,
Tom
CoWork co; co & [&] { for(;;) { int i = co.GetNext(); if(i >= ICOUNT) break; operationp(&ib[i]); } }
#define PARALLEL_LOOP(_ICOUNT_,_OPERATION_) { CoWork _co_; _co_ * [&] { for(int i = _co_.Next(); i < _ICOUNT_ ; i = _co_.Next()) { _OPERATION_; } };}
PARALLEL_LOOP(n, operation(ib[i]));