Karma C/C + + Kodlama



Benzer belgeler
C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

BİL-142 Bilgisayar Programlama II

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

C++ Dersi: Nesne Tabanlı Programlama

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

Fall Object-Oriented Programming Laboratory 03

#ifndef COMPLEX_H #define COMPLEX_H

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Linux Assembly Programlamaya Giriş

1 PROGRAMLAMAYA GİRİŞ

Temel Bilgisayar Programlama

Nesneye Yönelmek. veya sadece formülleri bilgisayarın anlayacağı dile çevirmeyi bilen birinin C++ kullanma yöntemleri. Gökhan Ünel

Fall Object-Oriented Programming Laboratory 02 - Structures

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

Erişim konusunda iki taraf vardır:

C++ Dersi: Nesne Tabanlı Programlama

#ifndef VEKTOR_H #define VEKTOR_H. struct vektor_s { double x; double y; double z; }; typedef struct vektor_s vektor_t;

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

İÇERİK 2 Java Kodlaması için Gerekli Programlar JRE, JDK kurulması ve Başlangıç Ayarları Java Kodlamayı Kolaylaştıran IDE ler Java Kod Yapısı İlk Java

Python Programlama Dili

int printf (const char *format [, argument,...]);

Fonksiyonlar -Genel Test- A

NESNEYE YÖNELİK PROGRAMLAMA

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

public static int Toplam int x, int y

BİLG Dr. Mustafa T. Babagil 1

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Program Nedir? Program, bir problemin çözümü için herhangi bir programlama dilinin kuralları ile oluşturulmuş komut kümesidir.

C++ Dersi: Nesne Tabanlı Programlama

10/17/2007 Nesneye Yonelik Programlama 3.1

Veri Yapıları Lab Notları 1

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

C# Metotlar ve Metot Tanımlama

NESNEYE YÖNELİK PROGRAMLAMA

BMT 101 Algoritma ve Programlama I 5. Hafta. Yük. Müh. Köksal Gündoğdu 1

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

NESNE MODELLERİ : SINIFLAR

#ifndef FATURA_H #define FATURA_H

Binary Tree nedir?uygulamas nasl yaplr?

Jval tipi. Genel veri yapılarını kullanacağımız zaman Jval den faydalanırız.önemli olanlar aşağıda mevcuttur:

C PROGRAMLAMA D İ L İ

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

İl İlçe uygulaması. : Seçilen ile ait ilçeleri listeleyen program. //İl değişkeni için kodu aşağıdaki sayfadan kopyalayınız.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BTEP243 Ders 3. class Yazım Kuralı:

Nesne Tabanlı Programlama Dersi Edirne Kız Teknik ve Meslek Lisesi

Ad Soyad: İmza: Object-Oriented Programming Quiz 4 60dk. Kapalı kitap. Kapalı defter. Kapalı cep telefonu. Hesap makinesi yok.

HSancak Nesne Tabanlı Programlama I Ders Notları

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

Adı Soyadı Öğrenci No. Toplam (100p) 2 (10p) +10p. 5 (25p) +10p. 3 (20p) 4 (25p) 1 (20p)

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

PROGRAMLAMA TEMELLER. C Program Yap s

C++ Dersi: Nesne Tabanlı Programlama

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

NESNEYE YÖNELİK PROGRAMLAMA

SAKARYA ÜNİVERSİTESİ BİLGİSAYAR VE BİLİŞİM BİLİMLERİ FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ GÜZ DÖNEMİ PROGRAMLAMAYA GİRİŞ DERSİ

Ders 8: Metotlar. barisgokce.com

scanf () Fonksiyonu Klavyeden veri okumak için kullanılır. Yapı olarak printf () fonksiyonu aynıdır. Kullanım biçimi:

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

B05.11 Faaliyet Alanı

Bölüm 2 - C ile Programlamaya Giriş

