2016-04-22 19 views
9

Trong C, tại sao tôi không thể làm điều này:Tại sao tôi không thể truyền mảng liên tục làm đối số?

arrayfn({1.0, 2.0, 3.0}); 

nếu arrayfn là một số chức năng mà mất trong một tham số kiểu double[] hoặc double*, tùy theo. Việc thử này cho tôi một lỗi cú pháp.

Có cách nào mà tôi có thể đạt được điều gì đó trong C như tạo ra và ngay lập tức truyền một mảng được biết đến tại thời gian biên dịch - tránh phải tiêu tốn một dòng mã trước khi khai báo và điền vào nó không?

+5

Bạn có thể sử dụng ký tự hợp chất. –

+1

câu trả lời hay; thử nó; nó hoạt động; chúng tôi đang thực hiện ở đây –

+3

Chúng tôi không thực hiện cho đến khi bạn chấp nhận câu trả lời. – Almo

Trả lời

9

Câu trả lời ngắn: Bạn cần sử dụng số compound literal. Một cái gì đó như

arrayfn((double[]) {1.0, 2.0, 3.0}); 

nên thực hiện công việc.


Một số lời giải thích

Đến với các phần, tại sao arrayfn({1.0, 2.0, 3.0}); không hiệu quả, bởi vì, không có cú pháp cho literals hợp chất, {1.0, 2.0, 3.0} là một cú đúp kèm theo danh sách initializer. Nó không biểu thị một "đối tượng" có thể được sử dụng làm đối số hàm. Chúng là không phải"mảng liên tục", như bạn có thể đã nghĩ.

Để thêm một số thông tin hơn, trích dẫn C11, chương §6.5.2.5, literals Compound

Một biểu thức postfix bao gồm một loại tên trong ngoặc đơn theo sau là một danh sách cú đúp kín của initializers là một hợp chất theo nghĩa đen. Nó cung cấp một đối tượng chưa đặt tên có giá trị được đưa ra bởi danh sách khởi tạo.

+0

Cảm ơn! Nó hoạt động. Ngạc nhiên là xung lực tức thời của tôi là chạy '(double *) {1.0, 2.0, 3.0}', mà không làm những gì tôi muốn nó làm - nhưng đủ gần! –

+2

'const double []' – user3528438

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