You are on page 1of 90

PICPROJE EKB EVR GRUBU

www.picproje.org

TEEKKRLER..

Bu kitap PICPROJE Ekibi tarafndan eitime katk amacyla


yaplmtr.
Emei geen arkadalarmz.. (Alfabetik)
Grup Moderatr

CokuN
Bunalmis
CaFFeiNe
Gsever
Kurumahmut
Macera
Microcozmoz
Otm
Oyhan
Petek
Picusta
Respected
SpeedyX
Timpati
Ziya

www.picproje.org
TRKYENN ELEKTRONK PLATFORMU

PICPROJE EKB EVR GRUBU

www.picproje.org

indekiler
nsz
Tarihe
Neden C?
PC ye kar PICmicro MCU tabanl program gelitirme
rn gelitirme
Terminoloji
Kodu deneme ve test etme
C kodlama standartlar
Temeller

C Temelleri
C programlarnn yaps
Bir C programnn bileenleri
#pragma
main()
#include
printf Fonksiyonu
Deikenler
Sabitler
Yorumlar
Fonksiyonlar
C komutlar

Deikenler
Veri Tipleri
Deiken Bildirimleri
Deiken Atamalar
Sralama
typedef
Tip Dnmleri

Fonksiyonlar
Fonksiyonlar
Fonksiyon Prototipleri
Fonksiyon Argmanlarnn Kullanm
Fonksiyonlardan Deer Dndrme
Klasik ve Modern Fonksiyon Bildirimleri

Operatrler
Aritmetik
likisel
Mantksal
Bit Operatrleri
Arttrma ve Azaltma
Operatr ncelikleri

PICPROJE EKB EVR GRUBU

www.picproje.org

Program Kontrol fadeleri


if
if-else
?
for dngs
while dngs
do-while dngs
Program Kontrol fadelerinin ie Kullanm
Break
Continue
Null
Return

Diziler / Katarlar
Tek Boyutlu Diziler
Katarlar
ok Boyutlu Diziler
ndeerli Diziler
Katar Dizileri

aretiler
areti Temelleri
aretiler ve Diziler
Fonksiyonlara Geen aretiler

Yaplar / Birleimler
Yap Temelleri
Yap aretileri
ie Yaplar
Birleim Temelleri
Birleim aretileri

PICmicro MCUe zg C
Giriler ve klar
C ve Assembly Birlikte Kullanm
Gelimi BIT leme
Zamanlayclar
A/D evrim
Veri letiimi
IC letiimi
SPI letiimi
PWM
LCD Srme
Kesmeler
Ktphaneler

PICPROJE EKB EVR GRUBU

www.picproje.org

nsz
Neden C?
C dili Dennis Ritchie ve Brian Kernighan tarafndan 1970li yllarn balarnda
Bell laboratuarlarnda gelitirilmitir. lk uygulama platformlarndan biri UNIX
ortamnda alan bir PDP-11 olmutur. Tantmndan bu yana, kendini
kantlam bir uygulama gelitirme dili olarak bilgi ilem endstrisinin bandan
sonuna dek evrim geirmitir ve standartlatrlmaktadr. PC, C++ ve dier ANSI
standardndaki versiyonlar iin dk maliyetli bir gelitirme ortam olmutur.
C, programlarn bir bilgisayardan baka bir bilgisayara minimum deiiklik
yaplarak aktarlabilmesi iin tanabilir bir dil olarak tasarlanmtr. PCler ve
anabilgisayarlar ile alrken bu ok iyi bir zelliktir. Fakat mikrokontrolrler ve
mikroilemciler farkl trlerdir. Ana program ak deimeden kalacaktr ama
eitli ayarlar ve port/evresel kontroller mikroilemciye zgdr. Buna rnek
olarak PICmicro MCU iin port yn yazmalarn verebiliriz, 1=Giri 0=k iken
H8 mikrokontrolrler iin 0=Giri 1=k belirtir.
reticilerin daha fazla program ve RAM hafzalar ile yksek iletim hzlar
sunmas C dilinin mikrodenetleyici uygulamalarnda kullanlmasna sebep
olmutur.
Bana aktarlan bir rnek hibir eye inanmayan biri olarak uydu: bir
zamanlayc fonksiyonunu assemblyde iki haftada C de ise birgnden ksa bir
srede yazabilirsiniz. Yani hemen koup bir C derleyicisi almam m
sylyorsunuz assemblyde yazmaktan niye sklaymki? Daha ksa kod retiyor
assemlyde yazlm bir program C de yazlm bir programa gre ortalama
%20 daha az yer kaplyor. Program hafzas yksek modellerde iyi fakat dk
modellerde pek randmanl deil.

PICPROJE EKB EVR GRUBU

www.picproje.org

PC ye kar PICmicro MCU tabanl program gelitirme


Mhendisler temel donanmnn (klavye, ilemci, hafza, G/, yazc ve ekran
gibi) hazr olmasndan dolay PC tabanl birimlerle rn gelitirmeye
balamlardr. rn gelitirme yazlm hazrlamaktan ve hatalarn gidermekten
oluuyordu.
PIC tabanl rn gelitirmek, MCUnun d dnya ile iletiiminin giri k
donanmlar eklinde oluturulmasyla balar. Bir PC programcs Merhaba
Dnya yazan bir program derleyip altrdnda ekranda mesaj hemen
grr. PIC programcs mesaj grebilmek iin RS232 arabirimini yapmak, PIC
ierisinde iletiim portunu ayarlamak ve gelitirme kartn PC zerindeki iletiim
portuna balamak zorundadr.
Bu kadar zahmete gerek varm? dediinizi duyar gibiyim. Eer tm PC yi
(monitr ve klavye ile birlikte) 40 bacakl bir entegre klfnda edinebilseydik
onu kullanrdk: bu gnk imkanlarla henz buna sahip deiliz. Bunun iin
dk maliyet ve tanabilir uygulamalar iin PIC veya benzeri
mikrodenetleyiciler kullanmaya devam edeceiz.
PIC tabanl sistemler iin gelitirme aralar grafik ktphaneler haricinde PC
tabanl sistemlerdeki gibi gelitiriciye baz temel kolaylatrc seenekler sunar.

rn gelitirme
rn gelitirme tecrbe ve ansn birleimidir. Baz ok kk program
paralar uzun gelitirme srelerine malolur fakat rnn mkemmelliinde
byk pay sahibidirler.
Bir rn gelitirmek iin unlara ihtiya vardr: zaman huzur ve sessizlik
mantksal dnce ve en nemlisi ihtiyalarn tam olarak anlalmasdr.
Bana gre gelitirmeye balamak iin en kolay yol fikirlerle beraber birka
sayfa temiz kattr.
e mmkn olan zmleri iziktirmekle balayn ve en basit, en gvenilir
seenei bulmak iin herbirini dikkatle gzden geirin. Bu aamada dier
fikirleri pe atmayn ilerinde gzel dnceler olabilir.
Ak diyagram, blok diyagram, G/ balantlarn izin.
Tm G/ pinleri ile prototip kartnz oluturun. Kartnz G/ pinleri
deitirilebilecek ekilde dizayn etmeniz kullanl olacaktr.
Programnz test edilebilir bloklar eklinde yazmaya balayn ve yava
yava byterek programnz oluturun. Bu sizi 2000 satrlk bir program tek
seferde hatalardan arndrmaktan kurtarr!

PICPROJE EKB EVR GRUBU

www.picproje.org

Eer ilk projenizse O ZAMAN BAST TUTUN devasa bir uygulamadan nce
komutlara almak, assembly tekniklerini ve hata ayklamay renmek iin bir
LED i butonlarla yakp sndrme gibi basit uygulamalar yapn.
Programnz basit admlarla test ederek oluturun. Ak diyagramnz elden
geirerek gncel kalmasn salayn.

Fikir
Bir fikir belki EVREKA! tarznda sizden kabilir veya baka birinin bir ihtiyac
olarakta doabilir.
Tasarm ilemine balamadan nce gerekli olan temel terminoloji
anlalmaldr. Bu durumda PICmicro MCU tabanl tasarm yapmaya
balamadan nce PIC dili (komut seti, terimler ve gelitirme kiti) tam olarak
anlalmaldr.
imdi genel terimlerle, PICler hakkndaki gereklerle ve mikroilemci ile
mikrodenetleyici sistemler arasndaki farklarla balyoruz.

Terminoloji
Kullanlan baz temel terimler
Mikrodenetleyici bir yazlm olmadan hibir i yapmayan plastik, metal ve kum
ynndan baka birey deildir. Yazlm ile kontrol edildiinde snrsz bir
uygulama alan vardr.
G/ d dnya ile iletiime geen MCU bacadr. Giri veya k olarak
ayarlanabilir. ou durumda G/ birimleri mikrodenetleyicinin iletiim, kontrol
ve bilgi almasna imkan verirler.
Yazlm mikrodenetleyicinin ilem yapmas ve almas iin gerekli olan bilgidir.
Baarl bir uygulama veya rn iin hatalardan arndrlm olmas gerekir.
Yazlm deiik dillerle yazlabilir C, pascal, basic veya assembly gibi (binary
kodlardan oluan makine dilinin bir st)
Donanm mikrodenetleyici, hafza, arabirim bileenleri, g kayna, sinyal
artlandrma devreleri ile sistemin almasn ve d dnya ile iletiimini
salayan bileenlerden oluur.
Baka bir bak asyla (zellikle almadnda) donanm frlatp atabilirsiniz.

Simlatr MPLAB gelitirme ortam mikrodenetleyicinin dahili ilemlerine


eriebilmeyi salayan kendi simlatrne sahiptir. Olaylarn ne zaman
meydana geleceinin biliyorsanz bu tasarmnz test etmeniz iin iyi bir yoldur.

PICPROJE EKB EVR GRUBU

www.picproje.org

In Circuit Emlatr PC ile mikrodenetleyicinin takld sokete balanan ok


kullanl bir ekipmandr. Yazlmn PC zerinde altrlmasn fakat devre
kartnda mikrodenetleyici tarafndan altrlyor gibi grnmesini salar. ICE
program adm adm altrabilmenizi ve mikrodenetleyici ksmnda neler
olduunu d dnya ile nasl iletiime getiini izlemenizi salar.
Programlayc program mikrodenetleyici hafzasna yklemeye yarayan ve
ICE yardm olmadan alabilmesini salayan nitedir. Deiik ekillerde,
boyutlarda ve fiyatlarda olabilir. Microchip in PICSTART PLUS ve PROMATE II
modelleri seri porta balanr.
Kaynak dosyas anlayabileceiniz ekilde assembly dili ile yazlm programdr.
Kaynak dosyasnn mikrodenetleyicinin anlamas iin ilemden geirilmesi
gerekir.
Assembler / Derleyici kaynak dosyasn obje dosyasna eviren yazlm
paketidir. Hata kontrol zellii vardr ve assembly ilemi esnasnda oluan
hatalar bildirir. MPASM Microchip in tm PIC leri destekleyen en son
assembler yazlmdr.
Obje dosyas Assembler / Derleyici tarafndan retilen ve programlayc,
simlatr yada ICE nin anlayabilecei formdaki dosyadr. Dosya uzants
assembler direktifine bal olarak .OBJ veya .HEX olabilir.
Liste dosyas Assembler / Derleyici tarafndan retilen kaynak dosyasndaki
tm komutlar bunlarn hexadesimal karlklarn ve yazdnz aklamalar
ieren dosyadr. Dosya uzants .LST dir.
Dier dosyalar .ERR uzantl dosyalar hatalar ieren hata dosyalardr. .COD
dosyalar emlatr tarafndan kullanlr.
Hatalar sizin tarafnzdan yaplan yanllardr. Basit yazm hatalarndan
programlama dilinin yanl kullanmna kadar eitli sebepleri vardr. Byk bir
ounluu derleyici tarafndan yakalanr ve .LST dosyasnda gsterilir.
Mikroilemci bir mikroilemci veya dijital bilgisayar temel birimden oluur.
MB (CPU), G/ ve hafza ile dier destek devreleri

PICPROJE EKB EVR GRUBU

www.picproje.org

TPK BR MKROLEMC SSTEM


Giri/k (G/) d dnya ile iletiimi salayan dijital, analog ve zel
fonksiyonlardan oluan birimdir.
Merkezi ilem birimi (MB) hesaplama ve veri ileme ilemlerini yapan 4, 8 yada
16 bit veri formatlar ile alabilen ve sistemin kalbi saylan birimdir.
Hafza RAM, ROM, EPROM, EEPROM veya bunlarn bir kombinasyonu eklinde
olabilir ve program ve verileri depolamaya yarar.
Osilatr mikroilemcinin alabilmesi iin gerekli saat frekansn salar. Osilatr
deiik bileenlerle oluturulabilir veya hazr modl olarak elde edilebilir.
Mikroilemci ile balantl dier devreler watchdog zamanlaycs sistemin
kitlenmesini nler , adres ve veri yollar iin tampon devreleridir ayn yol
zerinde birden ok ipin birbirine zarar vermeden alabilmesini salar.
Mikroilemci denildiinde esas olarak MB den bahsedildii anlalr. G/ ve
hafza ayr iplerden oluur ve dzgn bir ekilde alabilmek iin adres ve
veriyollar ile adres zme devrelerine ihtiya duyarlar.
Mikrodenetleyiciler
PICmicro MCU ve dier mikrodenetleyiciler tek ip ierisinde MB (CPU),
hafza, osilatr, watchdog ve G/ birimlerini barndrrlar. Bunun sonucunda

PICPROJE EKB EVR GRUBU

www.picproje.org

yerden tasarruf, tasarm zamannn azalmas ve harici birimlerle ilgili uyumluluk


sorunlarnn azalmas salanr fakat baz durumlarda sabit hafza boyutu ve
snrl G/ kapasitesi nedeniyle tasarmn snrlarn daraltr.
PIC mikrodenetleyici ailesi gelitiricilere en ok ihtiya duyacaklar geni bir
aralkta G/, hafza ve zel fonksiyonlar sunar.
Neden PIC kullanrz
Kod verimlilii PIC Harvard mimarisini esas alan 8 bit bir mikrodenetleyicidir.
bunun anlam ierisinde hafza ve veri iin farkl yollar bulunur. Program ve veri
hafzasna ayn anda eriebildiinden dolay hz yksektir. Geleneksel
mikrodenetleyicilerde program ve veri hafzas ayn veriyolunu kullanr. Bu
PICmicro ile karlatrldnda hz en az 2 kat drr.
Emniyet tm komutlar 12 veya 14bit geniliindeki program hafzasna sar. Bu
yzden programn VER blgesine atlayp VER yi program komutlar gibi
altrmas gibi bir ihtimal yoktur. Bu Harvard mimarisinde olmayan 8bit
program adres yollar kullanan mikrodenetleyicilerde oluabilir.
Komut seti 16C5X ailesi ve 14bit genilikteki 16CXX ailesi iin program
yazabilmek iin renmeniz gereken sadece 33 komut vardr. CALL, GOTO ve
bit test amal komutlar haricindeki (BTFSS, INCFSZ vs.) komutlar tek komut
admnda iletilirler.
Hz PIC osilatr ile dahili saat yolu arasnda 4e blc bir devre ierir. Bu
zellikle 4Mhz kristal kullanldnda komut zamannn hesaplanmasn
kolaylatrr. Bu durumda her bir komut adm (evrimi) 1uS (yani 1s) tutar. PIC
20Mhz gibi bir kristal kullanldnda saniyede 5 milyon komut iletebilen
olduka hzl bir ilemcidir. hemen hemen 386SX33n iki kat!
Statik iletim PIC tamamen statik bir mikrodenetleyicidir; dier bir deyile saat
frekansn durdurursanz tm yazma ierikleri olduu gibi kalr. Pratikte tam
olarak bunu yapmazsnz, PICi uyku moduna geirirsiniz bu saat frekansn
durdurur ve PIC in uyku modundan nce hangi durumda olduunu
bilebilmesi iin baz bayraklar ayarlar. Uyku modunda iken PIC 1uAden az
akm eker.
k srme yetenei PIC yksek k srme kapasitesine sahiptir ve LED triyak
vs. direk srebilir. Herhangi bir G/ pininden 25mA kadar veya tm ipten
100mA-200mA akm ekilebilir.
Seenekler neredeyse tm ihtiyalarnza cevap verebilecek ekilde hz,
scaklk, klf, G/ hatlar, zamanlayc fonksiyonlar, A/D ve hafza seenekleri
mevcuttur.

PICPROJE EKB EVR GRUBU

www.picproje.org

ok ynllk PIC yksek adetlerde dk maliyetli ve ok ynl bir


mikrodenetleyicidir. zellikle yerin nemli olduu uygulamalarda birka
mantk kapsnn yerine bile kullanlabilir.

PIC16F84A (14BIT) BLOK DYAGRAMI


Gvenlik PICmicro MCU endstrideki en gvenli kod koruma zelliklerinden
birine sahiptir. Koruma biti birkez programlandnda program hafzas
okunamaz.
Gelitirme PIC gelitirme iin pencereli veya FLASH yapda, retim iin ise OTP
(birkez programlanabilir) yapda bulunabilir. Gelitirme aralar ev kullanclar
iin kolayca ve uygun fiyatl olarak temin edilebilir.

PICPROJE EKB EVR GRUBU

10

www.picproje.org

Kodu deneme ve test etme


Cyi kavramak iin balang masraflar olarak C derleyicisi, in circuit emlatr
ve gerekli donanm edinmek projenin deerlendirme safhasnda insann
gzn korkutabilir. C derleyicisi diskte verilir ve internetten salanabilir.

C kodlama standartlar
Program yazmak ev ina etmeye benzer temel salam ise iler iyi gider.
Aadaki neriler C++ standartlar dokmanndan alnm ve PICe adapte
edilmitir.
simler fonksiyonlarna uygun olmasn salayn
simler programlamann kalbidir ve programda kullanl amac ile yerine
getirdii ileve uygun olarak verilmelidir. Okunabilirlii arttrmak iin byk
kk harfleri birlikte kullanabilirsiniz.
HataKontrol, HATAKONTROL den daha kolay okunur.
Yine okunabilirlii arttrmak iin n ek olarak bir kk harf kullanlabilir.
g
r
s

Global
Referans
Statik

gLog;
rStatus();
sValueIn;

Parantezler { }
Parantezler geleneksel UNIX yntemiyle;
if(koul){

}
veya kolay okunan u yntemle kullanlabilir
if(koul)
{

}
Kenar boluklar
Kenar boluklar kullanarak yazlar ieriden balatmak programn
okunabilirliini arttrmak iin gereklidir.
Satr uzunluu
Monitr ve yazc uyumluluu iin satr uzunluunun 78 karakteri gememesine
dikkat edin.

PICPROJE EKB EVR GRUBU

11

www.picproje.org

Else If format
Herhangi bir koulu yakalamak iin koyacanz ekstra Else ifadesi nceki if ler
tarafndan kapsanmaz.
if(koul)
{
}
else if(koul)
{
}
else
{
/* yukardakiler tarafndan kapsanmaz */
}
Koul format
Derleyici izin veriyorsa sabit deerleri eitlik/eitsizlik karlatrmalarnda sol
tarafa yazn. = iaretinin biri unutulursa derleyici hata bildirir. Ayrca deer gze
batan yerde olmu olur.
if(6 == HataNo)
Deikenlere balang deeri verin
Rastgele deer iermemesi iin tm deikenlere nceden deer verin.
int a=6, b=0;
Yorumlar
yorumlar hikayenin br yarsdr. Programnzn bugn nasl altn
biliyorsunuz peki iki hafta veya iki yl sonra hatrlayabilecek misiniz? Programnz
baka biri incelese neler olduunu anlayabilecek mi? leriki almalarnz
kolaylatrmak, hatalar bulabilmek ve ileride rnnz gelitirebilmek iin
yorumlar kullann.