BLM 111 ALGORİTMA VE PROGRAMLAMA I

MAK 1005 Bilgisayar Programlamaya Giriş C DİLİNE GİRİŞ. Prof. Dr. Necmettin Kaya

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

ELN1001 BİLGİSAYAR PROGRAMLAMA I

BLM 112- Programlama Dilleri II. Hafta 2 C Programlarının Bellek Düzeni ve Rekürsif (Özyinelemeli) Fonksiyonlar

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

Operatörlere Yeni İşlevler Yüklenmesi (Operator Overloading)

B02.8 Bölüm Değerlendirmeleri ve Özet

Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri hafta -

ALGORİTMA VE PROGRAMLAMA II

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

ÖĞRENME FAALĠYETĠ GELĠġMĠġ ÖZELLĠKLER

işlemler bittikten sonra dosyaların kapatılması uygun olacaktır. Bunun için, fclose(fin);

11- FONKSİYONLAR (FUNCTIONS)

ALGORİTMA VE PROGRAMLAMA II

Lambda İfadeleri (Lambda Expressions)

C++ ile Nesneye Dayalı Programlama

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

1. Mesaj Tipi ve Mesaj Fonksiyonu Bazında Bildirim Mail Adresi Tanımlama Đşlemleri

BLM 111 Algoritma ve Programlama I Güz 2018

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

19 Şubat 2016 Cuma

Nesne İşaretçileri. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. Sınıf Yapısı. Kalıtım Çok Şekillilik

Dr. Fatih AY Tel: fatihay@fatihay.net

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Örnek1: #include <iostream> #include <string> using namespace std;

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

SAKARYA ÜNİVERSİTESİ BİLGİSAYAR VE BİLİŞİM BİLİMLERİ FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ GÜZ DÖNEMİ PROGRAMLAMAYA GİRİŞ DERSİ

C/C++ DERS KONULARI. Kaynaklar 1. C Programlama dili, Kemal Yarcı 2. C/C++, Gürcan Banger 3. C ve Siz, Fatih Ekici

C++ Dersi: Nesne Tabanlı Programlama

Transkript:

Karma C/C+ + Kodlama

/********************************************************** * Bâkır EMRE * emre ~ enderunix.org * EnderUNIX Yazılım Gelistirme Takım ı * http:/ /www.enderunix.org * * Sürüm : 1.0 * Tarih : 26.06.2006 * Makalenin en yeni versiyonun u * www.enderunix.org/docs /ccplusplusmixedcode.pdf * adresin d en elde edilebilir. ********************************************************/ Giriş... 3 C Koduna C++ Kaynak Dosyasından Eriş im...3 Bağlant ı Belirtiminin Tanı mlama sı...3 C Başlık Dosyaları nı n C+ + kodu içerisine dahil edilmesi...4 Karma Başlık Dosyas ı Oluş tur m a...5 C+ + kodu n a C kaynak dosyası n d a n eriş im...6 Referanslar...11

