CodeBlanks Logo Icon CodeBlanks

Meydan okuma 2

dart:ffi ile C kütüphanesinden matematik çağrısı yaparsın.

dart:ffi ile C çağrısı

dart:ffi, Dart'tan doğrudan C kütüphanelerini çağırmana izin verir. DynamicLibrary.process() ile işlemdeki sembolleri açarsın; lookupFunction ile bir C fonksiyonunu Dart fonksiyonuna sarmalarsın. İki typedef gerekir: yerel imza ve Dart imzası.

typedef SqrtNative = Double Function(Double);
typedef SqrtDart = double Function(double);

final lib = DynamicLibrary.process();
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
print(sqrt(9));  // 3.0

Uygulama sqrt çağrısı

SqrtNative ve SqrtDart typedef'lerini tanımla. DynamicLibrary.process() ile kütüphaneyi aç. lookupFunction ile sqrt fonksiyonunu al. main içinde karekök fonksiyonunu 9 ile çağır ve sonucu yazdır.

Başlangıç kodu

main.dart
import 'dart:ffi';

// İki typedef tanımla: yerel ve Dart imzası
// Kütüphaneyi aç
// karekök fonksiyonunu sarmala
// main: fonksiyonu 9 ile çağır ve yazdır

void main() {
}

Örnek çözüm

main.dart
import 'dart:ffi';

typedef SqrtNative = Double Function(Double);
typedef SqrtDart = double Function(double);

void main() {
  final lib = DynamicLibrary.process();
  final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
  print(sqrt(9));
}

Beklenen çıktı

3.0

Uygulama Hipotenüs hesapla

Aynı typedef'leri ve sqrt sarmalayıcıyı kullan. hypotenuse(double a, double b) fonksiyonu yaz: sqrt(a * a + b * b) döndürsün. main içinde hypotenuse(3, 4) sonucunu yazdır.

Başlangıç kodu

main.dart
import 'dart:ffi';

// İki typedef: yerel ve Dart imzası
// Kütüphaneyi aç ve karekök fonksiyonunu sarmala
// hypotenuse(a, b) fonksiyonu yaz
// main: hipotenüs(3, 4) sonucunu yazdır

void main() {
}

Örnek çözüm

main.dart
import 'dart:ffi';

typedef SqrtNative = Double Function(Double);
typedef SqrtDart = double Function(double);

double hypotenuse(double a, double b) {
  final lib = DynamicLibrary.process();
  final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
  return sqrt(a * a + b * b);
}

void main() {
  print(hypotenuse(3, 4));
}

Beklenen çıktı

5.0

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 lookupFunction ne işe yarar?

  • Platform kanalı açar
  • C kütüphanesini derler
  • Bellek yönetimi yapar
  • C fonksiyonunu Dart fonksiyonuna sarmalar Doğru cevap

Açıklama: lookupFunction, bir C sembolünü arar ve güvenli Dart çağrısına sarmalar; iki typedef arasındaki dönüşümü yapar.

2 DynamicLibrary aç

Soru
final lib = ____;
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
Cevap
final lib = DynamicLibrary.process();
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');

Açıklama: DynamicLibrary.process() işlemdeki tüm sembolleri açar; sqrt gibi standart C fonksiyonlarına erişim sağlar.

3 FFI parçaları

Kavram Anlamı
DynamicLibrary C kütüphanesini yükler
lookupFunction C fonksiyonunu sarmalar
Double FFI double tipi
typedef Fonksiyon imza adı

Uzman seviye bölümündeki tüm dersler