Basic - C karşılaştırması

Başlatan bunalmis, 07 Haziran 2011, 05:35:41

Analyzer

Selam,

Ben de TC++ 3.0 ile C++ öğrenenlerdenim. O zamanlar Windows 98 ve Ms-Dos vardı. İkisi de tarih oldu tabi. Ancak ben de OOP arayüzlerine ve mcu'larda C dilini öğrenmeye karşıyım, kullanmaya değil tabi.

Analyzer
Üşeniyorum, öyleyse yarın!

MC_Skywalker

Turbo C++ 3.0 msdos 6.22 üzerinde ilk C öğrenme çablarım geldi aklıma

şu adresten download edebilirsiniz
http://www.bestfreewaredownload.com/freeware/t-free-turbo-c--freeware-flggsdpz.html

Şu adrestende 64bit vista win 7 üzerine nasıl kuracağınız hakkında bilgi alabilirsiniz
http://blog.bestsoftware4download.com/2010/02/how-to-install-turbo-c-on-windows-7-64bit/

CLR

Alıntı yapılan: bunalmis - 08 Haziran 2011, 15:40:58
Arada bir tepki vermenizi bekliyorum.

Anlatim sekli kotu yada iyi, anliyoruz, anlamiyouz, fazla laf kalabaligi ediyorsun vs vs.

void hesapla(void)
{
int a,b;

    b=a;
}

void main(void)
{
     int a,b;

     a=1;
     hesapla();
}

Iste buradaki a ve b artik statik iki degisken haline geldi. Fakat artik maindeki a ile hesapladaki a ayni a değil.
Isimleri ayni gorunuyor ama hic alakalari yok.


Gözüme çarpan bir yanlışı düzelteyim.

Hesapla fonksiyonu içindeki a,b değişkenlerine lokal değişken denir, statik değişken denmez. Statik değişken tanımlamak için "static" keyword'u kullanmak zorundasın. Static ile local değişken arasında şöyle bir fark vardır.

local değişken : fonksiyon içinde kullanılır ve fonksiyondan çıkarken kullanım dışı yapılır yani tekrar hesapla fonksiyonuna erişildiğinde içeriği korunmaz.
static değişkende ise sadece o fonk. içinde kullanılır ve içeriği silinmez.

örnek:

void hesapla(void)
{
 static int a=0;  // static bir değişkendir, ilk değeri sıfır yapılır, daha sonraki çağırmalarda a içine 0 atılmaz
 int b;            // local değişken, 
// default olarak b=0'dır, her çağırmada 0 atılır
  a=a+1;      // her hesapla fonk. çağırıldığında 1 artar
  b=a;          // b=a olur

}                 // b değişkeni yok edilir, a değişkeni ve içeriği korunur



Knowledge and Experience are Power

Analyzer

Selam,

@eemkutay :

Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.

Analyzer
Üşeniyorum, öyleyse yarın!

CLR

Alıntı yapılan: Analyzer - 08 Haziran 2011, 16:28:47
Selam,

@eemkutay :

Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.

Analyzer

Merhaba Analyzer,

Doğru haklısın, local değişken içeriği bilinmeyen bir değer alır. local değişken içine mutlaka birşeyler yazmak gerekir.


Knowledge and Experience are Power

controller

static in bir diğer kullanım amacı ise, kullanıldığı global değişkenin veya fonksiyonun sadece o modülde tanımlı olmasını sağlamaktır. yani static öneki ile tanımladığınız global değişkenler veya fonksiyonlar absürd bir tanımla "local global" olur.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

erkan614

takıldığım 1. nokta static yerine local elimesi o değişken için daha anlamlı geldi ok
2.si  ise peki hesapla() fonksyonuna main'den a, c ve d değerlerinide göndermek istersek bunları global yapmadan nasıl göndericez

JKramer

#37
Çözüm-3 diyebiliriz: http://www.cplusplus.com/doc/tutorial/functions2/