Giriş C+ + progra mla m a dili linkage specification diye adlandı rı lan farkl ı derleyiciler ile derlenen ve farkl ı dillerde yazılan kodu ayn ı program içerisinde yazmaya imkan tanı yan bir mekaniz m aya sahiptir. Linkage specification farkl ı dillerde yazı lan fonksiyonlar ı veya procedur e leri baglamaya yarayan bi protokol olarak düşünülebilir. Linkage (bağlant ı) terimi C+ + standar tları nda nesnelerin ayn ı ya da farkl ı dosyalarda n erişibilmesi anlamı na gelir. üç tip olarak karşı mı za çıkar No linkage Internal linkage External linkage Internal linkage (dahili bağlant ı ) de fonksiyonu n paramete rlerine ve değişkenlerine bağl ı olarak kod içerisinde eriş ilebilirken, No Linkage de sadece fonksiyon içerisinden erişilebilir. External Linkage (Harici bağlantıda) aşağıda örneklerini görebileceğimiz. ş ekilde gerçekleşir. mesela C koduna C+ + kullanarak eriş mek istersek : C Koduna C+ + Kaynak Dosyasından Erişim Yukarı da C+ + dilinin bağlant ı tanı mlam as ı linkage soecification ile desteklenen bir dil ile oluş tur ulacak program içerisine bagland ığı bir fonksiyon veya nesne tanı mlam ası n ı yapmay ı sağladığı n ı söylemiş tik. Ayrıca derleyicilerin de bu özelliğ i destekle mesi gerektiğide göz önünde bulund u r ul m alı r. Tüm C+ + derleyicileri C bağlantısın ı desteklemektedir. GNU Compiler Collection HP ac++ Sun Studio C+ + compiler IBM XL C/C+ + Compiler bunlar d a n bi kaçı dı r ve baz ı C derleyicleride bu özelliği desteklemek te dir. C bağlantı s ı ile derlen mi ş bir fonksiyona eriş mek istediğiniz zama n C baglantı lı fonsiyon u tanı mlama sı n ı yapı n. Birçok c+ + derleyicisinin C ve C+ + nesnelerine kars ı farkl ı bağlantı ları nı n olma ma sı na karsı n siz C+ + kodu içerisinde C bağlantıs ı yapacağınız verileri tanımlayın. Bağlant ı Belirtiminin Tanımlaması Aşağıdaki yapılardan birini kullanarak nesne ya da fonksiyonu n dil bağlantı sı nı gerçekleştirebiliriz.

extern "Kullanı lacak_dilin_adi" bildirim ; extern "Kullanı lacak_dilin_adi" bildirim ; bildirim ;... İlk gösterim tanım ya da bildirimi Kullanılacak dilin adına göre tanı mlarken ikincisinde parante z içerisindeki her şeyin kullanılacak dile bağlanacağı n ı gösteriri Burada dikkat etmeniz gereken nokta parante z d e n sonra noktal ı virgülün kullanılmay ışı Bağlant ı tanımlamalar ı iç- içe kullanabilirsiniz. Fakat bu yap ı burada scope oluşturmamaktadır. extern "C" void f(); // C bağlantısı extern "C++" void g(); // C++ bağlantısı extern "C" void h(); // C bağlantısı void g2(); // C++ bağlantısı extern "C++" void k();// C++ bağlantısı void m(); // C bağlantısı Yukarıdaki fonksiyonların hepsi iç içe kullanılmasına karşın ayn ı global scope a sahiptir. C Başlık Dosyalarının C+ + kodu içerisine dahil edilmesi Eğer C derleyicileri için tasarlan m ış kendi hazı rladığı nı z başlıklar ı C kütü p h a n elerini ile beraber kullan ma k isterseni z. Başlığını z ı extern C parante zleri içersinde yazabilirsiniz. extern "C" #include "baslik.h" Dikkat- Bu tekniği sistem başlık dosyalar ı ile kullanmayınız!.

Karma Başlık Dosyas ı Oluşturma C ve C+ + derleyicileri için uygun bir başlı k dosyas ı hazı rlamak isterseni z bütü n belirtimleri extern C içerisine yazı nı z. Fakat bütün C derleyicileri Bu sözdizi mini tanı mayabilir. Bütün C+ + derleyicileri cplusplus makros u n u önceden tanı mlan mı s tı r bu makroyu kullanarak c+ + sözdizi mini koruyabilirsiniz. #ifdef cplusplus extern "C" #endif... /* başlık kısm ı*/ #ifdef cplusplus /* extern "C" kapatılmas ı */ #endif C+ + Sınıflarına C den erişim C++ sınıflarına C kodundan nasıl erişebiliriz. Şöyle yaparsak C ++ sınıfın ı C struct yapı sı nda tanı mlars anı z ve bunu ve bir ş ekilde bunu üye fonksiyon u çağırabiliriz Şu şekilde bir sınıfımızın olduğunu ele alalım class HerHangi public: virtual int digeri(int); //... private: int i, j; ; Bu HerHangi Sınıfın ı C kodu içerisinde tanımlayamazsınız. En iyi yapacağınız ş ey Herhangi Sınıfı nı n nesnelerine işaretçilerle ulaş mak. Simdi C+ + kodun d a extern "C" yazarak içersine HerHangi sınıfına ve nesnelerine ulaşabileceğ iniz bir fonksiyon yazarsak. Diğer üye fonksiyonu n a erişebileceğimiz. Kod aşağı daki gibidir. extern "C" int fonk_herhangi_digeri(herhangi* h, int i) return h->digeri(i); Aşağıda ise HerHangi sınıfın ı kullanan bir C kodu bulunmaktadır