Temeller
Btn bilgisayar programlar bir balang noktasna sahiptir. Bu balang
noktas mikrodenetleyicilerde reset vektrdr. 14bit PIC16CXX ailesinin reset
vektr 00h, 12bit PIC16C5X ve 12C50X ailesinin reset vektr ise hafzann en
yksek adresidir. 1FFh, 3FFh, 7FFh
Biti noktas eer program sadece bir kez alacaksa (rnein iletiim iin hz
ayarlayan bir rutin gibi) programn durduu yerdir. Trafik k kontrol gibi dier
programlar srekli balang noktasna dnerler.
Yksek seviyeli dillerde en yaygn olarak kullanlan ilk programlama rnei
ekrana Merhaba Dnya yazdrmaktr.

PICPROJE EKB EVR GRUBU

12

www.picproje.org

PC ile C kullandnzda, akas ekran, klavye ve ilemcinin tm birbirine


baldr. Yapmanz gereken programlarla programlar ve evrebirimlerini
birbirine balamaktr. PICmicro MCU veya dier mikroilemci/mikrodenetleyici
sistemleri iin program gelitirdiiniz zaman ise program yazmaktan baka
mikroyu d dnyaya balamak iin fiziksel donanm da oluturmanz gerekir.
Buna benzer bir sistem aada grlmektedir.

PIC retirken kullandm basit bir program bir butonla bir ledi yakma
programdr. Basit bir programla balayn 2000 satrlk bir program ile deil!
Assemblyde u ekilde:
main
lp1

btfss
goto
bsf
btfsc
goto
bcf
goto

porta,
main
portb,
porta,
lp1
portb,
main

switch
led
switch
led

;
;
;
;
;
;
;

switchi test et
baslana kadar bekle
ledi yak
switchi test et
braklana kadar bekle
ledi sndr
baa dn

C de u ekilde:
main()
{
set_tris_b(0x00);
while(true)
{
if(input(PIN_A0))
output_high(PIN_B0);
else
output_low(PIN_B0);
}
}

// portb yi k yap
// switchi test et
// kapalysa ledi yak
// aksa ledi sndr

derlendiinde kod u hale gelir:

PICPROJE EKB EVR GRUBU

13

www.picproje.org

main()
{
set_tris_b(0x00);

0007
0008

MOVLW
TRIS

00
6

0009
000A
output_high(PIN_B0); 000B
000C
else
output_low(PIN_B0); 000D
000E

BTFSS
GOTO
BSF
GOTO

05,0
00D
06,0
00E

BCF
GOTO

06,0
009

while(true)
{
if(input(PIN_A0))

}
}

Grdnz gibi derlenmi hali hafzada assemblyden daha fazla yer kaplar
14 word C, 9 word Assembly. Fakat programlar bymeye baladnda C
kod kullanmnda daha etkili olur.

PICPROJE EKB EVR GRUBU

14

www.picproje.org

1. C Esaslar
PICPROJE EKB EVR GRUBU

15

www.picproje.org

Bu blmde C programlamann baz temel ynlerinden bahsedilecektir.


Ama size temel C bilgilerini vermek ve ilerki blmlerdeki altrmalar
anlamanz salamaktr.
Ele alnacak balklar unlardr:
Program yaps
Bir C programnn bileenleri
#pragma
main
#include direktifi
printf deyimi
Deikenler
Sabitler
Yorumlar
Fonksiyonlar
C komutlar

1.1

C Programnn Yaps

Tm C programlar nilemci direktifleri, bildirimler, tanmlamalar, ifadeler,


durum ifadeleri ve fonksiyonlar ierir.
nilemci direktifi
nilemci direktifi C nilemcisine gnderilen bir komuttur (program
derlenirken ilk adm oluturur). En ok kullanlan iki nilemci direktiflerinden
#define, zel bir tanmlaycnn yerine geen bir metin belirtmek iin ve
#include ise program ierisine harici bir dosyadan tanmlama ya da program
paralar dahil etmek iin kullanlr.
Bildirimler
Bildirimlerle programda kullanlan deikenler, fonksiyonlar ve tiplerin nitelikleri
ve isimleri ayarlanr. Global deikenler fonksiyonlarn dnda tanmlanr ve
tanmlandklar yerden itibaren dosyann sonuna kadar geerlidirler. Local
deikenler ise fonksiyonlarn iinde tanmlanr ve tanmlandklar yerden
itibaren fonksiyonun sonuna kadar geerlidirler.
Tanmlamalar
Tanmlamalarla bir deiken veya fonksiyonun ierii ayarlanr. Ayrca
deikenler ve fonksiyonlar iin gerekli hafza ayrlr.
fadeler
fade tek bir deer reten ileler ve ilenenler kombinasyonudur.

Durum fadeleri

PICPROJE EKB EVR GRUBU

16

www.picproje.org

Durum ifadeleri bir C programnda program aknn kontroln salarlar.


Fonksiyonlar
Fonksiyonlar zel bir ilem yapan bildirimler, tanmlamalar, ifadeler ve durum
ifadeleri btndr. Parantezler fonksiyonun gvdesini kapsar. Fonksiyonlar C
de bulunmak zorunda deildir.
main Fonksiyonu
Tm C programlar main isimli bir fonksiyon iermek zorundadr ve program
buradan balar. main fonksiyonunu kapsayan parantezler programn
balang ve biti noktalarn belirler.
rnek: Genel C program yaps
#include <stdio.h>
#define PI 3.142
float area;
int square(int r);

/*
/*
/*
/*

nilemci direktifi */
standart C balk dosyasn dahil eder */
global bildirim */
prototip bildirimi */