Örnek program ve çıkış değerleri mevcut. Kabaca, fonksiyona değişkenleri değil değişkenlerin bir çeşit adresini gönderiyoruz. Fonksiyon içerisinde yaptığımız değişiklikler, ilgili adresteki değişkenlere yansıyor.

Ek: Daha rahat anlamak için pointer konusuna bakabilirsiniz: http://www.cplusplus.com/doc/tutorial/pointers/

Veli B.

#38
Arkadaşlar, konu başlığı ile alakası kalmadı. Mod arkadaşlardan birisi bu konuyu ayırıp sabit başlık haline getirebilir mi?

Bir diğer nokta ise; C derken C++ karışmaya başladı. Bence C++ ı unutun. Sadece C hakkında bilgiler ve açıklamalar olmalı. Yoksa  Class, object, polymorphism, inheritance gibi konulara da girmek gerekecek. Bir de çok karışık gitmek doğru değil kanımca. Baştan başlıyarak Bunalmış Üstadığın izlediği yol gibi sıfırdan başlayarak almak daha doğru diye düşünüyorum. Dediğim gibi pedagojik açıdan bakmak lazım ve niyetli olanların gözünü korkutmamalı. Nette gördüğüm en büyük hata bu idi. Arada konular eksik ama 3. konuda pointerdan bahsedilmiş ama daha dizileri bilmiyorum ki!

Bu arada, benim öğrendiğim 2 kaynak aşağı da.

http://www.cagataycebi.com/programming/index.html
http://www1.gantep.edu.tr/~bingul/c/index.php

Erol YILMAZ

Basic ile C arasındaki temel farklardan birisini söyleyeyim.

C öncesi dillerin nerede ise tümü,
İşi yazılım olmayan insanlar için geliştirilmiş dillerdir.
C ise yazılımcı insanlar için tasarlanmış bir dildir.

Kaynakçasını aratmayın bu sözün bi yerde okudum :)

SpeedyX

Alıntı yapılan: eemkutay - 08 Haziran 2011, 16:45:31
Alıntı yapılan: Analyzer - 08 Haziran 2011, 16:28:47
Selam,

@eemkutay :

Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.

Analyzer

Merhaba Analyzer,

Doğru haklısın, local değişken içeriği bilinmeyen bir değer alır. local değişken içine mutlaka birşeyler yazmak gerekir.

Biraz daha açıklayıcı yazacak olursak;
Lokal değişkenin adresi RAM de bir bölgeye denk gelir ve eğer o fonksiyon haricinde derleyici o RAM bölgesini başka bir iş için kullanmıyorsa doğal olarak lokal değişkenin değeri de değişmeyecektir. Kesinlikle değerinin değişmemesi isteniyorsa önüne "static" kelimesi eklenir ve değişken bir çeşit global değişkene dönüşür. İstisnai durumlar hariç lokal değişkenlere ilk değer atanmalıdır, çünkü C derleyicileri minimum değişken kullanmayı amaçladıkları için büyük ihtimalle o RAM bölgesini diğer fonksiyonların lokal değişkenleri için kullanacaklardır. İstisnai dediğim durumlarda da zaten değişken lokal olmaktan çıkmaktadır.

