2011-07-06 34 views
6

Tôi đã viết mã để tính toán động lực của một tập hợp lớn phương trình tổng thể kết hợp bằng phương pháp Runge-Kutta. Mã chứa rất nhiều vòng lặp, trong đó mỗi bước độc lập. Tôi định dùng Grand Central Dispatch để tăng tốc chương trình. Tôi dựa trên nỗ lực của tôi trên một ví dụ tôi tìm thấy tại http://www.macresearch.org/cocoa-scientists-xxxi-all-aboard-grand-central. Cả mã của tôi lẫn ví dụ về biên dịch macresearch trên máy của tôi (MacOSX 10.6.8 Xcode 4.0.2). Vì vậy, đây là mã của tôi:Làm thế nào để viết vào một mảng từ một vòng dispatch_apply (GCD)?

... 
    double values[SpaceSize], k1[SpaceSize];  

     for (int t=1 ; t<Time ; t++) { 

      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

      //k1 
      for (int k=0 ; k<SpaceSize ; k++) values[k]=Concentration[k][t-1]; 

      dispatch_apply(SpaceSize, queue, 
         ^(size_t k) { 
          k1[k]=h * derives(values, SpaceSize, k); //<--error  
            } 
         ); 
... 

Nó phá vỡ với lỗi:

Semantic Issue: Cannot refer to declaration with a variably modified type inside block

tôi đã cố gắng thay thế các mảng (giá trị, k1) với một vectơ, nhưng sau đó tôi nhận được một thông báo lỗi thay vì:

Semantic Issue: Read-only variable is not assignable

Đó là nơi tôi bị kẹt, không thực sự biết những thông báo lỗi nào đang cố gắng nói với tôi. Tôi dành một chút thời gian tìm kiếm và hỏi xung quanh nếu có ai có thể giúp đỡ. Tôi sẽ rất biết ơn những lời khuyên hay cách tốt hơn để giải quyết vấn đề này.

Trả lời

14

error: cannot refer to declaration with an array type inside block

Thực hiện theo khối, không được phép truy cập vào mảng C từ khối. (Tôi không thể tìm thấy tài liệu về nó ...)

Có một sửa chữa dễ dàng :-)

double valuesArray[SpaceSize], k1Array[SpaceSize];  
double *values = valuesArray, *k1 = k1Array; 
+0

Cảm ơn rất nhiều! Điều đó dường như để khắc phục vấn đề! – Jofro

1

Để lưu vào biến bị bắt, bạn cần phải thêm thông số __block lưu trữ vào khai báo. Điều đó sẽ khắc phục sự cố std::vector mà bạn đang gặp phải.

Sự cố với loại được sửa đổi thay đổi làm cho âm thanh giống như bạn đang sử dụng mảng có độ dài thay đổi. Chúng không thể được gọi từ bên trong khối, vì chúng không thể được sao chép một cách đáng tin cậy vào bối cảnh của khối (về cơ bản là loại C struct tùy chỉnh) và chúng có thể làm lộn xộn các tính toán kiểu offsetof khi làm việc với ngữ cảnh. Bạn có thể giải quyết vấn đề này bằng cách làm việc với một biến kích thước cố định (chỉ cần sử dụng kích thước tối đa bạn sẽ cần), di chuyển mảng vào lưu trữ toàn cục/tĩnh, hoặc phân bổ một con trỏ và làm số học con trỏ để tự truy cập thứ nguyên thứ hai.

+0

Làm thế nào để tôi thêm các specifier __block. Có một ví dụ về nó liên quan đến dispatch_apply trong tài liệu Xcode, nhưng nó không hoạt động. (Tôi thậm chí còn tìm thấy một chiếc vé của ai đó phàn nàn về điều đó) \t \t Tôi không thay đổi kích thước của mảng, đó là lý do tại sao tôi không hiểu thông báo lỗi. \t \t Dù sao thì tôi cũng sử dụng cách giải quyết của Sakamoto và bây giờ tôi làm việc tốt. Nhưng cảm ơn sự giúp đỡ của bạn! – Jofro

Các vấn đề liên quan