2012-08-28 43 views
15

Tôi đã vector hóa một số mã MATLAB mà tôi đã viết trước đây và trong quá trình này, MATLAB bắt đầu bị lỗi do lỗi phân đoạn. Tôi đã thu hẹp vấn đề xuống một loại tính toán duy nhất: gán cho nhiều thuộc tính struct.Lỗi phân đoạn Matlab khi chuyển giao véc-tơ

Ví dụ, thậm chí tự phân công của hình thức này cuối cùng gây ra một lỗi seg khi thực hiện vài nghìn lần:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

Ban đầu tôi giả định điều này phải là rò rỉ bộ nhớ, vì vậy đã cố gắng in ra bộ nhớ trống của java sau mỗi lần lặp lại, nhưng điều này vẫn không đổi.

Vì vậy, yeah, hoàn toàn thua lỗ hiện nay là tại sao điều này phá vỡ: -/

UPDATE: những thay đổi sau sửa chữa các đứt gãy seg:

temp = [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

Câu hỏi đặt ra là tại sao điều này sẽ khắc phục mọi thứ. Một cái gì đó về lặp đi lặp lại truy cập vào một lớp xử lý chứ không phải là một danh sách struct có lẽ?

UPDATE 2: THE âm mưu dày

Cuối cùng tôi đã nhân rộng các vấn đề và các công trình xung quanh bằng cách sử dụng chương trình giả đủ đơn giản để đăng bài viết:

một lớp đơn giản:

classdef test_class 
    properties 
     test_prop 
    end 
end 

Và một chương trình tạo một loạt các bài tập vectơ với lớp học và sẽ luôn bị lỗi.

test_instance = test_class(); 
test_instance.test_prop = struct('test_field',{1 1}); 
for i=1:10000 

    [test_instance.test_prop.test_field] = test_instance.test_prop.test_field; 
end 

UPDATE 3: cốt truyện mỏng

Hóa ra tôi tìm thấy một lỗi. Theo sự hỗ trợ kỹ thuật của Matlab, việc gán véc-tơ lặp đi lặp lại các thuộc tính lớp đơn giản sẽ không hoạt động trong R2011a (và có lẽ trong phiên bản trước đó). Ông nói với tôi nó hoạt động tốt trong R2012a, và sau đó đề cập đến cùng một workaround tôi phát hiện ra: sử dụng một biến tạm thời.

Vì vậy, yeah ...

khá chắc chắn câu hỏi này kết thúc với vé hỗ trợ, nhưng nếu bất kỳ cá nhân táo bạo muốn chụp là tại sao lỗi này tồn tại ở tất cả, tôi muốn chắc chắn vẫn có quan tâm đến câu trả lời như vậy. (học tập vui vẻ!)

+0

Phiên bản Matlab của bạn là gì? –

+0

R2011a cho win 7 64 bit – zergylord

+0

Không thể giúp bạn ở đây ... Tôi có R2010b trên Linux 64 bit, và nó hoạt động tốt ở đó. Bạn có được một bãi chứa bộ nhớ hoặc tương tự? –

Trả lời

3

Cho đến nay, nguyên nhân có thể xảy ra nhất là thao tác được sử dụng nội bộ bằng mã tự sửa đổi.Vấn đề với điều này là các bộ vi xử lý hiện đại có bộ đệm CPU, vì vậy nếu bạn thay đổi mã trong bộ nhớ, nhưng mã đã được cam kết vào bộ nhớ cache, nó sẽ tạo ra một lỗi seg.

Lý do tại sao nó là ngẫu nhiên là bởi vì nó phụ thuộc vào việc sửa đổi mã là trong bộ nhớ cache tại thời điểm sửa đổi và các yếu tố khác.

Để tránh điều này, người lập trình phải chắc chắn mã đã xóa bộ nhớ cache trước khi thực hiện tự sửa đổi.

+0

Bạn đã loại bỏ thành công thêm một bóng ma từ pantheon của chương trình ghouls. Cảm ơn và chúc mừng! – zergylord

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