Ayrıca;
Alıntı YapThe Ten Commandments of C Style
A remedial course for caps criminals 1

    Woe be to those errant scribes who ignore capitalization in the writing of the C program, and a plague of frogs on those who turn off the switch of capitalization.

    Thou shalt not capitalize statements such as the "if" or the "for".

    CONSTANTS shall be shouted to the multitudes in all caps, from every rooftop and steeple, as they are the unchanging firmament and change not through all time, and woe be to those that confuse them with variables.

    Those Types and Structures which are user defined shall be presented with the first letter capitalized, as they are the high born, lest they be confused with the lesser variables, nor with the shouted CONSTANTS.

    Variables shall be lower case, even as they start a sentence, for they are the low and common peasant workers doing the everyday drudgery of programming work, and must not be confused with the high-born Structures, nor with the ever-stable firmament of CONSTANTS.

    Brothers have come to blows o'er the use of long variable names, with many favoring the internal capitalization, thus the use of

    long int numberOfPeopleInHell;

    whereas others have countered with heated words that the proper way would be

    long int number_of_people_in_hell;

    Woe be to those who use either name, for it is likely not unique in the first six to eight letters, making some compilers gnash their teeth, while the true scope of the number of people in hell would vastly exceed the capacity of the long int, causing the dreaded plague which infecteth, locketh-up and rebooteth all computers from the lowly PIC to the mighty Cray.

    While much blood has been shed over the issue of the curly brace, and many are the programmers that have argued that opening curly braces should go on their own line, while others have protested with sword-in-hand that they must go on the same line as the statement, and many have come to blows over this, the closing curly brace shall be indented to the same level as the opening function.

    Thou shalt not comment the obvious. Those rapscallions and heathens who penned the line:

    i++; /* Add one to i */

    shall be forever banned from the inner circle of C, though their resume grow long and their accomplishments and finished code stretch out before them like a lake of ASCII text. Likewise, any code which is not obvious, or obfuscates and bebothers the user, shall be extensively commented so as to make clear the intent of the programmer.

    Thou shalt comment the author, date, and revision of each C program, and lo, other comments shall be brief, descriptive, to the point, yet clear as the purest mountain spring water in their explanation and clarification of the code. Each function shall have as its companion a description of its function, its inputs and outputs, as each dog has its day and each actor his moment on the stage. Thou shalt document the purpose of each and every I/O pin in an embedded processor, and for each variable, data member or Structure there shall be a comment which shall illuminate and enlighten the reader of the program as to its use.

    Thou shalt properly indent programs, each subservient function being indented one level more than its master.

z

#41
Statik ve Lokal karmasasi icin ozur.

Lokal degiskenimiz dogrudan ramin stack alaninda tutulur.
static on eki ile statik hale getirdigimizde bu degisken de global degisken gibi ramda tutulmaya baslanir. Fakat diger fonksiyonlar erisemez.

Sadece 2 dersde

main fonksiyonunun anlami,
Lokal degisken, Statik degisken, Global degisken,
Degisken tanimlama,
fonksiyon tanimlama,
fonksiyona parametre gonderme,
fonksiyondan return degeri alma,

gibi temel taslari ogrendik.

Simdi degisken tiplerine bakalim.

karakterlerle yada isaretli byte tipi verilerle ugrasmak icin char 
integer isaretli sayilarla degerlerle ugrasmak icin int
isaretsiz integer sayilarla ugrasmak icin unsigned int

Ornek olarak asagidaki main fonksiyonu girisindeki degisken tanimlamalarina bakalim

