[Procedural Programming + Ada] Bài 25 – Interfacing with C

Nhóm công cụ cuối cùng ở cấp độ cú pháp ngôn ngữ của Ada mà chúng ta sẽ tìm hiểu là package hỗ trợ giao tiếp với ngôn ngữ C. Importing C from Ada Như đã giới thiệu trươc đó trong bài viết mở đầu của Sub-Series này, chúng ta sẽ có thể dễ dàng

Nhóm công cụ cuối cùng ở cấp độ cú pháp ngôn ngữ của Ada mà chúng ta sẽ tìm hiểu là package hỗ trợ giao tiếp với ngôn ngữ C.

Importing C from Ada

Như đã giới thiệu trươc đó trong bài viết mở đầu của Sub-Series này, chúng ta sẽ có thể dễ dàng tích hợp code C vào một project Ada. Thậm chí chúng ta còn có thể viết code logic song song trên các tệp của C sau đó thực hiện biên dịch toàn bộ các tệp code CAda trong cùng một project được quản lý bởi gprbuild.

Để sử dụng nhiều ngôn ngữ trong một project Ada, chúng ta cần liệt kê tên của các ngôn ngữ muốn sử dụng tại tệp cấu hình của project. Các ngôn ngữ khác ngoài C, ví dụ như Fortran, Assembler, v.v… có thể sẽ yêu cầu khai báo thêm các thông tin bổ sung về trình biên dịch để gprbuild có thể điều khiển tiến trình biên dịch song song với các tệp code Ada.

project Learn_Ada is
   for Languages use ("Ada", "C");
   -- for ...
end Learn_Ada;

Sau đó thì chúng ta có thể tạo các tệp code C trong thư mục src của project.

int triple (int value);
void print (int value);
#include"stdio.h"#include"./foreign.h"inttriple(int value){return value *3;}voidprint(int value){printf("Printing from C... n");printf("Value : %i n", value);}

Ở đây chúng ta có một tệp header.h định nghĩa một struct và khai báo một hàm triple được định nghĩa trong tệp body.c. Để sử dụng các yếu tố này trong code của Ada, chúng ta cần tạo ra code khai báo tương ứng để tham chiếu tới các yếu tố đã được định nghĩa bằng code C.

with Ada.Text_IO; use Ada.Text_IO;
with Interfaces.C;
 
procedure Main is
   subtype C_int is Interfaces.C.int;

   function C_triple (Value : C_int)
      return C_int
   with Convention => C,
        Import => True,
        External_Name => "triple";
   
   procedure C_print (Value : in C_int)
   with Convention => C,
        Import => True,
        External_Name => "print";

   Value : C_int;
begin
   Value := 9;
   Value := C_triple (Value);
   C_print (Value);
end Main;
Printing from C... 
Value : 27

Exporting Ada to C

Ở chiều tương tác ngược lại, khi chúng ta muốn gọi một sub-program đã được viết bằng code Ada trong một tệp code C cùng project thì thao tác cần thực hiện là Export thông qua Interfaces.C.

with Interfaces.C; use Interfaces.C;

package Export is
   subtype C_int is Interfaces.C.int;

   function Add
      ( A : C_int
      , B : C_int )
      return C_int
   with Convention    => C,
        Export        => True,
        External_Name => "add";
end Export;
package body Export is

   function Add
      ( A : C_int
      , B : C_int )
      return C_int is
   begin
      return A + B ;
   end Add;

end Export;

Như vậy trong một tệp code C bất kỳ đó, chúng ta sẽ có thể xem như hàm add đã được định nghĩa ở phạm vi toàn cục global và khai báo bằng từ khóa extern trước khi sử dụng.

#include<stdio.h>externintadd(int a,int b);// bây giờ `add` đã có thể được gọi// trong một `sub-program` nào đó .

[Object-Oriented + Ada] Bài 1 – Object-Oriented Aspects

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,