struct HerHangi; int fonk_herhangi_digeri(struct HerHangi*, int); int f(struct HerHangi* p, int j) return fonk_herhangi_digeri(p, j); C+ + koduna C kaynak dosyasından erişim Eğer C+ + fonksiyonu n u C bağlantı s ı tanı mlarsa nı z C derleyicisi tarafı nda n derlen mi ş fonksiyon ile çağırabilirsiniz. C bağlantı s ı ile tanı mlan m ış bu fonksiyon C+ + ın bütün özelliklerini taşır, fakat C dosyas ı içersinde n çağı rmak isterseniz. parametler ve dönü ş tipleri C tarafından ulaşılabilir olmalıdır mesela Burada C+ + fonksiyonu n C bağlantı s ı ile görebilirsiniz. #include <iostream> extern "C" int print(int i, double d) std::cout << "i = " << i << ", d = " << d; print fonksiyonu n u n başlık dosyası n ı C ve C+ + kodu tarafı nda paylaş acak ş ekilde aşağıdaki gibi yazabilirsiniz #ifdef cplusplus extern "C" #endif int print(int i, double d); Simdi bir kaç örnek üzerinde konuyu anlatırsak daha anlaşılır olacak Örnekler Önce Merhaba Dünya yazan bir C+ + fonksiyonu yazalı m

// MerhabaYaz.cpp #include <iostream> extern C void MerhabaDunyaYaz(); void MerhabaDunyaYaz() std::out << Merhaba Dünya! ; Daha sonra bu fonksiyonu kullanan bir başka C fonksiyonu // MerhabaGoster.c void MerhabaDunyaYaz(); void MerhabaDunyaGoster() MerhabaDunyaYaz(); Ve en sonu n d a ise bu C bağlantı l ı C+ + fonksiyon u çalıştı ran bir ana progra mı yazarsak // anaprogram.cpp extern C void MerhabaDunyaGoster(); int main() MerhabaDunyaGoster(); return 0; Simdi ise geriye bu yazı lan C ve C+ + dosyaları n ı derlemeye geldi g++ -c omerhabayaz.o MerhabaYaz.cpp gcc -c omerhabagoster.o MerhabaGoster.c g++ -c oanaprogram.o anaprogram.cpp g++ anaprogram.o MerhabaGoster.o MerhabaYaz.o simdi burad a yapı lan olay sırası nca C+ + ve C dosyaları n ı kendi derleyicileri ile derlemek ve derleme sonucu oluş an object dosyaları n ı kullanarak ana progra mı çalıştırılabilir dosya haline getirme.buradaki parametrelere gelince - c para met re si kaynak dosyay ı derler fakat link (bağlama işlemini yapma z) - o parame tr e si ise derleme sonucu ortaya çıkacak dosyanı n ad ı için kullanı lı r Şimdi C++ kodu icerisinde bir nesne olusturup buna ilkdegerini atayalim