void main(void)
{
unsigned int a;
int b=1;
char c;
unsigned char d[5]={'D','E','R','S',0x00}
int sayilar[10];
.....
.....

unsigned integer tipinda a degiskenimiz var. Bu durumda a=0....65535 araliginda deger alabilecek.
int b tipinde degiskenimiz main satirina girer girmez 1 degerini almis. -32768..+32767 araliginda deger alabilecek
signed char tipinde c degiskenimizle -128..+127 araliginda deger alabilecek
char tipinde c degiskenimizle 0..255 araliginda deger alabilecek
unsigned char tipinde d degiskenimiz bir karakter array ve icine DERS kelimesi yazilmis.
int tipinde 10 tane eleman yerlestirilebilen array'imiz var

(String tipi verilerle simdilik calismayacagiz.)

Artik denemeler yapabilecek konuma geldik. Yapacagimiz islemlerin sonuclarini ekranda gorebilmek icin (PC de Borland TC 3.00 ile calistigimizi varsayiyorum) printf komutunu detaylandirmadan kisaca ogrenelim.

printf("%d",a);     a sayisini decimal formatta print et.
printf("%d\n",a);  a sayisini decimal formatta print et ardindan satir atlat.
printf("%4x",a);   a sayisini hexadecimal formatta print et.
printf("Sonuc:%d\n",a);  Sonuc: 123 benzeri olsun.
printf("Sonuc1:%d   Sonuc2:%d\n",a,b);  Sonuc1: 123  Sonuc2:456  benzeri olsun.
printf("Merhaba");

Yukaridaki printf orneklerini inceleyerek komutu kavrayabilirsiniz.

a=a+1;
b=b-1;
c=a/b;
d=a*d;

4 isleme ait ornekler.

a=a+1; yerine a++;
a=a-1; yerine a--;

a=a+2 yerine  a+=2;

yazabilirsiniz.

printf komutunu kullanabilmek icin programin tepesine
#include <stdio.h>

yazmamiz gerekir.

Bu satir stdio.h dosyasinin programimiza dahil edilmesini saglar. Aksi halde printf komutu calistirilamaz.

Kendi kendinize denemeler yapmak icin lazim olacak ilave iki komut if karsilastirmasi ve for dongusu olacak.

Daha once and or xor not mantiksal islemlerine bakalim.

a=0x10; //   10 Hex sayisina karsi gelir.

void main()
{
int a,b,c;

     a=0x01; b=0x02;

     c=a|b;  // c= a or b
     c=a&b; // c= a and b
     c=a^b; // c= a xor b
     c=~a;   // c= not a
}

if karsilastirmasi

Basicdeki ornegimiz if a=10 then print "a esittir 10"   C deki ornegimiz if (a==10) printf("a esittir 10");

Basicdeki ornegimiz if a<>10 then print "a esitdeğil 10"   C deki ornegimiz if (a!=10) printf("a esit değil 10");

if (a=1) and (b<>2) then x=1    if ((a==1) && (B!=2))  x=1;

if (a=1) or (b<>2) then x=1    if ((a==1) || (B!=2))  x=1;

if (a==1)
  {
//  a=1 ise burdaki komutlar calistirilir.
  }
else
  {
// a<>1 ise burdakiler calisir
  }


Gelelim for dongusune

for i=0 to 9 step 2   for (i=0;i<10;i=i+2)

Eger Basicde program yazabiliyorsaniz bu dersden itibaren C ile  basit denemeler yapabileceginizden eminim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: SpeedyX - 08 Haziran 2011, 18:40:04
Alıntı yapılan: eemkutay - 08 Haziran 2011, 16:45:31
Alıntı yapılan: Analyzer - 08 Haziran 2011, 16:28:47
Selam,

@eemkutay :

Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.

Analyzer

Merhaba Analyzer,

Doğru haklısın, local değişken içeriği bilinmeyen bir değer alır. local değişken içine mutlaka birşeyler yazmak gerekir.

Biraz daha açıklayıcı yazacak olursak;
Lokal değişkenin adresi RAM de bir bölgeye denk gelir ve eğer o fonksiyon haricinde derleyici o RAM bölgesini başka bir iş için kullanmıyorsa doğal olarak lokal değişkenin değeri de değişmeyecektir. Kesinlikle değerinin değişmemesi isteniyorsa önüne "static" kelimesi eklenir ve değişken bir çeşit global değişkene dönüşür. İstisnai durumlar hariç lokal değişkenlere ilk değer atanmalıdır, çünkü C derleyicileri minimum değişken kullanmayı amaçladıkları için büyük ihtimalle o RAM bölgesini diğer fonksiyonların lokal değişkenleri için kullanacaklardır. İstisnai dediğim durumlarda da zaten değişken lokal olmaktan çıkmaktadır.


Buna dinamik adresleme işlemi denir. Dinamik adreslemede, küçük programlarda bahsettiğin gibi aynı register, aynı değişken için atanabilir ama program büyüdükçe / değiştikçe aynı register aynı değişken için atanması garanti değildir. Yoksa local değişken tanımı olmazdı.
Knowledge and Experience are Power

z

Simdi de pointer kavramina bakalim.

pontere neden ihtiyac varla baslayalim.

Asagidaki gibi bir fonksiyon dusunelim.

void hesapla(int a, int b)
{
int x,y,z,w;
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

peki hesaplanan x,y,z,w degerlerini cagiran fonksiyona nasil iletebiliriz?  (malesef int int int int hesapla(int a, int b) yazamiyoruz)

Cozum 1. Global degisken kullanmak

int x,y,z,w;

void Hesapla(int a,b)
{
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

Cozum 2

void Hesapla(int a, int b, int* x, int* y, int* z, int* w)
{
    *x=a+b;
    *y=a-b;
    *z=a*b;
    *w=a/b;     
}

Burada int *x,  gelen veri, x degiskeninin degeri değil adresidir demek.

*X = a+b; demek a+b islemini yap ve sonucu adresi verilen alana yaz demek.

Peki bu fonksiyonu cagirirken nasil adres verecegiz?

main void()  // burada parantez icine void yazacaksak yazmayabilme serbestligimiz var
{
int a,b,c,d;

        Hesapla (4, 5, &a, &b, &c, &d);) // Buradaki &a, a degiskeninin adresinin sayisal degeri demektir.
}


-------------------------------------------------------------------------------

pointeri anlamak icin bir baska ornek

void main()
{
int a,b;        //  a ve b integer iki degisken
int* p          //  p,  integer degiskenlerin adresini saklayabilen bir degisken, yani bir pointer

       p=&a    //   a degiskeninin adresini p ye yukledik
       a=1;     //   a=1 yaptik
       b=*p;   //  p degiskenindeki adresdeki veriyi b ye yazdik. (b=a oldu)
}

Pointer denen sey de bundan ibaret.

O halde bir fonksiyondan istedigimiz kadar sonuc geri dondurebiliriz. Daha dogrusu, bir fonksiyondan, istedigimiz kadar degiskenin icine deger yazmasini isteyebiliriz.


Gordugunuz gibi ortalikta bir tane bile global degisken yok.

Basic de tum degiskenler global degisken




Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Basic deki global degiskenlerin zarari ne? Neden C de de global degiskenleri dayayip gecmiyoruz? Adresmis pointermis kendimizi sikintiya sokuyoruz?

Global degisken rama yapistimi suluk gibi kalan bir degiskendir. Yani ramdan yer tirtiklar.

x=a+b;
y=a-b;
z=a*b;
w=a/b;

hesaplandiktan ve kullanildiktan sonra artik x,y,z,w nin ramda yer kaplamasinin anlami yok.

Bunlar uzun programlarda hissedilir sekilde ramda yer kaybina neden olurlar. Bu nedenle de global degisken kullanimi pek tercih edilmez.
Fakat mikrolar artik buyuk ram kapasitelerine sahip olduklarindan bu konuya cok da dikkat etmeyebilirsiniz.

Eger

x=a+b;
y=a-b;
z=a*b;
w=a/b;

hesaplanan x,y,z,w sonuclari,  pek cok fonksiyonda girdi olarak kullanilacaksa bunlarin global olmasinda fayda vardir. Aksi takdirde
fonksiyon cagirimlarinda zirt pirt bunlarin adreslerinin fonksiyona gonderilmesi gerekir ki bu da bu kez romdan kaybetmek anlamina gelir.

Goruldugu gibi C de BASIC teki basit yapidan adim adim uzaklasiyoruz.

Bu detaylar kotumu? Elbette hayir.....


Bana e^st de diyebilirsiniz.   www.cncdesigner.com