2014-09-14 12 views
6

Tôi có chút này của Swift code mà dường như không có tác dụng ...Số học con trỏ Swift và dereferencing; chuyển đổi một số mã bản đồ C-like để Swift

// earlier, in Obj C... 
    typedef struct _Room { 
     uint8_t *map; 
     int width; 
     int height; 
    } Room; 

Một phòng là một phần của một đâm vào một trò chơi roguelike nếu bạn' tò mò. Tôi đang cố gắng viết lại một vài phần trong Swift. Dưới đây là đoạn code mà xuất hiện phá vỡ, và những gì tôi hy vọng tôi đang làm như nhận xét:

let ptr = UnsafePointer<UInt8>(room.map) // grab a pointer to the map out of the room struct 
let offset = (Int(room.width) * Int(point.y)) + Int(point.x) // calculate an int offset to the location I am interested in examining 
let locationPointer = ptr + offset // pointer advances to point to the offset I want 
var pointValue = ptr.memory // What I used to get with *ptr 

Cái gì là sai ở đây vì các xét nghiệm đơn giản cho thấy giá trị của pointValue không phải là những gì tôi biết tôi đang nhìn trên bản đồ, có đặt một vị trí rất đơn giản (1, 1) thành một giá trị đã biết. Nó có vẻ khá rõ ràng rằng Swift không phải là làm điều này nhưng nó là một sự chuyển đổi với mục đích học Way of Swift khi tôi biết cú pháp đủ tốt.

Tôi mong đợi lỗi xảy ra trong mã nhanh - vì tất cả đều hoạt động trong phiên bản C mục tiêu. Lỗi đâu rồi?

+0

+1 cho vấn đề rất nêu rõ. – vacawama

Trả lời

10

Bạn đang chỉ định locationPointer để trỏ đến vị trí mới nhưng vẫn sử dụng ptr ở dòng tiếp theo và giá trị ptr chưa bị thay đổi. Thay đổi dòng cuối cùng của bạn để:

var pointValue = locationPointer.memory 

hoặc bạn có thể thay đổi con trỏ của bạn đến một var và trước đó:

var ptr = UnsafePointer<UInt8>(room.map) // grab a pointer to the map out of the room struct 
let offset = (Int(room.width) * Int(point.y)) + Int(point.x) // calculate an int offset to the location I am interested in examining 
ptr = ptr + offset // pointer advances to point to the offset I want 
var pointValue = ptr.memory // What I used to get with *ptr 
+4

Tại sao bỏ phiếu xuống? Đừng bỏ phiếu mà không có bình luận. Đó không phải là giúp đỡ bất cứ ai. – vacawama

+0

Tính năng này hoạt động chính xác với tôi. Tôi không hiểu tại sao nó lại bị bỏ phiếu ... –

+0

Argh! Đó là loại sai lầm bạn nhận được để lập trình muộn. Cảm ơn, tôi sẽ thử và chấp nhận sau. –

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