//cpp dosyasi.cpp #include <iostream.h> typedef class nesne* nesne_isaretcisi; extern "C" void nesneyi_ilklendir (nesne_isaretcisi& p); extern "C" void nesneyi_sil(nesne_isaretcisi p); extern "C" void nesneyi_yaz(nesne_isaretcisi p); struct nesne private: int x; public: nesne() x = 12; friend void nesneyi_yaz(nesne_isaretcisi p); ; void nesneyi_ilklendir(nesne_isaretcisi& p) p = new nesne; void nesneyi_sil(nesne_isaretcisi p) delete p; void nesneyi_yaz(nesne_isaretcisi p) cout << "nesnenin degeri->x " << p->x << "\n"; Şimdide C dosyasın ı yazalım. Bunda ise bu ilgili fonksiyonlar ı çağırı p nesneyi oluş turu p, ekrana yazı p ve silelim. //cdosyasi.c typedef struct nesne* nesne_isaretcisi; int main () nesne_isaretcisi f; nesneyi_ilklendir(&f); nesneyi_yaz(f); nesneyi_sil(f); kodu derlersek

cc -c cdosyas ı.c cc -c cplusplusdosyasi.cpp g++ -o calistirilabilir cplusplusdosyasi.o cdosyasi.o ve cıktısı nesnenin degeri->x 12 Bir örnek daha gösterelim önce c dosyasın ı yazalım int ikiyekatla(int i) return 2*i; Fonksiyona gelen degerin 2 katın ı alan bi fonksiyon extern "C" f(int i); class BenimSinifim public : int cfonsiyonunutetikle(int i) return ikiyekatla(i); ; int main() BenimSinifim oylesine; std::cout << "fonksiyonu dogrudan cagirinca degeri: " << ikiyekatla(5) << " BenimSinifim sınıf ı icerisinden cagirinca degeri: " << oylesine.cfonksiyonunutetikle(5) << std::endl;

Son örnekte ise yazılan fonksiyonu paylaşı ml ı kütüp ha n e yapı p kodu derlerken bu kütüphaneyi kullanarak çalıştıralım. Baslık dosyası //baslik.h extern char *MerhabaDunya(); C kodu //MerhabaDunyaYaz.c #include "baslik.h" char *MerhabaDunya() return ((char *) "Merhaba Dunya"); Ve C++ kodu //anaprogram.cpp #include <iostream.h> #include "baslik.h" int main() char *giris = MerhabaDunya(); cout << giris << "\n"; return (0); Yine bu dosyalar ı derlersek cc -shared -o libmerhaba.so MerhabaYaz.c %CC -lmerhaba anaprogram.cpp %./a.out Merhaba Dunya Burada yapılan olay kısaca MerhabaYaz.c dosyası nda n bi adet shared object oluş tur m a k (libmerh ab a.so) ve anaprogra m.cp p derlerken bu kütü p h a n eyi (merhaba kütüp h a ne sini) kullanarak derleme. Eğer derleme sırasında /usr /libexec / elf /ld : cannot find lmerhaba gibi bi hata alıyorsanı z ya l parametersinden sonra oluşan paylaşıml ı kütüphane dosyasının tam yolunu yazı n yada bu kütüphane dosyasın ı kütüphane dizinine kopyalayın

g++ -l/home/emre/mixedcode/merhaba anaprogram.cpp yada cp libmerhaba.so /usr/local/lib/ sonra derleyin g++ -lmerhaba anaprogram.cpp Referanslar http:/ / m s d n 2.microsoft.com /en - us/library/0603949d.aspx http:/ / d evelopers.sun.com / p r odtech /cc / a rticles / mixing.html http:/ / d evelopers.sun.com / s olaris / articles /external_linkage.html http:/ / d ocs.hp.com / e n / 2 159 / o t herlangs.htm http:/ / p u blib.boulder.ibm.com /infocenter /lnxpcom p / v8v101 /index.jsp?topic= /c om.ibm.xlcpp8l.doc/language /ref /cplr020.htm