[swift-users] proper syntax for inout array handling?
Saagar Jha
saagarjha28 at gmail.com
Thu Jun 9 22:39:21 CDT 2016
Nevermind, I lied. Swift does allow direct pointer arithmetic:
import Foundation
var source = [UInt8](repeating: 0x1f, count: 32)
var destination = [UInt8](repeating: 0, count: 64)
memcpy(&destination, source, 32) // the C function
memcpy(&destination + 3, source, 13) // the + operator works to offset
On Thu, Jun 9, 2016 at 7:21 PM Saagar Jha <saagarjha28 at gmail.com> wrote:
> Swift handling of Arrays isn’t like C (for which you can use UnsafePointer)-you
> don’t access the pointer of the third element. Instead, you can use Array
> slices, which makes it a one liner:
>
> destination[destinationStartIndex..<destinationStartIndex + count] = source[sourceStartIndex..<sourceStartIndex + count]
>
> In your case,
>
> destination[0..<0 + 32] = source[0..<0 + 32]
> destination[3..3 + 13] = source[0..<0 + 13]
>
> As a function:
>
> func memcpy(source: [UInt8], destination: inout [UInt8], sourceStartIndex: Int = 0, destinationStartIndex: Int = 0, count: Int) {
> destination[destinationStartIndex..<destinationStartIndex + count] = source[sourceStartIndex..<sourceStartIndex + count]
> }
>
> memcpy(source: source, destination: &destination, count: 32)
>
> memcpy(source: source, destination: &destination, destinationStartIndex: 3, count: 13)
>
>
>
> On Thu, Jun 9, 2016 at 1:38 PM Ken Burgett via swift-users <
> swift-users at swift.org> wrote:
>
>> I am converting a very dirty C program to Swift3, and their is plenty of
>> pointer arithmetic to be dealt with. As part of the effort, I have
>> created a 'memcpy clone to help with some of the transformation.
>> Here is the output from the REPL:
>> ================================
>> 1. var source = [UInt8](repeating: 0x1f, count: 32)
>> 2. var destination = [UInt8](repeating: 0, count: 64)
>> 3.
>> 4. func memcpy(dest: inout [UInt8], src: inout [UInt8], count: Int)
>> 5. {
>> 6. for ix in 0...count-1
>> 7. {
>> 8. dest[ix] = src[ix]
>> 9. }
>> 10. }
>> 11.
>> 12. memcpy(dest: &destination, src: &source, count: 32 )
>> 13.
>> 14. memcpy(dest: &destination[3], src: &source, count: 13)
>> error: repl.swift:14:26: error: cannot convert value of type 'UInt8' to
>> expected argument type '[UInt8]'
>> memcpy(dest: &destination[3], src: &source, count: 13)
>> ==================================
>> which shows me that the compiler does not like the form of
>> &destination[13], and doesn't treat it as a [UInt8].
>>
>> What is the correct syntax for using a base + offset as a source or
>> destination for a memory copy?
>>
>>
>> --
>> Ken Burgett
>> Principal Software Engineer
>> Email: kenb at iotone.io
>> Office: 530.693.4449
>> Mobile: 831.332.6846
>> URL: www.iotone.co
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
>>
> --
> -Saagar Jha
>
--
-Saagar Jha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160610/690b0d2d/attachment.html>
More information about the swift-users
mailing list