main()
{
/* main fonksiyonunun balangc */
int radius_squared; /* local bildirim */
int radius = 3;
/* bildirim ve ayarlanmas */
radius_squared = square (radius);
/* fonksiyona deer gnderme */
area = PI * radius_squared;
/* ilikilendirme ifadesi */
printf(Area is %6.4f square units\n,area);
}
/* main fonksiyonu ve program sonu */
square(int r)
{
int r_squared;
r_squared = r * r;
return(r_squared);

/* fonksiyon ba */
/* sadece square fonksiyonu tarafndan */
/* tannan bildirimler */
/* aran ifadeye deer dndrme */

1.2

Bir C programnn bileenleri

Tm C programlar ifadeler ve fonksiyonlar gibi gerekli bileenler ierir. fadeler


aslnda programn ilemleri gerekletiren ksmlardr. Btn C programlar bir
veya daha fazla fonksiyon ierir. Fonksiyonlar bir veya daha fazla ifadeden
oluan altprogramlardr ve programn dier ksmlar tarafndan arlrlar.
Programlar yazarken tablar, bo satrlar ve aklamalar okunurluluu arttrr
sadece ileriki tarihlerde sizin iin deil, ayn zamanda programnz inceleyen
bakalar iinde. Aadaki rnek bir C programnn gerekli bileenlerini
gstermektedir.
#include <stdio.h>
/* lk C programm */
main()
{

PICPROJE EKB EVR GRUBU

17

www.picproje.org

printf(Merhaba Dnya);
}
#include <stdio.h>

ifadesi derleyiciye stdio.h dosyasnn programa dahil

edilmesini bildirir.
.h uzants balk dosyasn belirtir. Balk dosyas programda kullanlan standart
fonksiyonlar hakknda bilgi ierir. Standart giri k balk dosyas stdio.h
adyla anlr ve en ok kullanlan giri k fonksiyonlarn ierir. Sadece
programda standart giri klarla ilgili blmler olduunda kullanlmas
gerekir.
ifadesi C iin bir aklama satrdr. Geleneksel olarak
aklamalar /* ve */ karakterleri arasnda bulunur. Yeni sitil aklamalar ise //
karakterleri ile balar ve satr sonuna kadar aklama kabul edilir. Aklamalar
derleyici tarafndan dikkate alnmaz ve bu nedenle derlenmi kodun boyutu
ve hz zerinde bir etkisi yoktur.

/* lk C programm */

Btn C programlarnda main()fonksiyonu bulunmak zorundadr. Bu programa


giri noktasdr. Btn fonksiyonlar ayn formata sahiptir.
FunctionName()
{
code
}

Fonksiyon ierisindeki ifadeler srayla iletilirler.


Ssl parantezler { ve } Cde kod bloklarnn balangcn ve bitiini gsterirler.
Son olarak printf(Merhaba Dnya); ifadesi tipik bir C ifadesidir. Hemen
hemen tm C ifadeleri noktal virgl (;) ile biter. Satr sonu karakteri (CR+LF) C
tarafndan satr sonlandrc olarak tannmaz. Bu sebepten dolay ifadelerin bir
satra smas gibi bir zorunluluk yoktur ve bir satrda birka ifade bulunabilir.
Btn ifadelerin sonunda, derleyiciye ifadenin sonuna gelindiini bildiren
noktal virgl (;) bulunur ve ayn zamanda ifadeyi dier ifadeden ayrr. Noktal
virgl unutulursa bir sonraki satrda hata oluur. if ifadesi bileik bir ifadedir ve
noktal virgln bileik ifadelerin sonuna konmas gerekir.
if (BuDoruysa)
BunuYap();

1.3

#pragma

Pragma komutu derleyiciye derleme zamannda zel bir ilem yapmasn


bildirir mesela hangi PICmicro MCU nun kullanldn bildirmek gibi
#pragma

device

PIC16C54

PICPROJE EKB EVR GRUBU

18

www.picproje.org

CCS C de pragma komutu zorunlu deildir ve aadaki yazmda kabul edilir


#device

1.4

PIC16C54

main()

Her programda sadece birkez grnen bir main fonksiyonu olmak zorundadr.
() parantezler arasnda parametreler bulunamaz. void szc parantezler
ierisinde parametre olmadn gstermek iin kullanlabilir. main fonksiyon
olarak snflandrlmtr ve ardndan gelen komutlar {} parantezleri arasnda
bulunmak zorundadr.
main
{
komutlar
}

1.5

#include

Her programda sadece birtane main fonksiyonu olmak zorundadr.


Balk dosyas, (*.h uzantsyla belirtilen) fonksiyonlarn ald argmanlar,
fonksiyonlarn dndrdkleri deerler ve belirli bir PIC modelinin
kaydedicilerinin adresleri gibi bilgileri barndrr.
#include <16C54.H>

Bu bilgi derleyici tarafndan btn donanmla ilgili tanmlarn ve kaynak programlarn


balanmas srasnda kullanlr.
#include <16c71.h>
#include <ctype.h>
#use rs232(baud=9600,xmit=PIN_B0,rcv=PIN_B1)
main()
{
printf(Enter characters:);
while(TRUE)
putc(toupper(getc()));
}

PIN_B0 ve PIN_B1 tanmlamalar 16C71.H adl balk dosyasnda bulunur.


toupper fonksiyonu da CTYPE.H balk dosyasnda belirtilmitir. Her iki balk
dosyas da derleyicinin kullanlan fonksiyonlar hakknda bilgi sahibi olmas iin
kullanlmaldr. Ayrca birok C derleyicisi printf ve putc gibi G/ fonksiyonlar
iin balk dosyalarn kullanmna ihtiya duyar.Bu fonksiyonlar programlara
#use rs232 direktifi ile eklenirler ve harici bir balk dosyasna ihtiya duymazlar.
#include <dosya1.h>

nilemciye dosya1 adl balk dosyasnn balk dosyalar klasrnde


bulunduunu belirtir. ift trnak ierisindeki balk dosyas ismi ise derleyiciye
kaynak kodun bulunduu klasre bakmasn syler.

PICPROJE EKB EVR GRUBU

19

www.picproje.org

#include dosya2.h

ilk olarak o anda kullanlan klasre bakmasn belirtir. Dikkat ettiyseniz #include
direktifinden sonra noktal virgl konulmuyor. Bunun nedeni #include
direktifinin bir C ifadesi deil nilemci direktifi olmasdr. Btn balk
dosyasnn ierii derlenme zamannda kaynak dosyasna eklenir.

1.6 printf Fonksiyonu


printf fonksiyonu yazlabilir bilginin gnderilmesini salayan ve standart
ktphanede bulunan bir fonksiyondur. printf() iin genel biim u ekildedir:
printf(kontrol karakterleri dizisi, argument_list);

Kontrol karakterleri dizisi ift trnak iinde bulunan bir karakter dizisidir. Bu dizi
iinde harf, rakam ve sembol kombinasyonlar bulunabilir. zel semboller %
iareti ile birlikte kullanlrlar. Bir printf() fonksiyonu iinde mutlaka bir kontrol
karakteri dizisi olmaldr. Eer biim belirteleri kullanlmadysa argman listesi
bulunmayabilir. Argman listesi sabitler ve deikenlerden oluabilir. Aada
printf() fonksiyonunun sabit ve deikenlerle kullanmna dair iki rnek
bulunmaktadr:
printf(Merhaba Dnya);
printf(Microchip #%d numara!,1);

Biim belirteci (%d) gsterilecek olan verinin tipine baldr. Aada Cde
kullanlan btn biim belirteleri ve ilgili veri tipleri gsterilmitir:
printf() Biim Belirteleri
%c
tek bir karakter character
%d
aretli Desimal Tamsay
%f
Kayar noktal (ondalk gsterim)
%e
Kayar noktal (stel veya bilimsel gsterim)
%u
iaretsiz Desimal tamsay
%x
iaretsiz hexadesimal tamsay (kk harf)
%X
iaretsiz hexadesimal tamsay (Byk harf)
l neki uzun tamsaylar belirtmek iin %d, %u, %x

ile birlikte kullanlr

NOT: % karakterinden sonra kullanlan 0(sfr)larn says, say dizilerinde ka


adet sfrn gsterileceini belirler. 0lar takip eden say da, ka hanenin
gsterileceini belirler.
printf( 12nin onaltlk karl

%02x\n,12);

Bu program satrnn kts: 12nin onaltlk (hexadesimal) karl olan 0c dir.


Ters bl karakter sabitleri(Escape Sequences):
\n

yenisatr

PICPROJE EKB EVR GRUBU

20

www.picproje.org

\t
\r
\f
\
\
\\
%%
\?
\b
\0
\v
\xhhh

yatay tab
carriage return
formfeed
tek trnak
ift trnak
backslash
yzde iareti
Soru iareti
backspace
bo(null) karakter
dikey tab
insert HEX code hhh

Format belirteleri %[bayraklar][genilik][.hassasiyet], eklinde de kullanlabilir.


printf(Alan %6.4f

birim karedir\n,alan);

alan deikeni 6 haneli ve 4 ondalk hane kullanlarak yazlacaktr.


Varsaylan olarak printfin kts en son tanmlanm RS232 portuna gnderilir.
ktlar herhangi bir fonksiyon yoluyla baka bir yere de ynlendirilebilir.
rnein:
void lcd_putc(char c)
{
// Insert code to output one
// character to the LCD here
}
printf(lcd_putc, value is %u, value);

1.7 Deikenler
Deiken, bellekteki belirli bir konuma verilen isimdir. Bu bellek blgesi
deikenin bildirimine gre deiik deerleri tutabilir. C dilinde btn
deikenlerin kullanlmadan nce bildirimleri yaplm olmaldr. Deiken
bildirimleri derleyiciye ne tr bir deiken kullanldn bildirir. Btn deiken
bildirimlerinin sonunda noktal virgl (;) bulunmaldr. Temel C veri tipleri char,
int, float, ve longdur. Deiken bildirimlerinin genel biimi u ekildedir:
tip degisken_ismi;
Deiken bildirimine rnek olarak char kar; rneini verebiliriz.Burada kar
deikeni karakter olarak tanmlanyor (8 bit iaretsiz tamsay)

1.8 Sabitler
Sabit, program tarafndan deitirilemeyen deer demektir. rnein 25 says
bir sabittir. -100 ve 40 gibi tamsay sabitler olabilecei gibi 456.75 gibi kayar

PICPROJE EKB EVR GRUBU

21

www.picproje.org

noktal sabitler de olabilir. Karakter sabitler tek trnak ierisinde gsterilirler: A


veya & gibi.
Derleyici programnzda bir sabit ile karlatnda bu sabitin tr hakknda
karar vermesi gerekir. C derleyicisi varsaylan olarak verinin yerletirilebilecei
en ufak veri tipini kullanacaktr. rnein 15 says bir int , 64000 iaretsiz long
tiptir.
Sabitler ayrca #define ifadesi ile de belirtilebilinir:
#define etiket deer

Derleyici program derlerken etiket ksmnda yazl olan isimle her


karlatnda bunun yerine belirtilen deeri koyacaktr.
#define TRUE 1
#define pi 3.14159265359
C sabitleri 16l veya 8lik tabanda yazmanza olanak verir: Onaltlk tabandaki
sabitler 0x neki ile balamaldr. rnein 0xA4 geerli bir onaltl sabittir.
Saysal sabitlerin yannda C dizge sabitlerini de destekler. Dizge sabitleri ift
trnak arasnda yazlan karakter takmlardr.
#define ifadesi ile tanmlanan sabitler aslnda derlenmeden nceki aamada
yaplan yaznsal deiimlerdir. # iareti ile balayan satrlar n-ilemci
direktifleridir.
#define szcyle herhangi bir metni tanmlayabilirsiniz. rnein:
#define YASLI_DEGIL (YAS<65)
.
.
.
.
.
f YASLI_DEGIL
printf(GENC);

#define verisi bellekte saklanmaz. Derlenme annda ilenir.


Sabitleri ROMa kaydetmek iin const szcn kullanmalsnz. rnein:
char const id[5]={1234};

Buradaki diziyi bellekte saklamak iin 5 adet bellek blgesi kullanlr. nk


dizinin sonuna boluk karakteri (\0) eklenmektedir.

1.9 Yorumlar

PICPROJE EKB EVR GRUBU

22

www.picproje.org

Yorumlar kaynak kodda yaplan ilemleri anlatmak ve almasn gstermek


iin kullanlr. Yorumlar derleyici tarafndan gz ard edilir. Yorumlar bir C
anahtar kelimesinin, fonksiyon veya deiken isminin ortas dnda herhangi bir
yerde bulunabilirler. Yorumlar birok satrdan oluabilirler ve bazen kodlarn
geici olarak kaldrlmas iin de kullanlabilirler. Yorumlar satrlarca uzunlukta
olabilirler ve bazen de bir kod satrnn geici olarak kaldrlmas iin
kullanlabilirler. Yorumlar i ie gmlemezler.
Yorumlarn iki tr kullanm biimleri vardr. lk biim btn C derleyicileri
tarafndan desteklenmektedir.
/* Bu bir yorumdur*/

kinci format ise birok derleyici tarafndan desteklenmektedir.


// Bu bir yorumdur

Altrma: Aadaki yorum biimlerinden hangileri geerli,hangileri


geersizdir?
/* Ksa bir yorum */
/* ok ok ok ok ok ok ok ok
bir yorum */

ok ok ok ok ok ok ok ok uzun

/* Bu yorum /* geerli */ deildir */

1.10 Fonksiyonlar
Fonksiyonlar C programlarnn temel yaptalardr. Her bir C program en az bir
fonksiyon, main(), barndrr. Yazdnz birok program birden fazla fonksiyon
bulunduracaktr. Birok fonksiyonu barndran bir C programnn genel yaps u
ekildedir:
main()
{
fonksiyon1()
{
}
fonksiyon2()
{
}
}

main() program altrldnda arlan ilk fonksiyondur. Dier fonksiyon1()


ve fonksiyon2() programn herhangi bir yerinde arlabilirler.
Geleneksel olarak main() fonksiyonu baka bir fonksiyon tarafndan
arlmaz, ancak Cde kstlamalar yoktur.
Aada iki C fonksiyonu grlmektedir:
main()
{

PICPROJE EKB EVR GRUBU

23

www.picproje.org

printf(Cyi);
fonksiyon1();
printf(cok);
}
fonkisyon1()
{
printf( seviyorum );
}

Bir fonksiyonda en son paranteze ( } )gelince program tekrar fonksiyonun


arlm olduu satrdan itibaren iletilmeye devam eder. Blm 3.1e
baknz.

1.11 Makrolar
#define nceki blmlerde de grld gibi gl bir direktiftir. C define
direktifinin parametre almasn da salayarak daha da gl hale getirir.
Parametrelerle birlikte kullanldnda bunlara makro denilir. Makrolar
programlarn okunabilirliini artrmak veya yazma kolayl salamak iin
kullanlrlar. Basit bir makro rnei:
#define var(x,v) unsigned int x=v;
var(a,1);
var(b,2);
var(c,3);

aadakine edeerdir:
unsigned int a=1;
unsigned int b=2;
unsigned int c=3;

Aadaki rnek de ksa bir fonksiyon tanmlanmaktadr:


#define MAX(A,B) (A>B)?A:B)
z = MAX(x,y); // z ,x ve y deerlerinin en by olacaktr

1.12 Durumsal Derleme


Cde baz derleme esnasnda kodun belirli blmlerinin derlemeye dahil
edilmesi veya karlmas iin n-ilemci direktifleri bulunur. Aadaki rnei
inceleyelim:
#define HW_VERSION 5
#if HW_VERSION>3
output_high(PIN_B0);
#else
output_low (PIN_B0);
#endif

Yukardaki programda HW_VERSION deerine bal olarak sadece bir satr


derlenecektir. Ayn kodda onlarca #if ifadesi bulunabilir ve ayn kod deiik
PICPROJE EKB EVR GRUBU

24

www.picproje.org

donanmlar iin derlenebilir. #if ifadeleri, normal if ifadelerinden farkl olarak


kod derlenirken deerlendirilirler. #ifdef ifadesi herhangi bir kimlik ifadesinin
daha nce tanmlanp tanmlanmadn belirlemede kullanlr.
rnek:
#define TANIM
#ifdef TANIM
printf(X Fonksiyonu altrlyor);
#endif

Bu rnekte #define TANIM satr kaldrldnda printf fonksiyonunun bulunduu satr


derleyici tarafndan gz ard edilecektir (yani derlenmeyecektir).

1.13 Donanm Uyumluluu


Derleyici kodun dzgn derlenebilmesi iin donanm hakknda bilgiye ihtiya
duyar. Tipik bir program u ekilde balar:
#include <16c74.h>
#fuses hs,nowdt
#use delay(clock=800000)

lk satr kullanlan ilemcinin pinlerine ait define direktiflerini ieren dosyann


programa eklenmesini salar. kinci satrda PICmicroMCUnun ayar deerleri
atanr. Bu rnekte yksek hzl osilatr kullanlmakta ve watchdog timer devre
d braklmaktadr. Son satr da osilatrn hz belirtilmektedir. Aada baka
bir rnek grlmektedir:
#use rs232(buad=9600,xmit=PIN_C6,rcv=PIN_C7)
#use i2c(master,scl=PIN_B6,sda=PIN_B7)

Bu kitaptaki rneklerde yukarda grlen donanm tanmlayan satrlar


gsterilmemitir.
Buna ilave olarak, C deikenleri tanmlanp donanm kontrol kaytlarna
(registers) ynlendirilebilirler. Bu deikenler bayt veya bitler eklinde olabilirler.
Tanmlandktan sonra programda dier normal deikenler gibi kullanlabilirler.
rnek olarak
#bit carry=3.0 ; STATUS registerindeki carry flagi deiken tanmland
#byte portb=6 ; PortB dorudan deikenmi gibi tanmland
#byte intcon=11; INTCON kayts deiken olarak tanmland

1.14 C Anahtar Kelimeleri


ANSI C standard 32 adet C anahtar kelimesi tanmlar. Cde belirli kelimeler
derleyici tarafndan veri tiplerinin tanmlanmasnda veya dnglerde
kullanlrlar. Btn C anahtar kelimeleri kk harfle yazlmaldr. Genellikle, C
derleyicileri ilemcinin zelliklerinden faydalanabilmek iin fazladan anahtar

PICPROJE EKB EVR GRUBU

25

www.picproje.org

kelimeler tanmlarlar. Aada C anahtar kelimelerinin listesi bulunmaktadr.


Kullanlan deikenlere verilecek isimler anahtar kelimelerle ayn olamaz.
Auto
break
case
char
const
continue
default
do

double
else
enum
extern
float
for
goto
if

int
long
register
return
short
signed
sizeof
static

struct
switch
typedef
union
unsigned
void
volatile
while

Altrmalar:
1. Adnz ekrana yazdran program yaznz.
2. Yl adl bir tamsay deikeni tanmlayan bir program yaznz. Ardndan printf()
komutuyla ekrana yl u ekilde yazdran bir program yaznz. Programnzn kts
u ekilde olmaldr. 2006 ylndayz.

2. Deikenler
C Dilinin nemli bir yan dilin deikenleri nasl saklad ile ilgilidir. Bu blmde,
verilerin hafzada tutulmas iin Cde deikenlerin nasl kullanlaca yakndan
incelenecektir.

PICPROJE EKB EVR GRUBU

26

www.picproje.org

Bu blmde tartlacak olan balklar unlardr:


veri tipleri
bildirimler
atamalar
veri tipi aralklar
tip dnmleri

2.1 Veri Tipleri


C Dili be temel veri tipini ve 4 tr deitiriciyi destekler. Aadaki tablo temel
veri tiplerinin ve tip deitiricilerinin anlamlarn gstermektedir.
Tip

Anlam

Anahtar Kelimeler

Karakter karakter verisi


Tam saylar
iaretsiz tam saylar
Float
kayan noktal saylar
Double
ift duyarlkta kayan noktal saylar
Bo
deersiz
aretli
pozitif veya negatif saylar
aretsiz sadece pozitif saylar
Uzun
geni aralktaki saylar
Ksa
dar aralktaki saylar

char
int
float
double
void
signed
unsigned
long
short

Her bir veri tipi kullanlan deitiriciye gre, belirli bir aralktaki saylar temsil
eder. Sonraki tablo temel veri tiplerinin mmkn olan kombinasyonlar iin
geerli aralklar gstermektedir.
Tip

Bit Genilii

short
short int
int
char
unsigned
unsigned int
signed
signed int
long
long int
signed long
float

1
1
8
8
8
8
8
8
16
16
16
32

Aralk
0 veya 1
0 veya 1
0..255
0..255
0..255
0..255
-128..127
-128..127
0..65536
0..65536
-32768..32767
3.4E-38..3.4E+38

NOT: Asl veri tipleri ve nmerik aralklar iin kullandnz C derleyicisinin


klavuzlarna baknz.
C, unsigned int, short int ve long int veri tiplerinin ksa gsterimine olanak verir.
int kullanmakszn kolayca, unsigned, short, ya da long eklinde yazlabilir.
Aritmetik ilemlerin ilemci iin daha kolay olmas bakmndan, Cdeki tm
negatif saylar 2nin tmleyeni biiminde gsterilir. Bir saynn 2nin tmleyeni
edeerini bulmak iin nce saynn tm bitleri evirilir ve sayya 1 eklenir.

PICPROJE EKB EVR GRUBU

27

www.picproje.org

rnein, +29u 2nin tmleyini edeerine evirmek iin:


00011101
11100010
1
11100011

=
=

29
tm bitleri evir
1 ekle
-29

Aada 12000 deerinin a deikenine atanmas rnei verilmitir. 12000in


16lk say sistemindeki karl 2EE0dr. Verilen kod, saynn dk deerli
ksmn 11h yazmacna, yksek deerli ksmn 12h yazmacna atar.
long a
main()
{
0007:
0008:
0009:
000A:
}

= 12000;
MOVLW
MOVWF
MOVLW
MOVWF

E0
11
2E
12

ALITIRMALAR:
1. Verilen ifadeyi ksa gsterimde yaznz.
long int i;
2. aretli ve iaretsiz saylar arasndaki fark anlamak iin, aadaki program
yaznz. aretsiz tam say 35000, iaretli say biiminde -30536 olarak
gsterilecektir.
main()
{
int i;
/* iaretli tam say */
unsigned int u;
/* iaretsiz tam say */
u = 35000;
i =u;
printf(%d %u\n, i, u);
}

2.2 Deiken Bildirimleri


Deikenler iki temel yerde bildirilebilirler: fonksiyonun iinde ya da
fonksiyonlarn dnda. Bunlar, srasyla yerel ve global isimlerini alrlar.
Deikenler aadaki biimde bildirilirler:
tip degiken_adi;

PICPROJE EKB EVR GRUBU

28

www.picproje.org

Burada, tip geerli bir C veri tipi ve degisken_adi da bildirilen deikenin


ismidir.
Yerel deikenler (fonksiyonlarn iinde bildirilenler) sadece bildirildikleri
fonksiyonlarn iindeki ifadelerde kullanlabilir.
Yerel deikenin deerine, bildirildii fonksiyon dndaki fonksiyonlar
tarafndan eriilemez. Yerel deikenler hakknda hatrlanmas gereken en
nemli ey, onlarn fonksiyona giri esnasnda yaratlp, fonksiyondan kld
zaman yok edilmesidir. Ayrca yerel deikenler, fonksiyonun balangcnda
dier ifadelerden nce bildirilmelidir.
Farkl fonksiyonlarda, ayn isimli yerel deikenlerin bildirilmesi geerli bir
bildirimdir. Aadaki rnei gz nnde tutacak olursak:
void f2(void)
{
int sayac;
for (sayac = 0 ; sayac < 10 ; sayac++)
print(%d \n, sayac);
}
f1()
{
int sayac;
for (sayac=0; sayac<10; sayac++)
f2();
}
main()
{
f1();
return 0;
}

Bu program 0dan 9a kadar olan saylar ekrana 10 defa yazdracaktr.


Programn ileyii her iki fonksiyonda da yer alan sayac deikeninden
etkilenmez.
Dier taraftan global deikenler bir ok farkl fonksiyon tarafndan
kullanlabilir. Global deikenler herhangi bir fonksiyon tarafndan
arlmadan nce bildirilmelidirler. Daha nemlisi, global deikenler
programn ileyii tamamlanmadka, arldklar fonksiyondan ktklar
zaman yok edilmezler.
Aadaki rnek global deikenlerin nasl kullanlacan gstermektedir.
int max;
f1()
{
int i;
for(i=0; i<max;i++)
printf(%d ,i);
}

PICPROJE EKB EVR GRUBU

29

www.picproje.org

main()
{
max=10;
f1();
return0;
}

Bu rnekte; main() ve f1() fonksiyonu max deikenine referans


gstermektedir. main() fonksiyonu max deikenine deer atamakta ve f1()
fonksiyonu for dngsn kontrol etmek iin maxn bu deerini
kullanmaktadr.
ALITIRMALAR:
1. Yerel ve global deikenler arasndaki temel farkllklar nelerdir?
2. Cde yerel ve global deikenler ayn ismi paylaabilirler. Aadaki
program yaznz.
int sayac;
f1()
{
int sayac;
sayac =100;
printf(f1() deki sayac : %d\n, sayac);
}
main()
{
sayac=10;
f1();
printf(main() deki sayac: %d\n, sayac);
return 0;
}

main()in ierisinde sayaca referans global deiken biimindedir. f1()


fonksiyonundaki yerel sayac deikeni global deikenin deerini geersiz
klar.

2.3 Deiken Atamas


u ana kadar deikenlere ilk deer atamasn es geip, sadece deiken
bildirimlerinin nasl yaplaca zerine tarttk. Deikenlere deer atanmas
aada gsterildii gibi basite gerekletirilir:
degisken_adi = deger;

Deiken atamas bir ifade olduundan tr, ifadenin sonuna noktal virgl
konulur. rnek olarak 100 deerini sayac tam say deikenine atamak iin:

PICPROJE EKB EVR GRUBU

30

www.picproje.org

sayac = 100;

Burada 100 deeri bir sabittir.


Deikenler bildirildii anda bunlara ilk deer atamas yaplabilir. Bu ekilde
deikenlerinize bilinen deerlerle atama yaplmas programnz kolaylatrp
daha gvenli hale getirir. rnek olarak:
int a = 10, b = 0, c = 0x23;

Cde pek ok deiik tipte sabitler mevcuttur. Bir karakter sabiti M


rneindeki gibi bir karakter sabiti, karakterin tek trnak iinde yazm ile
belirtilir. int tiplere deer atarken tam saylar kullanlr. Kayar noktal saylar,
ondalk noktal gsterimi kullanmaldr. rnein 100 saysnn kayar noktal bir
say olduunu Cde gstermek iin 100.0 gsterimi kullanlr.
Ayrca, bir deiken baka bir deikene atanabilir. Aadaki kod paras bu
atamay gsterir.
main()
{
int i;
int j;
i=0;
j=i;
}

ALITIRMALAR:
1. sayac isimli tamsay tipli bir deikenin bildirimini yaznz. Bu deikene 100
deerini atayp, printf() fonksiyonu ile bu deeri gsteriniz.
Programn kts u ekilde olmaldr:
sayac deikeninin deeri 100dr.
2. char, float ve double tiplerinde ch, f, ve d isimli deikenlerin bildirimini
yapp, R yi karakter, 50.5i float, 156.007yi double deikenine ataynz. Bu
deikenlerin deerlerini ekranda yazdrnz.
kt aadaki ekilde olmaldr:
ch = R
f = 50.5
d = 156.007

2.4 Numaralandrma

PICPROJE EKB EVR GRUBU

31

www.picproje.org

Cde tam say sabitlerinin listesini yapmak mmkndr. Bu bildirim


numaralandrma ismini alr. Numaralandrlarak oluturulan sabitler listesi, tam
say tiplerinin kullanld her yerde kullanlabilir. Numaralandrma oluturmann
genel ekli yledir:
enum isim {numaralandrma listesi} deiken(ler);

Deiken listesi numaralandrmann seime bal parasdr. Numaralandrma


deikenleri sadece numaralandrma listesinde tanmlanm deerleri
kullanabilir. rnein u ifadede:
enum renk_tipi {kirmizi, yesil, sari} renk;

renk deikenine sadece kirmizi, yesil ve sari deerleri atanabilir.


(r., renk = kirmizi;).
Derleyici, ilk girdi 0a eit olmak zere numaralandrma listesine tam say
deerleri atar. Her bir girdi bir ncekinden bir byktr. Buna gre, yukardaki
rnekte kirmizi 0, yesil 1 ve sari 2 deerlerini alr. Bu durum, sabit iin bir deer
atanarak nlenebilir. Aada bu durum rneklendirilmitir:
enum renk_tipi {kirmizi, yesil=9, sari} renk;

Bu ifade kirmiziya 0, yesile 9 ve sariya 10 deerlerini atar.


Numaralandrma bir kez tanmlandnda, bu isim, programn farkl
noktalarnda ilave deikenler yaratmak iin kullanlabilir. rnein, rengim
deikeni renk_tipi numaralandrmas ile u ekilde yaratlr:
enum renk_tipi rengim;

Deiken baka bir deikenle snanabilir:


if (renk==meyve)
// bir eyler yap

Aslnda, numaralandrma belgelendirmeye yardmc olur. Bir deikene deer


atamak yerine, deerinin daha ak anlalmas iin numaralandrma
kullanlabilir.
ALITIRMALAR:
1. PIC17CXX ailesinin numaralandrlmasn oluturunuz.
2. En dkten en yksek deere paranzn numaralandrma listesini
oluturunuz.
3. Aadaki kod paras doru mudur? Aklaynz.
enum {PIC16C51,PIC16C52,PIC16C53} aygit;
aygit = PIC16C52;
printf(lk PIC %s d.\n, aygit);

PICPROJE EKB EVR GRUBU

32

www.picproje.org

2.5 typedef
Cde yeni veri tipleri yaratmak iin typedef ifadesi kullanlr. Bu aadaki
biimde gerekletirilir:
typedef eski_isim yeni_isim;
Yeni isim deikenleri bildirmek amacyla kullanlabilir. rnein aadaki
program signed char tipi yerine kucuktamsayi ismini kullanr.
typedef signed char kucuktamsayi;
main()
{
kucuktamsayi i;
for(i=0;i<10;i++)
printf(%d ,i);
}

typedef kullanrken iki noktaya dikkat etmelisiniz: typedef orijinal tipi veya ismin
etkinliini ortadan kaldrmaz yani; nceki rnekte signed char hala geerli bir
tiptir, ayn orijinal tipte deiik yeni isimler oluturmak iin birka typedef ifadesi
kullanlabilir.
typedef genellikle iki sebepten tr kullanlr. ncelikli olarak tanabilir
programlar oluturmak amacyla kullanlr. Eer yazdnz program 16-bit ve
32-bitlik tam say tabanl makinelerde kullanlacaksa, 16-bitlik tam saylarn
kullanlacandan emin olmak isteyebilirsiniz. 16-bitlik makineler iin oluturulan
programda tm tam saylar 16-bitlik olarak bildirmek iin u ifade kullanlrd.
typedef int tamsayim;

Program 32-bitlik bilgisayarlar iin derlemeden nce typedef ifadesi u ekilde


deitirilebilirdi:
typedef short int tamsayim;

Yani tamsayim tipinde bildirilmi tm deikenler 16-bit genilie sahip olur.


typedef ifadelerini kullanmann dier nedeni, programn okunabilirliini
arttrmasndandr. Eer kodunuz, saya benzeri pek ok deiken ieriyorsa,
tm sayac deikenlerinizi bildirmek iin typedef ifadesini kullanabilirsiniz.
typedef int sayac;
Kodunuzu okuyan birisi, sayac tipinde bildirmi olduunuz deikenlerinizin
sayc amal kullandnz fark edecektir.

PICPROJE EKB EVR GRUBU

33

www.picproje.org

ALITIRMALAR:
1. unsigned long tipi iin UL adnda yeni bir isim oluturunuz. Bu oluturduunuz
yeni ismi kullanp, buna bir deer atamas gerekletiriniz ve bu deeri ekrana
yazdrnz.
2. Aadaki kod paras geerli midir?
typedef int yukseklik;
typedef yukseklik uzunluk;
typedef uzunluk derinlik;
derinlik d;

2.6 Tip Dnmleri


C, farkl veri tiplerinin bir ifadede kartrlmasna izin verir. rnein verilen kod
paras geerli bir yazmdr:
char ch = 0;
int i = 15;
float f = 25.6;
double sonuc = ch*i/f;

Veri tiplerinin kartrlmas, derleyicinin farkllklar nasl zmleyeceini bildiren


sk dnm kurallar ile ynetilir. Kurallar kmesinin ilk ksm tip terfisidir. C
derleyicisi, ifade altrldnda char veya short int tipini otomatik olarak int
tipine dntrr. Tip terfisi sadece ifadenin altrld zaman geerlidir;
deiken fiziksel olarak daha byk olamaz.
Otomatik tip dnmleri tamamlad zaman, C derleyicisi tm deikenleri
en geni tipli deikenin tipine evirir. Bu ilem adm adm ilerleme temeline
gre gerekletirilir. Aadaki algoritma tip dnmlerinin nasl yaplacan
gstermektedir.
EER bir operand long double ise
dieri long double tipine evrilir
EER bir operand double ise
dieri double tipine evrilir
EER bir operand float ise
dieri float tipine evrilir
EER bir operand unsigned long ise
dieri unsigned long tipine evrilir
EER bir operand long ise
dieri long tipine evrilir
EER bir operand unsigned ise
dieri unsigned tipine evrilir
nceki rnekte ne trden terfiler ve dnmler olduunu inceleyelim. lk
olarak, ch int tipine terfi ettirilir. lk ilem ch ile inin arpmdr. Her iki
PICPROJE EKB EVR GRUBU

34

www.picproje.org

deikende artk tam say olduklarndan, her hangi bir tip dnm
gerekletirilmez. Sonraki ilem fnin ch*i ifadesine blmdr. Algoritmaya
gre, eer operandlardan biri float ise dieri float tipine dntrleceinden,
ch*i/f ifadesinin sonucu float tipindedir, fakat sonuc double olduu iin
double tipine dntrlecektir.
Derleyicinin tip deiimlerini yapmasna gvenmek yerine, tip dnmlerini
aada gsterildii gibi aka yapabilirsiniz.
(tip) deger
Bu (ak) tip dntrme adn alr ve deikende geici deiiklik yaplmasna
neden olur. tip geerli bir C veri tipidir ve deger deiken yada sabittir.
Aadaki kod paras kayar noktal bir saydaki tam say ksmn nasl
gsterileceini rneklemektedir.
float f;
f = 100.2;
printf(%d, (int)f);

Bu kod altrldktan sonra ekrana 100 says yazdrlr.


ki 8-bit tam say arpldnda sonu 8-bit uzunlukta olacaktr. Sonu deeri
long tipinde bir deikene atanacak olursa, aritmetik ilem yeni deikene
atanma ileminden nce gerekletirildiinden sonu hala 8-bitlik bir tam say
olacaktr.
int a = 250, b = 10;
long c;
c = a * b;

Sonu 196 olacaktr. long tipinde sonuca ihtiyacnz varsa, bir deiken iin
aka tip dnm yapmanz gerekmektedir.
c = (long) a * b;

a long tipine aka dntrldnden long tipinde arpm


gerekletirilmitir ve sonu beklenildii gibi 2500 olacaktr.

2.7 Deiken Depolama Snf


Cdeki her bir deiken ve fonksiyonun iki zellii vardr: tip ve depolama snf.
Tip kavram daha nce aklanmt. Otomatik, harici, duraan ve yazma
olmak zere drt deiik depolama snf vardr. Bunlar Cde aadaki
anahtar kelimeler ile gsterilirler:
auto extern static register
Auto
PICPROJE EKB EVR GRUBU

35

www.picproje.org

Fonksiyonun ierisinde bildirilen deikenler varsaylan olarak auto


snfndandr.
{
char c;
int a, b, e;
}

ile aadaki gsterim ayndr.


{
auto char c;
auto int a, b, e;
}

Bir kod blouna girildiinde, derleyici bildirilmi deikenler iin RAM alann
ayrr. RAM alanlar bu yerel kod blou iin kullanlr ve dier kod bloklar
tarafndan kullanlabilir.
main()
{
char c = 0;
int a =1, b = 3, e = 5;
0007: CLRF 0E
; 0Eh yazmacnn ierii Cye atanr
0008: MOVLW 01 ; wye 1 ykle
0009: MOVWF 0F ; aya wdeki deeri ata
000A: MOVLW 03 ; wye 3 ykle
000B: MOVWF 10 ; bye wdeki deeri ata
000C: MOVLW 05 ; wye 3 ykle
000D: MOVWF 11 ; cye wdeki deeri ata
}

Extern
extern anahtar kelimesi harici balama sahip bir deiken ya da fonksiyon
bildirir. Bunun anlam, bu deiken ya da fonksiyonun tanmland dosyalar
haricinde de grlebilir olmasdr. CCS Cde harici balama sahip fonksiyon
yoktur.
Static
static deiken snf, nceden belirtilmedike 0 ile ilk deer atanm global
aktif deikenleri tanmlar.
void test()
{
char x,y,z;
static int sayac = 4;
printf(sayac = %d\n,++sayac);
}

sayac deikenine bir kez ilk deer atamas yaplmtr ve sonra her fonksiyon
arsnda deeri bir kez arttrlr.

PICPROJE EKB EVR GRUBU

36

www.picproje.org

Register
register deiken snf, byk sistemlerde yksek hzl hafzalarn sklkla
kullanlan deikenler iin ayrlmas mantndan tretilmitir. Bu snf sadece
derleyiciye neri amala kullanlr CCS C iinde bu trden bir fonksiyon
yoktur.

3. Fonksiyonlar
Fonksiyonlar C dilinin temel yaptalardr. Cdeki btn ifadeler bir fonksiyonun
iinde yer almaldr. Bu blmde fonksiyonlara argmanlarn iletilmesi ve bir
fonksiyonlardan deer dndrlmesi gibi konular inceleyeceiz.
Bu blmde incelenen konular:
Argmanlarn Fonksiyonlara letilmesi
Fonksiyonlarn Deer Dndrmesi
Fonksiyon Prototipleri
Klasik ve Modern Fonksiyon Bildirimleri

PICPROJE EKB EVR GRUBU

37

www.picproje.org

3.1 Fonksiyonlar
nceki blmlerde,ana programdan arlan birok fonksiyon rnei
grmtk.rnein:
main(){
f1();
}
int f1(){return 1;}

Gerekte, bu programn hata yada en azndan uyar vermesi gerekir. nk


f1() fonksiyonu, deikenlerde olduu gibi, kullanmndan nce bildirilmeli
veya tanmlanmaldr. Eer standart C fonksiyonu kullanyorsanz, programnzn
banda #include deyimiyle programnza eklediiniz balk dosyas derleyiciye
fonksiyonu zaten tantmtr. Eer kendi fonksiyonlarnzdan birini kullanyorsanz
bu hatay gidermenin iki yolu vardr: lk yol, ikinci blmde aklanacak olan,
fonksiyon prototipi kullanmaktr. Dieri ise programnz u ekilde organize
etmektir:
int f1()
{
return 1;
}
main()
{
f1();
}

Bir hata olumayacaktr nk f1() fonksiyonu main() iinde arlmadan


nce tanmlanmtr.

3.2 Fonksiyon Prototipleri


Derleyiciye bir fonksiyonun dndrecei deeri bildirmenin iki yolu vardr.
Genel biim udur:
tip fonksiyon_ismi();

rnein, topla() iindeki ifade derleyiciye topla()nn bir tamsay deeri


dndreceini bildirebilir. Derleyiciye dndrlen deeri bildirmek iin ikinci
bir yol da fonksiyon prototipi kullanmaktr. Fonksiyon prototipi sadece
fonksiyonun dndrecei deeri belirtmekle kalmaz, ayn zamanda
fonksiyonun kabul ettii argman says ve tiplerini de bildirir. Prototip
fonksiyon bildirimi ile rtmek zorundadr. Prototipler, fonksiyonlara iletilen
argmanlarla, fonksiyon bildirimindeki argman tipleri arasndaki hatal tip
dnmlerini gstererek programcya program hatalarn bulmasnda
yardmc olur. Ayrca fonksiyona iletilen argman saysnn, fonksiyon
bildirimindeki ile ayn olmadn da raporlar.

PICPROJE EKB EVR GRUBU

38

www.picproje.org

Fonksiyon prototipleri iin genel biim u ekildedir:


tip fonksiyon_ismi(tip degisken1,tip degisken2,tip deisken3);

Yukardaki rnekte, her bir deikenin tipi farkl olabilir. Bir fonksiyon prototipi
rnei aadaki programda gsterilmitir. Fonksiyon uzunluk, genilik ve
ykseklik deerlerinden hacmi hesaplamaktadr.

int hacim(int s1, int s2, int s3);


void main()
{
int hcm;
hcm= hacim(5,7,12);
printf(hacim: %d\n,hcm);
}
int hacim(int s1, int s2, int s3)
{
return s1*s2*s3;
}

return ifadesinden sonra bir sabit ya da deiken yerine bir ifade kullanldna
dikkat edin.
Prototiplerin nemi imdiye kadar yazdmz ufak programlarda tam olarak
ortaya kmam olabilir. Ancak programlar birka satrdan binlerce satra
doru bydnde, prototiplerin hata gidermedeki nemi ortaya kacaktr.
ALITIRMALAR:
1. Derleyicinin hatalar nasl yakaladn gstermek iin, yukardaki program
hacim fonksiyonuna 4 parametre yollayacak ekilde deitirin:
hcm = hacim(5,7,12,15)
2. Aadaki program doru mu? Deilse neden?
double fonk(void)
void main()
{
printf(%f\n,fonk(10.2));
}
double fonk(double sayi)
{
return sayi/2.0;
}

3.3 void
Bir fonksiyon hibir parametre almadnda ve hibir deer dndrmediinde
bildirimi u ekilde yaplr:

PICPROJE EKB EVR GRUBU

39

www.picproje.org

void hic(void)
rnek olarak:
double pi(void)
{

//hibir parametre almadan


// fonksiyon tanmlanyor
//ancak fonksiyon pi deeri dndryor

return 3.1415926536;
}
main()
{
double pi_degeri;
pi_degeri = pi();
//pi fonksiyonuyla pi deeri alnyor
printf(%d\n,pi_degeri);
}

3.4 Fonksiyon Argmanlarnn Kullanm


Fonksiyon argman fonksiyon arlrken, fonksiyona aktarlan deerdir. C
fonksiyona birok argmann aktarlmasna izin vermektedir. Bir fonksiyonun
kabul edebilecei argman says derleyiciye bal olmakla birlikte, ANSI C
standardna gre bir fonksiyon en az 31 argman kabul edebilmelidir.
Bir fonksiyon tanmlandnda, parametreleri alacak zel deikenlerin bildirimi
yaplmaldr. Bu zel deikenler formal parametrelerdir. Parametreler
fonksiyonun isminden sonra parantez iinde belirtilirler. rnein, aadaki
fonksiyon arld zaman kendisine iletilen iki tam saynn toplamn hesaplar
ekrana yazar:
void topla(int a, int b)
{
printf(%d\n,a+b);
}

Bu fonksyonun bir programda arlmasna dair bir rnek:


void topla(int a, int b);
main()
{
topla(1,10);
topla(15,6);
topla(100,25);
}
void topla(int a, int b)
{
printf(%d\n,a+b);
}

//Fonksiyon prototipi

topla() arldnda derleyici her bir argmann deerini a ve b


deikenlerine kopyalayacaktr. Unutmamak gerekir ki fonksiyona iletilen
deerlere (1,10,15,6,100,25) argman, a ve b deikenlerine formal
parametre ad verilmektedir.
PICPROJE EKB EVR GRUBU

40

www.picproje.org

Fonksiyonlara argmanlar iki ekilde iletilebilir. lk yola deerle arma


denilmektedir. Bu metod, argmanlarn deerini fonksiyonun formal
parametrelerine kopyalar. Formal parametrede yaplan herhangi bir deiiklik
argman deerini etkilemez. kinci metodun ad referans ile armadr. Bu
metotta argmann adresi fonksiyondaki formal parametreye kopyalanr. Bu
fonksiyon iinde formal parametre, arld yerdeki gerek deikene eriim
iin kullanlr. Bu, formal parametre kullanlarak deikenin deerinin
deitirilebilecei anlamna gelmektedir. Bunu iaretiler konusunda ayrntl
olarak inceleyeceiz. imdilik, fonksiyonlara argmanlarn iletilmesinde
sadece deerle arma yntemini kullanacaz.
ALITIRMALAR:
1. Bir tam say deeri alan ve bunu ekrana yazdran fonksiyonu yazn.
2. Bu programda yanl olan ne?
yazdir(int sayi)
{
printf(%d\n,sayi);
}
main()
{
yazdir(156.7);
}

3.5 Deer Dndrmek iin Fonksiyonlarn Kullanm


C dilinde herhangi bir fonksiyon arld yere bir deer dndrebilir. Tipik
olarak, fonksiyon eittir (=) iaretinin sa tarafna konulur. Dndrlen deerin
illa bir atama deyiminde kullanlmas gerekmez, ayrca bir printf() ifadesinde
de kullanlabilir. Derleyiciye fonksiyonun bir deer dndreceini belirtmek iin
kullanlan genel biim:
tip fonksiyon_ismi(formal parametreler)
{
<ifadeler>
return deger;
}

tip fonksiyonun dndrecei deerin veri tipini belirtmektedir. Bir fonksiyon dizi
dnda herhangi bir veri tipi deeri dndrebilir. Eer herhangi bir veri tipi
belirtilmezse, C derleyicisi fonksiyonun tam say (integer - int) deeri
dndrdn varsayar. Eer fonksiyonunuz deer dndrmyorsa, ANSI C
standard fonksiyonun void dndrmesi gerektiini belirtir. Bu derleyiciye
fonksiyonun bir deer dndrmediini anlatr. Aadaki fonksiyon deer
dndren bir fonksiyona tipik bir rnektir.
#include <math.h>
main()
{
double sonuc;

PICPROJE EKB EVR GRUBU

41

www.picproje.org

sonuc = sqrt(16.0);
printf(%f\n,sonuc);
}

Bu program kayar noktal say deeri dndren sqrt() fonksiyonunu


armaktadr. Bu say deeri sonuc deikenine atanmaktadr. math.h balk
dosyasnn kullanldna dikkat edin. Bu dosya saylarn karekkn alan sqrt()
fonksiyonu hakkndaki bilgileri tamaktadr.
Fonksiyonun dndrecei deerin veri tipi ile bu dndrlen deerin
atanaca deikenin veri tipinin ayn olmasna dikkat etmelisiniz. Ayn ey
fonksiyona gndereceiniz argmanlar iin de geerli. yleyse, bir
fonksiyondan nasl deer dndreceiz? Genel biim u ekildedir:
return degisken_ismi;

degisken_ismi bir sabit, deiken veya dndrlen deerin veri tipindeki


herhangi geerli bir C ifadesi olabilir. Aadaki rnekte her iki tipte fonksiyona
ait rnek vardr:
fonk();
topla(int a, int b);
main()
{
int sayi;
sayi = fonk();
printf(%d\n, sayi);
sayi = topla(5,127);
printf(%d\n,sayi);
}
fonk(){return 6;}
topla(int a, int b)
{
int sonuc;
sonuc= a + b;
return sonuc;
}

Dikkat edilmesi gereken bir nokta, return ifadesine gelindiinde fonksiyonun


arld yere dnlddr. return ifadesinden sonraki ifadeler
iletilmeyecektir. Bir fonksiyonun dndrd deerin bir deikene aktarlmas
veya bir ifadede kullanlmas her zaman gerekli deildir. Ancak bu durumda
dndrlen deer kaybolacaktr.
ALITIRMALAR:
1. 1 ve 100 arasnda tam say deerlerini kabul eden ve bu saynn karekkn
dndren fonksiyonu yaznz.
2. Bu fonksiyonda yanl olan ne?
main()
{
double sonuc;
sonuc = f1();

PICPROJE EKB EVR GRUBU

42

www.picproje.org

printf(%f\n,sonuc);
}
int f1()
{
return 60;
}

3.6 Klasik ve Modern Fonksiyon Bildirimleri


Cnin orijinal versiyonunda formal parametrelerin bildirimlerinde farkl bir
metod kullanlmtr. Aada gsterilen bu biim, imdi klasik biim olarak
adlandrlyor.
tip
tip
tip
.
tip
{

function_name(deg1,deg2,...degn)
deg1;
deg2;
degn;
<ifadeler>

Bildirimin iki blmden olutuuna dikkat edin. Parantez iinde yalnzca


parametrelerin isimleri bulunmaktadr. Parantezlerin dnda veri tipleri ve
formal parametrelerin isimleri belirtilmitir.
nceki rnekte inceledeimiz modern biim ise u ekildedir:
tip fonksiyon_ismi(tip deg 1,...tip var n)

Bu fonksiyon bildiriminde, veri tipleri ve formal parametre isimleri parantez


iinde belirtilmitir.
ANSI C standard her iki fonksiyon bildirimine de izin vermektedir. Buradaki
ama, milyarlarca satr olan eski C programlaryla uyumluluu salamaktr.
Eer bir kodda klasik biimi grrseniz endielenmeyin: C derleyiciniz bu
durumla baa kabilmelidir. Ancak yeni programlarnzda modern biimi
tercih etmelisiniz.
ALITIRMALAR:
1. Fonksiyon prototipi nedir ve bunu kullanmann faydalar nelerdir?
2. Aadaki program klasik fonksiyon biimini kullanarak, modern biime
evirin.
void main(void)
{
printf(alan = %d\n, alan(10,15));
}
alan(1,w)
int 1,w
{
return 1*w;
}

PICPROJE EKB EVR GRUBU

43

www.picproje.org

3.7 Dizge(string) Sabitlerin Fonksiyonlara letilmesi


PICmicro Mikrodenetleyicileri ROM eriiminde baz kstlamalara sahip
olduundan, dizge(string) sabitleri fonksiyonlara normal yoldan iletilemezler.
CCS C derleyicisi bu sorunu standart d bir ekilde amaktadr: Eer dizge
sabiti sadece bir karakter parametresine sahip fonksiyona iletilecekse,
dizgedeki her bir karakter iin ayr ayr arlr. rnein:
void lcd_yaz(char c)
{
.....
}
lcd_yaz(abcd);

aadakine edeerdir:
lcd_yaz(a);
lcd_yaz(b);
lcd_yaz(c);
lcd_yaz(d);

4. C Operatrleri
fadeler Cde nemli rol oynar. Bunun en byk sebebi Cde dier dillere gre
daha ok operatr tanmlanmtr. Bir ifade operatrler ve operandlarn
bileimidir. Birok durumda C operatrleri cebir kurallarn takip eder ve gze
anlalr gelir.
Bu blmde aada saylan operatrleri inceleyeceiz:
Aritmetik
likisel
Mantksal
Bit lemleri

PICPROJE EKB EVR GRUBU

44

www.picproje.org

Artrma ve Azaltma Operatrleri


Opertrlerin ncelik Sralamas

4.1 Aritmetik Operatrler


C dili toplama, karma, arpma, blme ve mod ilemi olmak zere 5
aritmetik ilem operatr tanmlar:
+
*
/
%

toplama
karma
arpma
blme
kalan

+, -, * ve / operatrleri herhangi bir veri tipiyle kullanlabilir. %, operatr


yalnzca tamsaylarla birlikte kullanlabilir. Kalan operatr tamsayl blmede
kalan verir. Dolaysyla bu operatr kayar noktal say ilemlerinde anlam ifade
etmez.
Operatr iki ekilde kullanlabilir: karma operatr olarak ve ikinci olarak
da bir saynn iaretini deitirmek iin kullanlabilir. Aadaki rneklerde bu iki
kullanm gsteriliyor:
a
a

=
=

a b
;karma
-a
;ann iaretinin deitirilmesi

Aritmetik operatrler her hangi bir sabit kombinasyonu ve/veya deikenlerle


kullanlabilir. rnein, aadaki geerli bir C ifadesidir:
sonuc = sayac 163;

C ayrca aritmetik ilem operatrlerinin kullanmyla ilgili baz ksayollarn


kullanmna olanak verir. nceki rneklerdeki, a = a b; ifadesi a -=b; eklinde
de yazlabilir. Bu metod +, -, *, ve / operatrleri iin de geerlidir. Aada bu
ksa yollarla ilgili rnekler grlmektedir:
a*=b
a/=b
a+=b
a-=b
a%=b
a<<=b
a>>=b
a&=b
a|=b
a^=b

a=a*b
a=a/b
a=a+b
a=a-b
a=a%b
a=a<<b
a=a>>b
a=a&b
a=a|b
a=a^b

edeerdir

C kodunu ve derlenmi assembly kodunu karlatrarak aritmetik ilemlerin PIC


ile nasl gerekletirildiini grelim:
int a,b,c;

PICPROJE EKB EVR GRUBU

45

www.picproje.org

a = b + c;

ifadeleri u ekle dnr:


0007:
0008:
0009:

MOVF
ADDWF
MOVWF

0F,W
10,W
0E

; byi ykle
; cyi bye ekle
;sonucu aya kaydet

a = b - c;

ifadeleri u ekle dnr:


0007:
0008:
0009:
000A:

MOVF
MOVWF
MOVF
SUBWF

0F,W
0E
10,W
0E,F

;
;
;
;

byi ykle
aya kaydet
cyi ykle
adan kar

Derleyicinin rettii kodu anlamann nemi problemlerle urarken ortaya


kmaktadr. Birok zaman derleyici liste dosyasna bakmak (.LST) birok C
hatasnn bulunmasn salar. En ok yaplan hatalardan biri = ve ==
operatrlerinin kullanmndadr.
a = b;

ifadesi u ekle dnr:


0007:
0008:

MOVF 0F,W
MOVWF 0E

; byi ykle
; aya kaydet

buna karn
a==b;
ifadesi u ekle dnr:
0007:
0008:
0009:
000A:

MOVF
SUBWF
BTFSC
GOTO

0F,W
0E,F
03,2
00D

;
;
;
;

byi ykle
adan kar
sonuc sfr m test et
evet yleyse dallan

lk rnekte a bye eitlenmektedir. kinci de ise a nn bye eit olup olmad


test edilmektedir.
ALITIRMALAR:
1. 5/5, 5/4, 5/3, 5/2, ve 5/1 ilemlerinde kalan hesaplayan program yaznz.
2. Bir yl iindeki saniye saysn hesaplayan program yaznz.

4.2 likisel Operatrler


Cdeki ilikisel operatrler iki deeri karlatrr ve sonuta doru ya da yanl
gibi bir sonu dndrr. likisel operatrler unlardr:

PICPROJE EKB EVR GRUBU

46

www.picproje.org

>
>=
<
<=
==
!=

byktr
byktr ya da eittir
kktr
kk ya da eittir
eittir
eit deildir

likisel opetarlerde dndrlen sonu her zaman ya 0 ya da 1dir. Ancak C


her hangi sfr-olmayan bir deeri doru (1) olarak deerlendirir. Yanl deer
her zaman 0 olarak tanmldr.
Aada ilikisel operatrlerin kullanld baz ifadeler grlmektedir.
sayi > 15 ; eer sayi 15e eit ya da 15ten kkse sonu 0dr.
(yanl)
sayi != 15; eer sayi 15ten byk ya da 15ten kkse sonu 1dir.
(doru)

ALITIRMALAR:
1. Aadaki ifadeyi farkl bir ilikisel operatr kullanara yeniden yazn!
sayac != 0

2. Aadaki ifade ne zaman doru ya da yanltr? Neden?


sayac>= 35

4.3 Mantksal Operatrler


Mantksal operatrler VE(AND),VEYA(OR) ve DEL(NOT) gibi temel lojik
ilemleri desteklerler. Bu operatrler de sonu olarak yanl iin 0, doru iin 1
deerini dndrrler. Lojik operatrler ve doruluk tablolar aada verilmitir.
p
0
0
1
1

q
0
1
0
1

AND
p&&q
0
0
0
1

OR
p||q
0
1
1
1

NOT
!p
1
1
0
0

Mantksal ve ilikisel operatrler birarada kullanlarak ifadeler oluturulabilir.


Buna bir rnek verecek olursak:
sayac>maks || !(maks==57) && deg>=0

Cde ilikisel ve mantksal operatrlerin program kontrol ifadelerinde


kullanmn bir sonraki blmde greceiz.
ALITIRMALAR:
1. Aadaki ifadeleri herhangi ilikisel ve mantksal operatr bileimlerini
kullanarak yeniden yazn.
sayac == 0
sonuc <= 5

PICPROJE EKB EVR GRUBU

47

www.picproje.org

2. C de zel VEYA (XOR) ilemi iin bir operatr bulunmadndan, aadaki


doruluk tablosuna gre bir XOR fonksiyonu yazn.
p
0
0
1
1

q
0
1
0
1

XOR
0
1
1
0

4.4 Bit lem Operatrleri


Cde bitler zerinde ilem yapabilmek zere 6 zel operatr bulunmaktadr. Bu
operatrler yalnzca tamsay ve karakter veri tipleriyle birlikte kullanlabilirler.
Bit ilem operatleri:
&
|
^
~
>>
<<

bit ilem AND


bit ilem OR
bit ilem XOR
1e tmleyeni
saa kaydrma
sola kaydrma

Kaydrma operatrlerinin genel kullanm biimi:


degisken<< ifade
degisken >> ifade

ifade nin deeri degisken in bitlerinin ka kere kaydrlacan belirtir. Her bir
sola kaydrma ilemi, btn bitleri bir pozisyon sola kaydrr ve sa tarafa 0
deeri verilir. Deikenin en sonundaki bitin deeri kaybolur.
Saa ve sola kaydrma ilemleri ile ilgili nemli bir zellik, sola kaydrmak 2 ile
arpma ilemine, saa kaydrmak ise 2 ile blme ilemine edeerdir.
Kaydrma ilemleri MBnin alma sisteminden dolay aritmetik ilemlerden
daha hzldrlar.
Aada btn bit ilem operatrlerine ilikin rnekler verilmitir:

&

AND
00000101
00000110
- - - - 00000100

(5)
(6)
- - - - - - - (4)

XOR
00000101
(5)
^
00000110
(6)
- - - - - - - - - - - - - - - 00000011
(3)

PICPROJE EKB EVR GRUBU

48

OR
00000101
(5)
00000110
(6)
- - - - - - - - - - - - - 00000111
(7)
NOT (1e tmleme)
00000101
(5)
- - - - - - - - - - - - - 11111010
(250)

www.picproje.org

LEFT SHIFT
00000101
(5)
<< 2
- - - - - - - - - - - - 00010100
(20)

RIGHT
00000101
>> 2
- - - - - 00000001

SHIFT
(5)
- - - - - - - (1)

NOT:
Bir ilenenin bit saysndan fazla sayda kaydrma yapmayn tanmsz sonuc
a = b | c;

u ekle dntrlr:
0007:
0008:
0009:

MOVF 0F,W
IORWF 10,W
MOVWF 0E

; byi ykle
; c ile veya ilemine sok
; sonucu aya kaydet

a = b & c;

u ekle dntrlr:
0007:
0008:
0009:

MOVF 0F,W
ANDWF 10,W
MOVWF 0E

; byi ykle
; c ile VE ilemine sok
; sonucu aya kaydet

a = b >> 3;

u ekle dntrlr:
0007:
0008:
0009:
000A:
000B:
000C:
000D:

MOVF
MOVWF
RRF
RRF
RRF
MOVLW
ANDWF

0F,W
0E
0E,F
0E,F
0E,F
1F
0E,F

;
;
;
;
;
;
;

byi ykle
aya kaydet
ierii
3 kere
saa kaydr
ann ierii iin
maskeleme yap

j = ~a;

u ekle dntrlr:
0007:
0008:
0009:

MOVF 0F,W
MOVWF 0E
COMF 0E,F

; ay ykle
; jye kaydet
; jnin tersini al

ALITIRMALAR:
1. aretli karakter tipindeki bir deikenin sadece MSBini tersleyen bir program
yaznz.
2. Karakter tipindeki bir saynn ikili say eklini gsteren bir program yaznz.

4.5 Artrma ve Azaltma Operatrleri


Bir deikenin deerini nasl bir arttrr veya azaltrsnz? Muhtemelen aklnza u
ifadeler gelmektedir:

PICPROJE EKB EVR GRUBU

49

www.picproje.org

a = a+1;

veya

a = a-1;

Cnin tasarmclar bir artrma ve azaltma iin bir ksayol oluturmulardr. Genel
biim u ekildedir:
a++;
a--;

veya
veya

artrma iin
azaltma iin

++a;
--a;

++ veya -- iaretleri deikenlerin nnde yer aldnda, deikenin deeri


nce bir artrlr veya azaltlr ardndan ifadede kullanlr. ++ veya -- iaretleri
deikenlerin sonunda yer aldnda ise, deikenin deeri nce ifadede
kullanlr ardndan bir artrlr veya azaltlr.
int j, a = 3;
0007:
0008:
j = ++a;
0009:
000A:
000B:

MOVLW 03
MOVWF 0F

ann deeri yazmaca atand

INCF 0F,F
MOVF 0F,W
MOVWF 0E

;
;
;

a = 4
ann deerini w yazmacna ykle
w yazmacn jye kaydet

j = a++;
000C:
000D:
000E:

MOVF 0F,W
INCF 0F,F
MOVWF 0E

;
;
;

ann deerini w yazmacna ykle


a = 5
j = 4

NOT:
Aadaki biimi kullanmayn:
a = a++;

nk bu kod u ekle dntrlr:


MOVF
INCF
MOVWF 0E

0E,W
0E,F

; ann deeri wye yklendi


; adaki deer 1 artrld
; artmdan nceki deer tekrar adaki deerin
; zerine yklendi

Aadaki rnekte her iki kullanm biimi de gsterilmektedir:


void main(void)
{
int i,j;
i = 10;
j = i++;
printf(i = %d, j = %d\n,i,j);
i = 10;
j = ++i;
printf(i = %d, j = %d\n,i,j);
}

PICPROJE EKB EVR GRUBU

50

www.picproje.org

lk printf() ifadesi i iin 11 ve j iin 10 yazdracaktr. kinci printf() ifadesi ise i ve


j iin 11 yazdracaktr.

Paralar Birletirmek:
Yazl
toplam
toplam
toplam
toplam

lem
=
=
=
=

a+b++
a+b-a+ ++b
a+ -- b

toplam =
toplam =
b = b+1,
b = b-1,

a+b, b
a+b, b
toplam
toplam

=
=
=
=

b+1
b-1
a+b
a+b

ALITIRMALAR:
1. Aadaki programdaki arttrma ve azaltma ifadelerini yeniden yazn.
void main(void)
{
int a, b;
a = 1;
a = a+1;
b = a;
b = b-1;
printf(a=%d, b=%d\n, a,b);

}
2. Aadaki kodlar iletildiinde a ve b deikenlerinin son deeri ne olur?
a = 0;
b = 0;
a = ++a + b++;
a++;
b++;
b = -a + ++b;

4.6 Operatrlerin ncelik Sralamas


ncelik, operatlerin C derleyicisi tarafndan ilenme sralamasn
belirtmektedir. rnein, programnzda a+b*c ifadesi ile karlaldnda hangi
ilem ilk olarak gerekletirilecektir? Toplama m arpma m? Aada C
derleyicisinin operatrler iin takip ettii ncelik sralamas grlmektedir:
ncelik

Operatr

rnek

1
2

() ++ -sizeof & * + - ~ ! ++ --

(a+b)/c parantez
a=-b art/eksi/DEL/tmleme
artrma/azaltma/sizeof

3
4
5
6

* / %
+ << >>
< > <= >=

a%b arpma/blme/elde
a+b toplama/karma
a=b>>c sola veya saa kayrma
a>=b byk/kk/eit

PICPROJE EKB EVR GRUBU

51

www.picproje.org

7
8
9
10
11
12
13

== !=
&
^
|
&&
||
= *= /= %= += -= <<= >>=
$= ^= |=

a= =b
a=b&c bit ilem VE
a=b^c bit ilem DILAYAN VEYA(XOR)
a=b|c bit ilem VEYA
a=b&&c mantksal VE
a=b||c mantksal VEYA
a+=b atama

Bu operatrlerin bir ksmn henz grmedik. Ancak endielenmeyin ileriki


blmlerde greceiz.
Parantez kullanlarak ilemlerin sralamas belirtilebilir. Parantez kullanarak
ifadelerin nceliinin deitirilmesine dair birka rnek daha:
10-2*5 = 0
(10-2)*5 = 40
sayac*toplam+88/deg-19%sayac
(sayac*toplam) + (88/deg) (19%sayac)

ALITIRMALAR:
1. Aadaki kodlar iletildiinde a ve b deikenlerinin son deeri ne olur?
int a=0,b=0;
a = 6 8+3b++;
b + = -a*2+3*4;

Program kontrol deyimleri

Bu blmde Cde programnzn akn kontrol etmeyi reneceksiniz. Ayrca


ilikisel ve mantksal kontrol operatrlerinin bu kontrol deyimleriyle nasl
kullanlacan ve buna ek olarak nasl kontrol dngleri kurulacan
reneceksiniz.
Bu blm ierisinde ele alnacak kontrol deyimleri :
if
if-else
for
while
do-while
iie dngler
break
continue
switch
null
return

5.1

if deyimi

PICPROJE EKB EVR GRUBU

52

www.picproje.org

if deyimi bir artlandrma deyimidir. if ifadesinde yeralan kod blou bir artn
sonucuna bal olarak icra edilir. Ayrca, deer sfr deil iken doru (true),
deer sfr iken yanltr (false). En basit hali :
if (ifade)
deyim;

NOT: ifadeden sonra ; kullanlmaz.

Bu ifade geerli bir C ifadesi olabilir. if deyimi ifadenin sonucunun doru veya
yanl olduunu deerlendirir. Eer ifade doru ise deyim altrlr. Eer ifade
yanl ise program, deyimi altrmadan devam eder. Basit bir rnek :
if(num>0)
printf(Say pozitif\n);

Bu rnek, ilikisel operatrlerin program kontrol deyimleriyle nasl kullanldn


gsterir. f deyimi ayrca kod bloklarnn altrlmasnn kontrolnde de
kullanlabilir. Genel format yledir :
if (ifade)
{
.
deyim;
.
}

Kod blou { ve } sembollerinin ierisine yerletirilir. Bu, derleyiciye, ifade doru


ise parantezler arasndaki kodlarn altrlacan anlatr. if ve kod blouna bir
rnek :
if (count <0 )
{
count =0;
printf(Count down\n);
}

veya
if(TestMode ==1)
{
... yazdrlacak kodlar...
}

if deyiminde kullanlan dier karlatrma operatrleri :


x
x
x
x
x
x
x
x

== y
!= y
> y
< y
<= y
>= y
&& y
|| y

x eittir y
x eit deildir y
x byktr y
x kktr y
x kk veya eit y
x byk veya eit y
mantksal AND
mantksal OR

Herhangi bir fonskiyonun assembly diline evirilmi bir rnei :

PICPROJE EKB EVR GRUBU

53

www.picproje.org

int j, a =3;
0007: MOVLW 03
0008: MOVWF 0F
if (j == 2)
0009: MOVLW 02
000A: SUBWF 0E,W
000B: BTFSS 03,2
000C: GOTO 00F
{
j = a;
000D: MOVF 0F,W
000E: MOVWF 0E
}

;aya 3 ykle
;wye 2 ykle
;j ile eliini test et
;eer sfr ise atla

;eer sfr ise


;jye ay ykle

Altrmalar :
1.
Aadaki ifadelerin hangilerinin deerleri dorudur?
a.
b.
c.
d.
e.

0
1
1
5*5<25
1==1

2.
Saynn tek veya ift olup olmadn bulan bir fonksiyon yazn. Fonksiyon
kts 0 iken say ift, 1 iken say tek. Bu fonksiyonu 1 ve 2 saylaryla arn.

5.2

if-else deyimleri

Eer ifadenin sonucuna gre altrlacak iki kod blounuz varsa ne


yapardnz? Eer ifade doru ise ilk kod blou altrlacak, eer ifade yanl
ise ikinci kod blou altrlacak. Muhtemelen if deyimi ile else deyimini birlikte
kullanacaktnz. f-else deyiminin genel format yledir :
if (ifade)
deyim1;
else
deyim2;

if-else deyimi iin kod bloklar kullanma format (bir satrdan fazla) :
if (ifade)
{
.
deyim;
.
}
else
{
.
deyim;
.
}

Bir if veya else ifadesini aklda tutmak iin bir ok ifade gerekli olabilir. if veya
else iin sadece bir ifade oldugu zaman {} parantezler kullanlmayabilir.
Tek if-else deyiminin bir rnei :

PICPROJE EKB EVR GRUBU

54

www.picproje.org

if (num<0)
printf(Say negatif.\n);
else
printf(Say pozitif.\n);

Else deyimini eklenmek sizin iin ift ynl karar imkan salar. Fakat, eer
birka if ve else deyimini birletirip, birlikte birka karar almak isteseydiniz ne
yapardnz? Cnin en nemli salad olanak, if ve elseleri kullarak istenilen
sayda durum kontrol edilip karar verebilmesidir. Genel hali yledir :
if (ifade1)
{
.
deyim(ler)
.
}
else if(ifade2)
{
.
deyim(ler)
.
}
else
{
.
deyim(ler)
.
}

Burada kodun icrasnda arta gre seip deerlendirmek iin birka farkl
ifade olabileceini gryoruz. Bunu bir rnekle aklayalm :
if(num == 1)
printf(deger
else if(num == 2)
printf(deger
else if(num == 3)
printf(deger
else
printf(deger

1\n);
2\n);
3\n);
farkli\n);

NOT:
if deyiminin iinde kullanlan karlatrma operatrlerinin tek hali olduu gibi
ift halide bulunmaktadr (tek &, = veya | operatrleri ve ift &&, == veya ||
operatrleri gibi). Yaplan ortak hatalardan biri de; bu operatrlerden birinin
yerine dierini kullanmaktr. Bu kodlar belki hatasz derlenecektir fakat
program hatal ileyecektir.

Altrmalar :
1.
Bu kod parac iindeki hatalar nelerdir?
if (sayac>20)
printf(sayac 20 den buyuk);
sayac- ;

PICPROJE EKB EVR GRUBU

55

www.picproje.org

2.
Verilen saynn iinde ka tane 5, 10, 25, 50 ve 100 says bulunduunu
bulan bir program yaznz.

5.3

? operatr

Koul operatr (conditional operator) C dilinin 3 ileneni alan tek


operatrdr. (ternary operator) Koul operatrnn 3 ileneni, ifade tanmna
uygun herhangi bir ifade olabilir. Koul operatrnn genel yazm aadaki
gibidir:
ifade1 ? ifade2 : ifade3

Koul operatr yukardaki biimden de grld gibi birbirinden ayrlm iki


iaretten olumaktadr. ? ve : iareteri operatrn 3 ileneni birbirinden ayrr.
Derleyici bir koul operatr ile karlatn ? iaretinden anlar ve ? iaretinin
solundaki ifadenin (ifade1) saysal deerini hesaplar. Eer ifade1in deeri 0
d bir saysal deerse, bu durum koul operatr tarafndan doru olarak
deerlendirilir ve bu durumda yalnzca ifade2nin saysal deeri hesaplanr.
Eer ifade1in deeri 0 ise bu durum koul operatr tarafndan yanl olarak
deerlendirilir ve bu durumda yalnzca ifade3n saysal deeri hesaplanr.
Dier operatrlerde olduu gibi koul operatr de bir deer retir. Koul
operatrnn rettii deer ifade1 doru ise (0 d bir deer ise) ifade2nin
deeri, ifade1 yanl ise ifade3n deeridir. rnek:
m = x > 3 ? y + 5 : y 5;

Burada nce x > 3 ifadesinin saysal deeri hesaplanacaktr. Bu ifade 0 d bir


deerse (yani doru ise) koul operatr y + 5 deerini retecektir. x > 3
ifadesinin deeri 0 ise (yani yanl ise) koul operatr y 5 deerini
retecektir. Bu durumda m deikenine x > 3 ifadesinin doru ya da yanl
olmasna gre y + 5 ya da y 5 deeri atanacaktr.
Ayn ilem if deyimi ile de yaplabilir :
if (x > 3)
m = y + 5;
else
m = y 5;

Koul operatr Operatr ncelik Tablosunun 13. ncelik seviyesindedir. Bu


seviye atama operatrnn hemen stdr. Aadaki ifadeyi ele alalm:
x > 3 ? y + 5 : y 5 = m;

PICPROJE EKB EVR GRUBU

56

www.picproje.org

Koul operatrnn ncelii atama operatrnden daha yksek olduu iin,


nce koul operatr ele alnr. x > 3 ifadesinin DORU olduunu ve
operatrn y + 5 deerini rettiini dnelim. Toplam ifadenin
deerlendirilmesinde kalan ifade
y + 5 = m

olacak ve bu da derleme zaman hatasna yol aacaktr. nk y + 5 ifadesi


sol taraf deeri deildir, nesne gstermez. (Lvalue required hatas verecektir).
Koul operatrnn birinci ksmn (ifade1) parantez iine almak gerekmez.
Ancak, okunabilirlik asndan genellikle parantez iine alnmas tercih edilir.
(x >= y + 3) ? a * a : b;

Koul operatrnn nc operand (ifade3) konusunda dikkatli olmak


gerekir. rnein :
m = a > b ? 20 : 50 + 5;

a > b ifadesinin doru olup olmamasna gre koul operatr 20 ya da 55


deerini retecek ve son olarak da m deikenine koul operatrnn rettii
deer atanacaktr. Ancak m deikenine a > b ? 20 : 50 ifadesinin deerinin 5
fazlas atanmak isteniyorsa bu durumda ifade aadaki gibi dzenlenmelidir:
m = (a > b ? 20 : 50) + 5;

Koul operatrnn 3 ileneni de bir fonksiyon arma ifadesi olabilir, ama


arlan fonksiyonlarn geri dn deeri reten fonksiyonlar olmas (void
olmayan) gerekmektedir. ilenenden biri geri dn deeri void olan bir
fonksiyona ilikin fonksiyon arma ifadesi olursa koul operatr deer
retmeyeceinden bu durum derleme zamannda hata olumasna neden
olacaktr.

5.4

for dngs

For dngleri yalnzca C dilinin deil, belki de tm programlama dillerinin en


gl dng yaplardr. for dnglerinin genel biimi u ekildedir:
for (ifade1; ifade2; ifade3)
deyim1;
for (ifade1; ifade2; ifade3) {
deyim1;
deyim2;
...
}

Derleyici for anahtar szcnden sonra bir parantez almasn ve parantez


ierisinde iki noktal virgl bulunmasn bekler. Bu iki noktal virgl for parantezini

PICPROJE EKB EVR GRUBU

57

www.picproje.org

ksma ayrr. Bu ksmlar yukarda ifade1 ifade2 ve ifade 3 olarak


gsterilmitir.
for parantezi iinde mutlaka 2 noktal virgl bulunmaldr. for parantezi iinin
bo braklmas, ya da for parantezi ierisinde 1, 3 ya da daha fazla noktal
virgln bulunmas derleme zamannda hata olumasna yol aacaktr.
for parantezinin kapanmasndan sonra gelen ilk deyim dng gvdesini
oluturur. Dng gvdesi basit bir deyimden oluabilecei gibi, bileik
deyimden de yani blok iine alnm birden fazla deyimden de oluabilir.
Dng gndesi tek bir ifadeden oluacaksa ifadenin { } arasna alnmasna
gerek yoktur.
for parantezi ierisindeki her ksmn da ayr ayr ilevleri vardr.
for parantezinin 2. ksmn oluturan ifadeye kontrol ifadesi denir. Tpk while
parantezi iindeki ifade gibi, dngnn devam konusunda bu ifade sz
sahibidir. Bu ifadenin deeri 0 d bir deer ise, yani mantksal olarak doru
ise, dng devam eder. Dng gvdesindeki deyim(ler) icra edilir. Kontrol
ifadesinin deeri 0 ise programn ak for dngsnn dndaki ilk deyimle
devam edecektir.
for dngsnn 3. ksm dng gvdesindeki deyim ya da deyimler icra
edildikten sonra, dnte altrlr. Ve ounlukla dng deikeninin
artrlmas ya da azaltlmas amacyla kullanlr. (Byle bir zorunluluk yok.)
for (ilk deer; koul; ilem) {
...
...
...
}
int main()
{
int i;
for (i = 0; i < 2; ++i)
printf(%d\n, i);
printf(son deer = %d\n, i);
return 0;
}

Yukardaki program inceleyelim:


Programn ak for deyimine gelince, nce for parantezi iindeki 1. ifade icra
ediliyor. Yani i dng deikenine 0 deeri atanyor.
imdi programn ak for parantezinin 2. ksmna yani kontrol ifadesine geliyor
ve i < 2 koulu sorgulanyor. Kontrol ifadesinin deeri 0 d bir deer olduu
iin, ifade mantksal olarak doru kabul ediliyor ve programn ak dng
gvdesine geiyor. Dng gvdesi bloklanmad iin, dng gvdesinde tek

PICPROJE EKB EVR GRUBU

58

www.picproje.org

bir deyim var. (basit deyim). Bu deyim icra ediliyor. printf(%d\n, i) ifadesi i=0
iin iletiliyor. Yani ekrana i deikeninin deeri yazlarak imle alt satra
geiriliyor (\n den dolay alt satra geiyor).
Programn ak bu kez for parantezinin 3. ksmna geliyor ve buradaki ifade bir
deyimmi gibi icra edeiliyor, yani i deikeninin deeri 1 artrlyor. i
deikeninin deeri 1 oluyor.
2. ifade yeniden deerlendiriliyor ve i < 2 ifadesi doru olduu iin bir kez
daha dng gvdesi icra ediliyor.
Programn ak yine for parantezinin 3. ksmna geliyor ve buradaki ifade bir
deyimmi gibi icra edeiliyor, yani i deikeninin deeri 1 artrlyor. i
deikeninin deeri 2 oluyor.
Programn ak yine for parantezinin 2. ksmna geliyor ve buradaki kontrol
ifadesi tekrar sorgulanyor. i < 2 ifadesi bu kez yanl olduu iin programn
ak dng gvdesine girmiyor ve programn ak dng gvdesi dndaki ilk
deyimle devam ediyor.
Yani ekrana :
0
1
son deer = 2
yazlyor.
Aada farkl for dngleri bulunmaktadr :
for (num=100; num>0; num=num-1)
for (count=0; count<50; count+=5)
for (count=1; count<10 && error==false; count++)

Bir rnei assemblye dntrp nasl olacan grelim :


int h,a;
for (h=0;h!=10;h++)
0007: CLRF
0E
0008: MOVLW 0A
0009: SUBWF 0E,W
000A: BTFSC 03,2
000B: GOTO
00F
a++;
000C: INCF
0F,F
h++;
000D: INCF
0E,F
000E: GOTO
008

;h temizle
;W kaydedicisine 10 ykle
;h dan kart
;0 m diye test et
;eer h=10, dngden k
;ay arttr
;h arttr
;0008e git (dngye devam)

Altrmalar :
1.
Aadaki for() deyimleri nasl alr?
for(i=1; ;i++)
for( ; ; )
for(num=1; num; num++)

PICPROJE EKB EVR GRUBU

59

www.picproje.org

2.

Saynn tm arpanlarn grntleyen bir program yaznz.

5.5

while dngs

Cdeki dier bir dng de while dngsdr. While dngs, ifade doru
olduu srede deyimi veya kod blounu tekrarlar. Bu nedenle ismi while dr.
Burada genel kullanm grlmektedir :
while (ifade)
deyim;

veya
while (ifade)
{
deyim;
}

fade geerli herhangi bir C ifadesidir. Her seferinde ifadenin deeri deyimden
veya kod bloundan nce kontrol edilir. Bu demek ki, eer ifade yanl (false)
ise deyim veya kod blou hi bir ekilde icra edilmez.
While dngsne bir rnek :
#include <16C74.H>
#use RS232 (Baud=9600, xmit=pin_c6, RCV=pin_c7)
void main(void)
{
char ch;
printf(q ver\n);
ch=getch();
while(ch!=q)
ch=getch();
printf(iste q!\n);
}

Klavyeden istenilen karakteri alnca uyarlacaksnz. yleyse ifade


deerlendirildi. chnin deeri q olmad srece program klavyeden baka bir
deer almaya devam edecektir. lk q alndnda prinf altrlr ve program
sonlanr.
Altrmalar :
1.
Aadaki while deyimleri nasl iler?
a.

b.

while(i<10)
{
printf(%d ,i);
i++;
}
while(1)
printf(%d ,i++);

PICPROJE EKB EVR GRUBU

60

www.picproje.org

2.
Klavyeden ch=getch(); deyimi kullanarak ald verileri ekrana yazdran
ve nceden belirlenmi bir karakter ile karlatnda sonlanan bir program
yaznz.

5.6

do-while dngs

Cdeki son dng do dngsdr. Burada do ve while birletiriyoruz :


do
{
deyimler
}
while(ifade)

Bu ekilde herzaman deyimler, ifade deerlendirilmeden nce icra edilecektir.


ifade belki geerli bir C ifadesidir. do-while iin basit bir rnek :
#include <16C74.H>
#use RS232 (Baud=9600, xmit-pin_c6, RCV=pin_c7)
void main(void)
{
char ch;
do
{
ch = getch();
while(ch != q);
printf(iste q!\n);
}
}

Bu program 5.5inci ksmdaki program ile ayn ii yapmaktadr.


Altrmalar :
1.
5.5inci ksmdaki Altrma 1in hem a hemde b ksmn do-while
kullanarak tekrar yaznz.
2.
5.5inci ksmdaki Altrma 2yi do-while kullanarak tekrar yaznz.

5.7

ie dngler

Bir dngnn gvdesini baka bir kontrol deyimi oluturabilir. Dng gvdesini
oluturan kontrol deyimi bir if deyimi olabilecei gibi baka bir dng
deyimide olabilir. (while, do while, for deyimleri)
int main()
{
int i = 0;
int k = 0;
while (i < 10) {
while (k < 10) {
printf("%d %d", i, k);
++k;
}

PICPROJE EKB EVR GRUBU

61

www.picproje.org

}
++i;
return 0;
}

ie dnglerde ierideki dngde break deyimi kullanldnda yalnzca


ierideki dngden klr, her iki dngden birden kmak iin goto deyimi
kullanlmaldr. (ileride greceiz)
while dngs bir btn olarak tek deyim iinde ele alnr. rnek:
while (1)
while (1) {
.....
.....
.....
}

Burada ikinci while dngs tek bir kontrol deyimi olarak ele alnaca iin,
bloklamaya gerek yoktur.
while dngsnn yanllkla bo deyim ile kapatlmas ok sk yaplan bir
hatadr.
int main()
{
int i = 10;
while (--i > 0);
printf("%d\n", i);
return 0;
}

/* burada bir bo deyim var */

Dng while parantezi ierisindeki ifadenin deeri 0 olana kadar devam eder
ve bo deyim dng gvdesi olarak icra edilir. Dngden kldnda ekrana
0 baslr.
Sonlandrc ; while parantezinden sonra konulursa herhangi bir yazm hatas
olumaz. Derleyici while dngsnn gvdesinin yalnzca bir bo deyimden
olutuu sonucunu kartr. Eer bir yanllk sonucu deil de bilinli olarak
while dngsnn gvdesinde bo deyim (null statement) bulunmas
isteniyorsa, okunabilirlik asndan, bu bo deyim while parantezinden hemen
sonra deil, alt satrda ve bir tab ieriden yazlmaldr.

5.8

Break deyimi

Break anahtar szc ile bir dng sonlandrlabilir. Kullanm


break;

PICPROJE EKB EVR GRUBU

62

www.picproje.org

eklindedir. Programn ak break anahtar szcn grdnde, dng


krlarak dngnn ak dng gvdesi dndaki ilk deyim ile devam eder.
Yani koulsuz olarak dngden klr.
void main(void)
{
int i;
for(i=0;i<50;i++)
{
printf(%d ,i);
if(i==15)
break;
}
}

Bu program ekrana 0-15 aras saylar yazar. Break deyimi tm C dnglerinde


alr.

5.9

Continue deyimi

continue anahtar szc de tpk break anahtar szc gibi bir dng
ierisinde kullanlabilir. Programn ak continue anahtar szcne geldiinde
sanki dng yinelemesi bitmi gibi yeni bir yinelemeye geilir. Eer for dngs
ierisinde kullanlyorsa yeni bir yinelemeye gemeden nce dngnn 3.
ksm yaplr. rnek :
int main()
{
int i, k;
char ch;
for (i = 0; i < 100; ++i) {
if (i % 3 == 0)
continue;
printf("%d\n", i);
}
return 0;
}

break anahtar szc bir dngy sonlandrmak iin, continue anahtar


szc de bir dngnn o anda iinde bulunulan yinelemesini sonlandrmak
iin kullanlr.
continue anahtar szc zellikle, dng ierisinde uzun if deyimlerini varsa,
okunabilirlii artrmak amacyla kullanlr.
for (i = 0; i < n; ++i) {
ch = getch();
if (!isspace(ch)) {
...
...
...
}
}

PICPROJE EKB EVR GRUBU

63

www.picproje.org

Yukardaki kod parasnda dng iinde, klavyeden getch fonksiyonu ile


deer atanan ch deikeni boluk karakteri deilse, bir takm deyimlerin icras
istenmi. Yukardaki durum continue anahtar szcyle daha okunabilir hale
getirilebilir :
for (i = 0; i < n; ++i) {
ch = getch();
if (isspace(ch))
continue;
...
}

n kere dnen for deyimi kalplar


for
for
for
for

(i
(i
(i
(i

=
=
=
=

0; i < n; ++i)
1; i <= n; ++i)
n - 1; i >= 0; --i)
n; i > 0; --i)

Bir dngden kmak iin dng deikeni ile oynamak kt bir tekniktir. Bu
programlar okunabilirlikten uzaklatrr. Bunun yerine break anahtar szc
ile dnglerden klmaldr.

5.10 Sonsuz dnglerden k


1. break anahtar szc ile.
Bu durumda programn ak dng gvdesi dndaki ilk deyime ynlenecektir.
(eer i ie dng varsa break anahtar szc ile yalnzca iteki dngden
klacaktr.)
2. return anahtar szc ile
bu durumda fonksiyonun (main de olabilir) icras sona erecektir.
3. goto anahtar szcyle.
ie birden fazla dng varsa en iteki dng iinden en dtaki dngnn
dna kadar kabiliriz. (goto anahtar szcnn ok az saydaki faydal
kullanmndan biri budur.)
4. exit fonksiyonu ile.

5.11 Switch deyimi


if deyimi birka seenek arasndan seim yapmak iin iyi bir deyimdir, fakat
ortada birka seenek var iken ok biimsiz durmaktadr. switch deyimi birka
if-else deyimi ile ayn anlamdadr. Genel hali u ekildedir :
switch (degisken)
{
case sabit1:
deyim(ler);
break;
case sabit2:

PICPROJE EKB EVR GRUBU

64

www.picproje.org

deyim(ler);
break;
case sabitN:
deyim(ler);
break;
default:
deyim(ler);
}

Degisken, integer veya karakter sabitlerinin listesi iinde srayla test


edilmektedir. Bir e deere rastland zaman, bu sabite ait deyimlerin btn
break; szcne rastlanana kadar icra edilir. Eer hi bir e deere
rastlanamadysa default blm altndaki deyimler icra edilir. Default blm
istee bal olarak kullanlabilir. Switche bir rnek :
main()
{
char ch;
for(;;)
{
ch = getch();
if(ch==x)
return 0;
switch(ch)
{
case 0:
printf(Pazar\n);
break;
case 1:
printf(Pazartesi\n);
break;
case 2:
printf(Sal\n);
break;
case 3:
printf(aramba\n);
break;
case 4:
printf(Perembe\n);
break;
case 5:
printf(Cuma\n);
break;
case 6:
printf(Cumartesi\n);
break;
default:
printf(Geersiz giri\n);
}
}
}

Bu rnek 0 ve 6 aras saylar okuyacak. Eer girilen say bu say aral dnda
ise, Geersiz giri mesaj grntlenecektir. Girilen deer bu araln iinde ise,
say haftann gnlerine dntrlecektir.
LCD ekran zerindeki satrlarda karakter saysn tespit etmede kullanlan bir
baka rnek te u ekildedir. DIP swi ve satrdaki karakter says ayarlar okunur

PICPROJE EKB EVR GRUBU

65

www.picproje.org

sonra dier bitlerinden ayrtrlr (maskeleme) ve bu bilgi ile fonksiyonun


arld yere uygun bir deer dndrlr.
byte cp1_sw_get()
//characters per line
{
byte cp1;
cp1=portd & 0b01110000;
//maskele
switch(cp1)
//imdi decode edilmi veriyi ile
{
case 0x00: cp1 = 8;
break;
case 0x10: cp1 = 16;
break;
case 0x20: cp1 = 20;
break;
case 0x30: cp1 = 28;
break;
default:
cp1 = 40;
break;
}
return(cp1);
//arldn yere veri dndr
}

ANSI Standartlarndaki bir C derleyicisi en az 257 case deyimini desteklemelidir.


Ayn switch iinde ayn iki tane case deeri olamaz. Ayrca, switch deyimleri
iie de olabilirler. Bir ANSI derleyicisi en az 15 iie switch deyimini
desteklemelidir. Aada iie bir switch rnei bulunmaktadr :
switch (a)
{
case 1:
switch (b)
{
case 0:
printf(b yanl);
break;
case 1:
printf(b doru);
break;
}
break;
case 2:
.
.

break szc switch deyimi iinde ayn zamanda istee bal kullanlr. Bu
demek ki iki case deyimi kodun ayn parasn paylaabilirler. Bunu bir rnek
zerinde grelim :
void main(void)
{
int a=6,b=3;
char ch;
printf(T = Toplama\n);
printf(C = karma\n);
printf(P = arpma\n);
printf(B = Blme\n);
printf(Seiminizi giriniz:\n);
ch=getch();
switch (ch)
{
case C:
// *

PICPROJE EKB EVR GRUBU

66

www.picproje.org

b=-b;
case T:
printf(\t\t%d,a+b);
break;
case P:
printf(\t\t%d,a*b);
break;
case B:
printf(\t\t%d,a/b);
break;
default:
printf(\t\tNe dedin?);
}
}

Yukardaki programckta * iaretli ksmda break szc olmad iin


programda karma seildiinde, program b=-b yaptktan sonra bir alttaki
case blm olan toplama blmne geecektir.

5.12 Null deyimi


null deyimi sadece bir noktal virglden (;) oluur. Bir ifadenin bulunabilecei
her hangi bir yerde bulunabilir. Assembly programlarnda bir komut evrimi
beklemeye neden olan nop deyimi gibi null ifadesi iletildiinde hi bir ilem
yaplmaz.
do, for, if ve while ifadelerin, ifade gvdelerinde, herhangi bir iletilebilir
ifadenin bulunmas gerekir. null ifadesi bu durumlarda gerekli yazm
gerekletirir.
for (i=0;i<10;i++)
;

Bu rnekte for line[i++]=0 dng ifadesi line dizisinin 10 elemann sfrlar. fade
gvdesi null olduundan ilave komutlara ihtiya yoktur.

5.13 return deyimi


return ifadesi bir fonksiyonun almasn sonlandrr ve program en son
fonksiyonun arld yere dnerek almasna devam eder.
Fonksiyonlardan bir deer dndrlebilir. Deer dndrlmeyecekse
fonksiyon prototipinde fonksiyonun dndrecei deer void olarak tanmlanr.
GetValue(c)
int c;
{
c++;
return c;
}
void GetNothing(c)
int c;
{

PICPROJE EKB EVR GRUBU

67

www.picproje.org

c++;
return;
}
main()
{
int x;
x = GetValue();
GetNothing();
}

6.

Diziler ve harf dizileri

Bu blmde dizileri ve harf dizilerinden bahsedeceiz. Bir dizi basite ayn veri
tipine sahip birbiriyle ilikili deikenler listesidir. Bir harf dizisi sfrla bitirilen ve en
ok rastlanlan bir karakter dizisidir.
Bu konudaki balklar:
Diziler
Harf dizileri
Tek boyutlu diziler
ok boyutlu diziler
Hazrlama
eklindedir.
6.1 Tek boyutlu diziler
Dizi hepsi ayn isimle adlandrlan ve ayn tipde olan deikenler listesidir.
Dizideki bamsz deiken dizi eleman diye adlandrlr. Bu ilikilendirilmi veri
gruplarn ilemek iin basit bir yoldur.
Tek boyutlu diziyi tanmlamann genel formu aadaki gibidir.
type deiken_ismi [adet];

Type geerli bir C verisidir, deiken_ismi dizinin ismi ve adette dizide ka


eleman olacan belirtir. rnein 50 eleman olan bir dizi aadaki gibi ifade
edilmelidir.
int ykseklik [50] ;

Bir dizi belirtildii zaman, C ilk elemann 0 nc indiste (srada) olduunu


varsayar. Eer dizinin 50 eleman varsa en sondaki elemann indisi 49 dur.
Yukardaki rnei kullanarak diyelim ki ykseklik dizisinin 25 inci elemanna 60
deeri atanmtr. Aadaki rnekte bunun nasl yaplaca gsterilmitir.
ykseklik[24] = 60 ;

PICPROJE EKB EVR GRUBU

68

www.picproje.org

C tek boyutlu dizileri boluksuz olarak hafza konumlarna yerletirir. lk eleman


en dk adrestedir. Aadaki kodu altrdmz zaman ..
int num[10];
int i;
for (i=0;i<10;i++)
num[i] = i;

dizinin hafzadaki grnts aadaki gibi olacaktr.


Eleman

1
0

2
1

3
2

4
3

5
4

6
5

7
6

8
7

9
8

10
9

Herhangi bir dizi eleman programda deiken yada sabit deer olarak
herhangi bir yerde kullanlabilir. Aadaki dier rnekte basite dizi
elemanna indisin karesini atamakta, sonrada bu elemanlar yazmaktadr.
#include <16c74.h>
void main ( void)
{
int num[10];
int i;
for ( i = 0 ; i<10 ; i++)
num[i] = i * i ;
for ( i = 0 ; i<10 ; i++)
printf ( %d , num[i] );
}

Bir dizide 10 eleman olup kazayla 11 inci elemanna bir deer atadnzda ne
olabilir? C dili dizi indis limitlerini kontrol etmez. Bu sebepten dolay dizide
belirtilmeyen bir eleman okur ya da yazabilirsiniz. Bu bir ekilde beklenmeyen
sonular dourabilir. Sk sk bu olay programn kmesine ve bazen de
bilgisayarn kmesinede sebeb verebilir. C dili bir dizinin deerini baka bir
dizine aadaki ekil ile atama yaplmasna izin vermez.
int a [ 10 ] , b [ 10 ] ;
.
.
a = b ;

Yukardaki rnek yanltr. Bir dizinin ieriini teki diziye kopyalamak isterseniz ,
her bamsz eleman birinci diziden ikinci diziye kopyalamanz gerekmektedir.
Aadaki rnek iinde 20 eleman olan a[] dizisinin b[] dizisine nasl
kopyalanacan gsterir.
for (i = 0;i < 20;i++)
b[i] = a[i];

ALITIRMA:
1.Aadaki kod parasnda ne yanltr?

PICPROJE EKB EVR GRUBU

69

www.picproje.org

int i;
char count [10];
for(i = 0;i < 100;i++)
count[i] = getch ( ) ;

2. getch() fonksiyonunu kulanarak klavyeden girilen ilk 10 karakteri


okuyabilecek bir program yazn. Bu program bu karakterlerden uyan kt
zaman bir uyarda bulunsun.
6.2 Harf dizileri
En ok rastlanlan tek boyutlu diziler harf dizileridir. C dilinde harf dizisi ile ilgili bir
veri ekli yoktur. Onun yerine tek boyutlu karakter dizilerini kullanr. Bir harf dizini
0 (sfr) olarak gsterilir. Eer her harf dizini sfr ile sonlandrlacaksa, diziyi bir
fazlas eleman ile tanmlamak gerekmektedir. Bu fazla eleman ierii sfr
olacaktr. C dilindeki btn harf dizi sabitleri otomatik olarak sfr ile sonlandrlr.
Klavyeyi kullanarak programdaki bir harf dizisine nasl giri yapabiliriz? gets(str)
fonksiyonu satr ba dmesine baslana kadar klavyeden baslan karakterleri
okur. Okunan karakter dizisi tanmlanan str dizisine kaydedilir. Str dizisinin
uzunluunun girilen karakter saysndan dizinin sfrla sonlandrlacandan en
az bir fazla olmas gerekmektedir.
Gets() fonksiyonun nasl kullanlacan bir rnekle gsterelim.
void main ( void )
{
char star[80] ;
int i ;
printf(Bir cumle gir ( < 80 karakter) :\n);
gets(str);
for(i=0;str[i];i++)
printf (%c,str[i]);
printf(\n%s,str);
}

Burda harf dizisinin nasl baslacan iki ekilde grmekteyiz : %c yi kullanarak


karakter dizisi eklinde yada %s yi kullanarak harf dizisi eklinde.
ALITIRMA:
1.Bu programdaki hata nerde? Strcpy() fonksiyonu ikinci argmenti birinciye
kopyalyor.
#include <string.h>
void main ( void )
{
char str [16] ;
strcpy (str,PicProje nerede?);
printf (str) ;
}

2.

Ekrandaki harfleri okuyan vede bunlar ekrana ters srada yazabilen bir

PICPROJE EKB EVR GRUBU

70

www.picproje.org

program yazn.
6.3

ok boyutlu diziler

C dili tek boyutlu diziler ile snrl deildir. sterseniz iki yada daha fazla boyutda
dizi yaratabilirsiniz. rnein, 5x5 eleman olan integer dizisi yaratmak iin,
kullanmamz gereken ekil aadaki gibidir:
int number[5][5];

//25 hafza yeri

Ek boyutlar basite keli parantez setini ekliyerek oaltabiliriz. Biz burda


basitlik olsun diye iki boyutlu dizileri konuacaz. ki boyutlu dizi en iyi satr stun
eklinde anlatlabilir. Bunun iin iki boyutlu diziler soldan saa ksa zamanda
ulalabilir. zleyen rnekte 5x5 dizinin grafiksel gsterimini gsterir.
ki boyutlu diziler tek boyutlu diziler gibi kullanlabilir. rnein aadaki
program 5x4 lk diziyi indislerin arpm ile doldurur sonrada dizi ieriini stun
satr eklinde gsterir.
void main ( void )
{
int array [5] [4] ;
int i , j ;
for ( i = 0 ; i < 5 ; i++ )
for ( j = 0 ; j < 4 ; j++ )
array [i] [j] = i * j ;
for ( i = 0 ; i < 5 ; i++)
{
for (j = 0 ; j < 4 ; j++ )
printf (%d , array [i] [j] ) ;
printf (\n);
}
}

Programn kts bu ekilde olmaldr:


0
0
0
0
0

0
1
2
3
4

0
2
4
6
8

0
3
6
9
12

Grdnz gibi, ok boyutlu dizileri kullandnzda bamsz deikenlerin


says artmaktadr. Gnmzde kullanlan PIC MCU larn hafzalar olduka
genitir.
ALITIRMA:
1. 3x3x3 lk bir diziyi tanmlayan vede 1 den 27 e kadar olan saylar bu diziyi
atayan bir program yazn. Ekrana da kty yazdrn.
2. Birinci program kullanarak her stunun vede satrn toplamnn ktsn aln.

PICPROJE EKB EVR GRUBU

71

www.picproje.org

6.4 Dizileri hazrlama


imdiye kadar bamsz dizi elemanlarna deerler atanm olarak grdk. C
dili dizilere bir deikenmi gibi deer atanmasna imkan verecek metoda
sahiptir. Tek boyutlu dizilerin genel ekli aadaki gibidir.
type dizi_ismi[adet] = {deer_listesi};

Deer_listesi dizi tipine uygun virgllerle ayrlm sabitler listesidir. lk sabit ilk
elemann yerine, ikinci sabit ikinci elemann yerine ve srayla btn sabitler
elemanlarn yerine yerletirilir. zleyen rnekte 5 elemanl integer dizisinin
hazrlanmasn gstermektedir.
int i[5]={1,2,3,4,5};

i[0] tanml dizi elemann deeri 1 ve i[4] tanml elemann deeri 5 olacaktr.
Harf dizisi (karakter dizisi) iki trl hazrlanabilir. Birincisi birbirinden bamsz
karakter listesi yapmak:
char str[3]={'a','b','c');

kinci tr ise ekteki rnekte grdnz gibi trnak iinde harf dizisi yaratmaktr.
char name[5]=Veli;

Kuyruklu parantezlerle harf dizinini kapatmadmz dikkatinizi ekmitir. Bu tip


hazrlamada bunlar kullanlmaz nk C dilinde harf dizinleri sfrla bitmek
zorundadr. Derleyici Veli nin sonuna otomatikman bir sfr ekler.
ok boyutlu diziler tek boyutlu diziler gibi hazrlanr. ki boyutlu dizileri
hazrlarken stun satr eklinde hazrlanmas daha kolaydr. zleyen rnekde 3x3
dizinin hazrlanmasn gsterelim.
nt num[3][3]={1,2,3,
4,5,6,
7,8,9};

ALITIRMA:
1. Aadaki tanmlama dorumudur?
int count[3]=10,0,5.6,15.7;

2. Bir saynn karesini ve kbn belirten bir tablosu olan program yazn. Her
satrda say, saynn karesi ve saynn kp olmaldr. Saylarla ilgili bilgileri ieren
9X3 bir dizi yaratn.

PICPROJE EKB EVR GRUBU

72

www.picproje.org

rutinini kullanarak kulancdan say girmesini isteyin. Sonrada


bu saynn, karesinin ve kbnn ktsn aln.
Scanf(%d,&num);

6.5 Katar ( harf dizileri ) dizileri


Katar dizinleri C dilinde ok rastlanr. teki diziler gibi tanmlanr ve hazrlanr.
Kullanma ekilleri dier dizilere gre biraz daha deiiktir. rnein, izleyen
tanmlama ne ifade eder?
char isim[10][40];

Bu durum isim dizisinin 10 adet ayr 40 karakter uzunluunda (sfr dahil) ismi
ierdiini belirtir. Bu tablodan bir harf dizisine ulamak istediinizde, ilk indisi
belirtmelisiniz. rnein bu dizinin beinci isminden kt almak iin, izleyen ekli
kullanmalsnz.
printf(%s,isimler[4]);

ki boyutdan byk diziler iinde aynsn yapmalsnz. rnein hayvanlar dizisi


aadaki gibi tanmlandrlmaldr.
char hayvanlar[5][4][80];

Belirtilmi bir harf dizinine ulamak iin ilk iki boyutu kullanmanz gerekmektedir.
Mesela nc listedeki ikinci harf dizinine erimek iin, hayvanlar [2][1]
yazlmas gerekir.
Altrma:
1. 0 dan 9 kadar olan saylarn isimlerini ieren harf dizini tablosunu yazan bir
program yazn. Kullancya tek bir rakkam girmesine izin verin ve proramnz ilgili
ismi gstersin. Tablodaki indise ulamak iin girilen karakterden '0' kartn.
6.6 Harf dizini fonksiyonlar
Harf dizinleri program iersinde bir ok yolla deitirilebilir. Buna bir rnek
strcpy komutu ile kaynak dizinin hedef dizine kopyalanmasdr ki bu da sabit
harf dizinini alabilir hafzaya aktarr.
#include <string.h>
// harf dizini fonksiyonlar iin ktphane
char string[8];
// harf dizinini tanmlama
strcpy (string,Merhaba) ; // Karakterleri dizine kopyalama

PIC MCU larda sabit hafza iaretilerin geerli olmadn dikkat edin. Sabit
harf dizinlerini strlen(hi) gibi fonksiyonlara aktaramazsnz.
rnekler:
char s1[10], s2[10];
strcpy(s1,abc);

PICPROJE EKB EVR GRUBU

73

www.picproje.org

strcpy(s2,def);
strcat(s1,s2);
printf(%u,strlen(s1));
printf(s1);

// kan kt 6 dr
// kan kt abcdef dir

if (strcmp(s1,s2)!=0)printf( Ayns deildir);

Dier harf dizin fonksiyonlar aadadr:


strcat
strchr
strrchr
strcmp
strncmp
stricmp
strncpy
strlen
strlwr
strpbrk
strstr

ki harf dizisini birletirir


lk karaktere bakar
Son karaktere bakar
ki harf dizisini karlatrr
ki dizindeki karakter saysn karlatrr
Byk kk harflere dikkat etmeden iki dizini karlatrr
Bir dizindeki belli bir saydaki karakterleri teki dizine kopyalar
Bir dizinin uzunluunu verir
Byk harfleri kk harflerle deitirir
ki dizideki ilk uyan karakteri bulur
Bir harf dizisindeki ilk belirtilen karakter srasn bulur

Deitirlecek harf dizisindeki byklklerin uymasna dikkat edin.

7. aretiler
Bu blm, C dilinin en nemli ve bir o kadar da kafa kartrc zellii olan
iaretiler hakknda bilgi iermektedir. Temel olarak iareti, bir nesnenin
adresidir.
Bu blmde inceleyeceimiz baz balklar;
areti temelleri,
aretiler ve diziler,
aretileri Fonksiyonlarda kullanmak

7.1 aretilere giri


Bir iareti, bir hafza blgesinin adresini ierisinde barndran bir hafza blgesi
deikenidir.
rnein; a deikeni b deikeninin adresini barndryorsa; a, b'yi gsteriyor
(iaret ediyor) demektir. Eer b deikeninin hafzadaki bulunduu adres 100
ise, a deikeninin deeri 100 olacaktr.
Bir iareti deikeni tanmlamann genel format u ekildedir:
Tip

*degisken_adi;

Tip, C iin geerli olan bir veri tipidir. Sz konusu deiken adnn gsterecei
deikenlerin veri tipini belirler. Deiken adnn banda bulunan * iareti ise
tanmlanan bu deikenin bir iareti tipi deiken olduunu belirtir.
rnein u ifade bir tamsay(integer) tipi iareti deikeni tanmlar:
PICPROJE EKB EVR GRUBU

74

www.picproje.org

int *ptr;

aretiler ile ilgili iki zel karakter vardr: * ve & . Bir nesnenin adresi &
operatr ile elde edilebilir. * operatr ile ise bir hafza blgesinde bulunan
deeri getirir.
rnein;
#include <16c74.h>
void main(void)
{
int *a,b;
b=6;
a=&b;
printf ("%d",*a);
}

Not: Varsaylan olarak derleyici bir iareti iin 1 byte kullanr. Bu, sadece 0-255 aras
blgelerin gsterilebilecei (iaret edilebilecei) anlamna gelir. Daha byk hafza
adresleyebilmek iin 2 bytelk iareti (16 bit) kullanmak gerekir. 16 Bit iareti kullanabilmek
iin u komutu kullanmalsnz:
#device *=16
Ancak 16 bit aritmetik daha fazla ilem gerektirdiinden daha ok program kodu
oluturulacan gz nnde bulundurmalsnz.

lk komut 2 deiken tanmlar: integer tipi pointer trndeki a deikeni ve


integer tipinde b deikeni. Bir sonraki satr b deikenine 6 deerini ykler.
Sonraki satrda ise b deikeninin adresi (&b) a deikenine (iaretisine)
yklenir. Bu satr u ekilde okunabilir: a deikenine b deikeninin adresini
ykle.
Son olarak da b deikeninin deeri *a komutuyla ekranda grntlenir. Bu
satr u anlama gelmektedir: a iaretisinde bulunan adresteki deeri yaz. Bu
gibi bir deerden referans alnan bilgilere erime ilemine indirection denilir. Bir
grsel gsterim ekli yle olabilir:
Adres:
deiken:
ierik:

100
i
3

102
j
5

104
k
-1

106
ptr
102

int i,j,k;
int *ptr;

Balangta, i deeri 3 ve &i deeri 100 dr (i deikeninin hafzadaki yeri).


ptr iareti deikeni 102 deeri barndrdndan *ptr 102 nolu adresteki deer
olan 5 e iaret edecektir yani *ptr 5 olarak deerlendirilecektir.

PICPROJE EKB EVR GRUBU

75

www.picproje.org

NOT: PICMicrolarda her banktan kolayca ulalabilen (0x04 adresinde) fsr ve (0x04
adresinde)indf isminde iki kayt bulunur. ndf kayts fsr kayts ierisine kaydedilmi 8 bitlik
veriyi adres kabul eder ve o adresteki deeri barndrr. ndf kaytsnn ierii deitirilirse
dorudan fsr ierindeki adreste bulunan deer deitirilmi olur. 18FXXX serisi PICMicrolarda
bu fsr ve indf ilevini gren olduka yetenekli sanal kayt gruplarndan grup bulunur.

Bir hafza blgesinde iareti kullanarak deer yazmak ta mmkndr.


Mesela bir nceki program byle bir ilem yapabilecek ekilde bir daha
yaplandralm:
#include <16c74.h>
void main(void)
{
int *a,b;
a=&b;
*a=6;
printf("%d",b);
}

Bu programda, nce a iaretisine b deikeninin adresini yklyoruz. Sonra


*a=6 diyerek a iaretisinde bulunan adrese 6 deerini yaz diyoruz. Bu son iki
programdaki iaretiler gereksiz yere kullanlmlardr. Burada sadece iareti
kullanmna rnek olmas iin verilmilerdir.
Altrma:
FOR dngsyle 0'dan 9'a kadar sayan ve ekrana saylar iareti kullanarak
gsteren bir program yazn.
7.2. aretilerin kullanmyla ilgili kstlamalar
Genel olarak iareti tipi deikenler dier tiplerdeki deikenler gibi ilem
grebilir. Ancak iaretilere (pointerlara) zg bir ka zel durum ve kstlama
vardr. * ve & operatrleine ilaveten pointerlar ile birlikte sadece u drt
operatr kullanabilirsiniz: +, ++, -, --. Ayrca iaretilerden yalnzca tamsay
(integer) tipi deerleri karabilir veya ekleyebilirsiniz.
Bir pointer deeri arttrldnda, bir sonraki hafza birimini gsterir. Mesela P
pointerinde 100 numaral hafza biriminin adres deeri olduunu dnelim.
areti p eer int16 tipinde tanmlanm ise p++ ifadesinden sonra p
pointerinin deeri 102 olacaktr. (int16 tipi veriler hafzada 2 byte yer
kapladndan dolay). Eer p bir gerek say (reel say, float) olsayd bu
durumda p pointerinin deeri 104 olacakt (nk float tipi veriler 4 byte
uzunluundadr).
Yalnzca char tipi veriler iin beklenen sonu gelir. Char tipi veriler hafzada 1
byte kapladndan, balangta deeri 100 olan p iaretisinin yeni deeri
p++ ileminden sonra 101 olacaktr.
Bir iaretiden/ile dilediiniz tamsay deeri kartabilir/toplayabilirsiniz.

PICPROJE EKB EVR GRUBU

76

www.picproje.org

Mesela;
int *p;
.
p=p+200;

p=p+200 ifadesi ile P iaretisi eski deerinden 200 sonraki hafza biriminin
adresiyle yklenmitir. Hem iaretinin p kendisini, hem de gsterdii adresteki
deeri arttrmak veya azaltmak mmkndr.
Bir iareti tarafndan gsterilen bir deeri arttrrken veya azaltrken dikkatli
olmalsnz. rnein ptr deeri nce 1 iken aadaki satrdan sonra ne olur?
*p++;

bu sadece p iaretisinde kaytl adresin deerini (o adreste saklanan verinin


deil) 1 arttrr. Ancak eer biz iaretideki adreste bulunan bilgiyi bir arttrmak
istiyorsak yle yazmalyz:
(*p)++;

Parantez sayesinde iaretiyi deil de iareti iinde bulunan adresteki deeri


arttrmak istediimizi belirtmi oluruz.
aretiler ilikisel ilemlerde de kullanlabilir. Ancak eer iaretiler birbirleri ile
bir ilikidelerse bu ancak anlaml olur aksi takdirde hi bir mana ifade etmez.
18FXXX mikrodenetleyicilerinden nceki PIC Mikrodenetleyicileri iin iaretiler
program alanna (ROM'da) oluturulamazlar.
char const name[5] = JOHN;
ptr=&name[0];

bu program, const kullanlmadan (yani dizi ROM iinde tanmlanmadnda)


geerli bir koddur. 18FXXX ailesinde donanma eklenmi tablo okuma yazma
zellikleri ile program alanna iareti atamak mmkn hale getirilmitir.
Altrma:
u deikenleri tanmlayn ve adreslerini bir pointer tipi deikene yklein. Her
bir pointer deikeninin deerini %p kullanarak yazdrn. Sonrasnda her bir
pointeri bir arttrn ve ve tekrar yazdrn. Her bir veri tipinin uzunluu ne kadardr
sizin makinenizde?
char *cp,ch;
int *ip,i;
float *fp,f;
double *dp,d;

2. Aadaki anlatmda yanllk nerdedir?


int *p,i;
p = &i;
p = p/2;

PICPROJE EKB EVR GRUBU

77

www.picproje.org

7.3 Pointerlar ve diziler


C dilinde, iaretiler ve diziler birbirleri ile ok i iedir. Bu iielik, C dilinin
gcn daha da n plana karmaktadr.
Bir diziyi indekssiz olarak kullanrsanz, kesinlikle diziye erimek iin bir iareti
kullanyorsunuz demektir. Geen blmde bir metnin sadece ismini ieren
gets() fonksiyonunu kullanmtk.
nemli not: Bir dizi bir fonksiyona getiinde yalnzca ilk eleman gsteren bir iareti
kullanlabilir. Fonksiyona dizi gnderirken 7.2nin en sonunda yaplan aklamay hatrlayn.

ndekse sahip olmayan bir dizi ad iareti olduundan, o deeri bir baka
iaretiye ykleyebilirsiniz. Bu, sizin diziye iareti aritmetii ile erimenizi salar.
rnein:
int a[5]={1,2,3,4,5};
void main(void)
{
int *p,i;
p=a;
for(i=0;i<5;i++)
printf(%d,*(p+i));
}

Bu, kusursuz bir C programdr.


printf() komutunda *(p+i) kullandmz fark etmisinizdir. i dizinin indeksidir.
Belki aracaksnz ama bir iaretiyi de sanki bir diziymi gibi
indeksleyebilirsiniz. u program da geerli bir programdr:
int a[5]={1,2,3,4,5};
void main(void)
{
int *p,i;
p=a;
for(i=0;i<5;i++)
printf(%d,p[i]);
}
Hatrlanmas gereken bir nokta vardr ki: bir iareti, ancak bir diziyi gsterdiinde
indekslenebilir. Dizileri gsteren iaretiler sadece ilk elemann yerini gsterdiinden, iaretiyi
p++ ile arttrmak geersiz bir ilem olacaktr. Dolaysyla nceki programda kullanlacak bir
p++; ifadesi geersiz olacaktr. 18FXXX mikrodenetleyicilerinde p[i] deerini otomatik getiren

aretiler ile dizileri kartrmak baz sama sonulara sebep olabilir. Aadaki
rnekte sorunu greceksiniz. kinci programda problem dzeltilmitir.

PICPROJE EKB EVR GRUBU

78

www.picproje.org

int *p;
int array[8];
p=array;
0007: MOVLW 0F ;dizinin balangcn ykle
0008: MOVWF 0E ;pointer
*p=3;
0009:
000A:
000B:
000C:

MOVF 0E,W ;
MOVWF 04 ;dolayl register gster
MOVLW 03 ;3 ykle
MOVWF 00 ;belirtilen noktaya kayt et

array[1]=4;
000D: MOVLW 04 ;4 ykle
000E: MOVWF 10 ;dizinin balangcna ykle
int *p;
int array[8];
p=array;
0007: MOVLW 0F ;dizinin balangcn ykle
0008: MOVWF 0E ;pointer
p[1]=3;
0009:
000A:
000B:
000C:
000D:

MOVLW
ADDWF
MOVWF
MOVLW
MOVWF

01 ;dizinin pozisyonunu ykle


0E,W ;Dizinin balang pozisyonuna ekle
04 ;dizi pointerinin iine ykle
03 ;e ykle
00 ;belirtilen lokasyona sakla

*(array+1) = 4;
000E:
000F:
0010:
0011:

MOVLW
MOVWF
MOVLW
MOVWF

10
04
04
00

;dizi pozisyonuna ykle


;ona iaret et
;4 ykle
;Belirtilen lokasyona kayt et

ALITIRMA:
1. Bu blmdeki kod yazlm doru mudur ?
int count[10];
.
count = count+2;

2. Bu segmentteki kod hangi deeri gsterir ?


int value[5]=(5,10,15,20,25);
int *p;
p = value;
printf(%d,*p+3);

PICPROJE EKB EVR GRUBU

79

www.picproje.org

7.4 aretileri Fonksiyonlarda Kullanmak


3. Blmde fonksiyonlar armakla ilgili olarak kullanlabilen iki yntemden
bahsettik: Deerle arma ve referansla arma. Birinci yntemi o
blmde anlatmtk.
kinci yntemde ilenenlerin adresi fonksiyona tanr; bir baka deyile iareti
fonksiyondan geer. Bu noktada, iareti kullanarak deiken zerinde
yaplan herhangi bir deiiklik, arma rutinindeki deikenin deerini
deitirir. aretiler, tpk dier deikenler gibi fonksiyonlarda geer.
Aadaki rnek bir harf dizisinin(string) iareti kullanan bir fonksiyona nasl
getiini gsterir.
#include <16c74.h>
void puts(char *p);
void main(void)
{
puts(Microchip is great!);
}
void puts(char *p)
{
while(*p)
{
printf(%c,*p);
p++;
}
printf(\n);
}

Bu rnekte, p iaretisi harf dizisinin ilk karakteri olan M ye iaret eder. While
(*p) ifadesi de dizinin sonundaki nullu kontrol eder. Dngnn her bir
aamasnda, iareti tarafndan iaret edilen karakter yazdrlr ve sonra
dizideki bir sonraki karakteri gstermesi iin p bir arttrlr.
aretinin fonksiyona gemesiyle ilgili bir baka rnek de:
void IncBy10(int *n)
{
*n += 10;
}
void main(void)
{
int i=0;
IncBy10(i);
}

Yukardaki rnek, bir referans parametre tarafndan arlan zel tipteki bir
iareti parametresinin kullanlmasyla daha okunur bir ekilde yeniden
yazlabilir. rnek:
void Incby10(int &n)
{
n += 10;
}
void main(void)

PICPROJE EKB EVR GRUBU

80

www.picproje.org

{
int i=0;
Incby10(i);
}

Yukardaki her iki rnek de bir fonksiyondan parametre listesiyle nasl deer
dndrleceini gsterir.
Altrma:
1. Bir float sayy fonksiyona geiren bir program yazn. Fonksiyonun ierisinde
fonksiyon parametresi olarak -1 atansn. Fonksiyon maine dndkten sonra
float deikenin deerini yazn.
2. fl iaretisini bir fonksiyona geiren bir program yazn. Fonksiyonun ierisinde
deikene -1 deerini atayn. Fonksiyon maine dndkten sonra float
deikenin deerini yazsn.

8.Yaplar ve Birlikler
Yaplar ve birleimler C dilinin en nemli kullanc tanml tiplerini temsil ederler.
Yaplar deiik veri tiplerine sahip olabilen birbirleriyle ilikili deiken gruplardr.
Birlikler ayn hafza alann paylaan deikenler grubudur.
Bu blmde ele alacamz konular:
Yap esaslar
aretilerden Yaplara
ie gemi Yaplar
Birlik Esaslar
aretilerden Birlikler
8.1 Yaplara Giri
Bir yap, ortak bir ad zerinden eriilebilen ve birbirleriyle ilikili olan paralarn
grubudur. Yapnn iinde bulunan her para birbirlerinden farkl olabilen veri
tiplerine sahiptir.
C Yaplar aadaki ekilde tanmlanr:
struct etiket_adi
{
type element1;
type element2;
.
type elementn;
} deiken_listesi;

PICPROJE EKB EVR GRUBU

81

www.picproje.org

Struct szc derleyiciye bir yapnn tanmlanacan belirtir. Yap iindeki


her tip bir veri tipidir. Bu tiplerin birbirleri ile ayn olmas gerekmez. etiket_ad
yapnn ismidir. deiken_listesi opsiyoneldir. Yap iindeki paralardan
genelde alanlar veya yeler olarak bahsedilir. Biz paralardan ye olarak
bahsedeceiz.
Genel olarak yap iindeki bilgiler mantksal olarak birbirleriyle ilikilidirler. rnek
olarak; Bir yapy tm mterilerinizin isim, adres ve telefon bilgilerini tutmas iin
kullanabilirsiniz.
Aadaki rnek bir ktphane takip kart iindir.
struct katalog
{
char yazar[40];
char baslik[40];
char yayinci[40];
unsigned int tarih;
unsigned char rev;
} kart;

Bu rnekte yapmzn ad katalogdur. katalog herhangi bir deikenin ismi


olmayp yalnzca yapmzn ismidir. kart deikeni, katalog tipinin yaps olarak
bildirilmitir. Yapnn her hangi bir yesine eriim iin, deikenin ismini ve
yenin ismini belirtmeniz gerekir. Bu isimler nokta ile bir birlerinden ayrlmtr.
rnek olarak katalog yaps iindeki revision yesine erimek iin, kart. rev=a
kullanmalsnz. Burada kart deiken ismi ve revde yesidir. Yapnn yelerine
eriim iin operatr kullanlmtr. katalog yapsnn yazar yesini yazdrmak iin
unu yazmalsnz;
printf(Yazar is %s\n,kart.yazar);

imdi biz bir yapnn nasl tanmlanacan, bildirileceini ve eriileceini


biliyoruz. Peki, katalog yapmzn hafzay kullanm ekli nasldr?
yazar
baslik
yayinci
tarih
rev

40 byte
40 byte
40 byte
2 byte
1 byte

Eer kart yapsnn tarih yesinin adresini almak istiyorsak &kart.tarih ifadesini
kullanmalyz. Eer yayncnn ismini yazdrmak istersek
printf(%s,kart.yayinci);

ifadesini kullanmalyz. Eer baslik dizisinin 3. eleman gibi belirli bir elemana
ulamak istiyorsanz ne yapmalsnz? Tabi ki kart.baslik[2] kullanmalsnz.
Basliin birinci eleman 0 , ikinci eleman 1 ve ncs 2.

PICPROJE EKB EVR GRUBU

82

www.picproje.org

Her hangi bir yap tanmlam iseniz , program ierisinde her hangi bir yerde
daha fazla yap deikeni oluturabilirsiniz. Bunun iin;
struct yap_ismi deiken_listesi;

Mesela, katalog yaps daha nce program ierisinde tanmlanm ise , iki adet
deikeni daha u ekilde tanmlayabilirsiniz;
struct katalog book,list;

C dili size dier veri tipleri gibi yaplar da bir dizi eklinde bildirmenize izin verir.
rneimiz katalog yapsnn 50 elemanl bir dizisini bildirmektedir.
struct katalog big[50];

Eer dizi iindeki yaplara erimek istiyorsanz, yap deikenini


indekslemelisiniz. rnein bir yap dizisi olan bigin 10. elemannn baslik
yesine nasl eriirdiniz? Tabi ki big[9].baslik ifadesi ile.
Yaplar fonksiyonlara aktarlabilir. Bir fonksiyon herhangi bir veri tipini bize geri
dndrd gibi bir yapy da geri dndrebilir. Bir yapnn deerlerini dier bir
yapya basit bir atamayla atayabilirsiniz. Aada bulunan kod paras
struct temp
{
int a;
float b;
char c;
} var1,var2;
var1.a=37;
var1.b=53.65;
var2 = var1;

Bu kod paras yapy uyguladnda var2 deikeni var1 deikeni ile ayn
ierie sahip olacaktr.
Aada bir yapya ilk deer verilmesine dair bir rnek verilmektedir:
struct ornek
{
char kim[50];
char karakter;
int i;
} var1[2]={Rodger,Y,27,Jack,N,30};
Not alnmas gereken nemli bir nokta: Bir yapy fonksiyona aktardnzda, tm yap bir
deer tarafndan arlma metodu ile aktarlr. Bu nedenle fonksiyon iindeki yapda
yaplacak modifikasyonlar arma rutini iinde bulunan yapnn deerini etkilemeyecektir.
Yap iindeki elemanlarn says yapnn fonksiyona aktarl biiminden etkilenmezler.

Bunun Piclerde bir LCD yi set etme rneindeki ekli;

PICPROJE EKB EVR GRUBU

83

www.picproje.org

struct cont_pins
{
boolean en1; //tm dispaylere izin vermek iin
boolean en2; //40x4 displaylere izin vermek iin
boolean rs; //kaydedici seimi
int data:4;
}
cont;
#byte cont = 8;

//portd den kontrol (lcd portd ye balanm)

Bu kod paras cont_pins iin yapy set eder ve program ile birlikte alr.
NOT: Kod iinde data iin yazlm :4 notasyonu bu nesne iin 4 bitin ayrlacan bildirir. Bu
durumda D0 en1 ve D3-6 data olacaktr.

void LcdSendNibble(byte n)
{
cont.data=n; //present data
delay_cycles(1); //delay
cont.en1=1; //set en1 line high
delay_us(2); //delay
cont.en1=0; //set en1 line low
}

ALITIRMA
1. inde bir karakter ve 40 adet karaktere sahip dizisi olan bir yap ieren
program yaznz. Keyboardtan bir karakter okuyunuz ve bu karakteri getch()
kullanarak karakter iine kaydediniz. Bir dizi okuyunuz ve gets() kullanarak dizi
iine kaydediniz. Sonra yelerin deerlerini print ediniz.
2. Bu kod parasndaki yanl nedir?
struct type
{
int i;
long l;
char str[50];
} s;
.
.
i = 10;

8.2 aretilerden Yaplara


Bazen bir iareti zerinden bir yapya ulamak ok kullanl olmaktadr.
aretilerden yaplara bildirim bir iaretinin dier veri tiplerinde olduu gibidir.
rnein, takip eden kod paras yap tipi temp olan, yap deikeni p ve yap
iareti deikeni q olan yapy bildirir.

PICPROJE EKB EVR GRUBU

84

www.picproje.org

struct temp
{
int i;
char ch;
} p,*q;

temp yapsnn bu ekilde tanmlanmas kullanldnda q=&p deyimi geerlidir.


u anda q pyi iaret eder.
aretinin gsterdii yapnn elemanlarna (rnein i) ulamak iin -> iareti
kullanlr. ok operatrn (->) aada gsterildii ekilde kullanmalsnz;
q->i=1;

Bu iaretin asl *q.i gibidir. Ancak grsel adan daha anlalr olmas iin ->
kullanm tercih edilmitir. Ok operatrnn eksi iaretini takip eden byktr
iareti olduuna ve arada boluk bulunmadna dikkat ediniz.
Bu ifade p deikeninin i elemanna 1 deerini atar.
C tm yapy fonksiyona geirdiinden beri, geni yaplar byk data transferi
yapmasndan dolay program iletim hzn yavalatabiliyorlard. Bu nedenden
dolay bir iaretinin bir yapya, bir fonksiyona geirilmesi daha kolaydr.
Not alnmas gereken nemli bir ey: Bir yap yesine yap deikeni kullanarak eriirken
noktay kullann. Bir yap yesine eriim iin iaretiden yapya kullanlyorsa ok operatrn
kullanmalsnz.

Bu rnek iaretiden yapya nasl kullanldn gsterir.


#include <16c74.h>
#include <string.h>
struct s_type
{
int i;
char str[80];
} s,*p;
void main(void)
{
p=&s;
s.i=10;
p->i=10;
strcpy(p->str,struct olayini seviyorum);
printf(%d %d %s,s.i,p->i,p->str);
}

Bu iki satr s.i=10 ve p->i=10 eittirler.


ALITIRMA:
PICPROJE EKB EVR GRUBU

85

www.picproje.org

1. Bu kod paras dorumudur?


struct s_type
{
int a;
int b;
} s,*p;
void main(void)
{
p=&s;
p.a=100;
}

2. long uzunluunda bir yap dizilimi oluturan bir program yaznz. Yaplar
yklemek iin PIC16C5X, PIC16CXX ve PIC17CXX ihtiyacnz olacaktr.
Kullanc klavyenin 1,2 ve 3 girilerini kullanarak yazdrmak istedii yapy
seecektir. Yapnn biimi:
struct PIC
{
char name[20];
unsigned char progmem;
unsigned char datamem;
char feature[80];
};

8.3 e Yaplar
u ana kadar bir yap yelerinin yalnzca C dili data tipi olduunu grdnz.
Fakat yap yeleri baka bir yap olabilirler. Buna i ie yaplar denir. rnein;
#define NUM_OF_PICS 25
struct PIC
{
char name[40];
unsigned char progmem;
unsigned char datamem;
char feature[80];
};
struct urun
{
struct PIC aygitlar[NUM_OF_PICS];
char paket_tipi[40];
float maliyet;
} list1;

urun yapsnn eleman vardr: aygitlar adyla PIC yap dizisi, paket_tipi
adyla karakter dizisi ve maliyet adyla gerek say tipinde 4 baytlk deiken.
Bu elemanlara list1 deikeni kullanlarak eriilebilir. rnein list1 yapsnn
ihtiva ettii aygitlar yapsnn 10. elemannn progmem deerine erimek iin
list1.aygitlar[9].progmem ifadesi kullanlmaldr.
8.4 Birliklere Giri
PICPROJE EKB EVR GRUBU

86

www.picproje.org

Bir birlik iki veya daha fazla deiken tarafndan paylalan bir hafza
blgesidir. Hafza blgesini paylaan deikenler deiik veri tiplerinden
olabilirler. Fakat her defasnda yalnzca bir deiken kullanabilirsiniz. Bir birlik bir
yapya ok benzemektedir. Birliin genel yaps yledir;
union etiket_ad
{
type eleman1;
type eleman2;
.
.
type elemanN;
} deiken_listesi;

Yine etiket_ad tanmlanan birliin ad ve deiken_listesi etiket_ad tipinde bir


birlii olan deikenlerdir. Birlikler ve yaplar arasndaki fark, birliklerin her
yesinin ayn bilgi alann paylamasdr.
rnein, takip eden birlik adet ye ierir: bir integer, bir karakter dizisi ve bir
double
union u_type
{
int i;
char c[3];
double d;
} temp;

Birliin hafzadaki ekli aada gsterilmitir. Biz yapy anlatmak iin bir nceki
rnei kullanacaz. nteger iki byte, karakter dizisi 3 byte ve double 4 byte
kullanr.
<------------- double ------------->
<--c[2]--><--c[1]--><--c[0]-->
<-----integer------>

Bir birliin yelerine erimek iin yaplarda olduu gibi nokta kullanlr. temp.i
ifadesi temp birliinin iki baytlk integer tipindeki i yesine ve temp.d drt
baytlk double tipindeki d ye eriir. Eer bir iareti zerinden bir birlie
erieceksiniz yaplarda olduu gibi ok operatrn (->) kullanmalsnz.
Not alnmas gereken nemli bir nokta, bir birliin complier daki boyutu birlik iindeki en
byk boyutlu yeye bal olarak sabitlenir. Double tipinde olanlarnn boyutlar 4 byte
uzunluunda olduunu varsayarsak, temp birlii 4 byte uzunluunda olacaktr.

Birlik kullanmann gzel bir rnei, seri portuna harici 12-bit ADC bal olan 8bit mikrokontrolr uygulamasnda verilebilir. Mikrokontrolr A/Dyi iki baytta
okur. yleyse biz iki unsigned chars ve bir signed short tipinde yelere sahip bir
birlik oluturmalyz.

PICPROJE EKB EVR GRUBU

87

www.picproje.org

union sample
{
unsigned char baytlar[2];
signed short word;
}

A/D okumak istediinizde , A/D den iki byte okur ve bunlar baytlar dizilimi
iinde saklayabilirsiniz. Daha sonra 12-bitlik rnei kullanmak isterseniz , 12-bit
sayya ulamak iin word u kullanmalsnz. Yani ayn adreste saklana bilgilere
hem baytlar dizisi ile hem de word deikeni ile ulaabilirsiniz.

PICPROJE EKB EVR GRUBU

88

www.picproje.org

You might also like