BASIC kullanıcılarını C'ye alıştırma turları

Başlatan bunalmis, 28 Ekim 2011, 18:48:32

eistain_54

Yoo kesinlikle haklısınız yatağa yattığından beri düşünüyorum programı bitiremedim kafamda tam olarak. Yani dediğiniz gibi c ile yazmaya başladım.
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

DumrulBey

Hocam Array'ler ile ilgili mevzuları merak ediyorum da... C'de PHP kadar çok şey yapabiliyor muyuz? Örneğin şu kodlar ile başlasak ki basit bir kesmeli dizi örneği:

void interrupt(){
if(INTCON.RBIF){
kesme_hesaplama();
PORTB=kesme_tablo[kesme_port_degeri];
kesme_port_degeri=0;
INTCON.RBIF = 0;
}

}
void main() {
ayarlar();
for(;;) {
         for(sayac=0;sayac<7;sayac++){
                  PORTA=yuru_tablo[sayac];
                  delay_ms(1000);
         }

}
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

eistain_54

#include<stdio.h>
#include<conio.h>

int main( void )

{

    int kilo;
    int boy;
    float sonuc;
    float deger1;
          printf ("Lutfen Kilonuzu Girin:");
          scanf("%d",&kilo);
          printf ("Lutfen Boyunuzu Girin:");
          scanf("%d",&boy);
          deger1= (float) boy / 100;
          deger1= deger1*deger1;
          sonuc = kilo/deger1;
          printf ("Sonuc: %2f\n",sonuc);
          if ( sonuc >24.9 && sonuc <29.9 ){
             printf ("Sanirim Biraz zayiflamalisiniz! \n");
             }
          if ( sonuc == 24.9 ){
               printf ("Tehlike canlari caliyor... \n");
               }
          else if ( sonuc >=19.9  &&  sonuc < 24.9){
               printf ("Harika!Formunuzdasiniz!!! \n");
               }
          else if ( sonuc > 29.9 ){
               printf ("Uzgunum.Bunu yerken dusunmeliydin... \n");
               }
          else if ( sonuc < 19.9 ){
               printf ("Neyin var senin?Biraz istah hapi falan kullan bari \n");
               }
          getch();
          return 0;
}

Bunu bir tren yolculuğu sırasında abimin icası üzerine yazmıştım.Staj yerinden eve dönerken yazdığım bir programram.Dev C++ ile yazmıştım.Fonksiyon falan yok.Hepsini içeren bir program tasarlıyorum ama çok gecikeceğim.O yüzden bununla yetineyim dedim...Sizce bişeyler kapabilmişmiyim?
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

z

#48
Kafa geçiyor olmalısın?

Bunu sen mi yazdın? Yazdıysan bu başlıkta mesajlaşmak için Basic bilen fakat hiç C bilmeyen birini aramıştık. Sen de C bilmiyorum demiştin.

Sen yazdıysan yukarıda anlamayıp sorduğun sorular neydi?

Gerçekten kafam karışık şimdi.

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

eistain_54

yok ya gerçekten dalga geçmek maksatlı yazmadım. Zaten sorduğum sorularla bilmediğim belli olmuyormuydu. Ben daha önce c çalışmıştım ama aradan bir kaç gün geçince unutmuştum. Gerçekten cokmu profosyonel bir çalışma ben şimdi yazmak istesem böyle bir çalışmaya giremem. Korkarım. Halen ccs ile lee yakıp söndürecek kod yazmaya korkuyorum. Kafamı karıştıran bir sürü şey var. Birde sizin yaptığınız if tanımlaması benim kafamı karıştırmıştı. Ama şuan bir sorun yok. Sakin beni yanlış anlamayın gerçekten böyle bir niyetim yoktu olamazda...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

z

#50
Basic bilenlerin bu satira kadar olan mesajlarda anlatilanlari mantik suzgecinden gecirirlerse Basicden aliskin olduklari komutlarin bire bir C karsiligi oldugunu ve C de ayni sekilde program yazabileceklerini farketmis olmalilar. Bunun icin sadece C'ye ozgu kurallara uysunlar yeter.

Bu hemen C ye gecmeniz icin yeterli ve zaman icinde BASICdeki dar mantiktan kurtulup C de daha hur  olmaya baslayabilirsiniz.

Array
kullanimi

Dim A(10)

y=0     

Rem  0,1,2,3,4,5,6,7,8,9,10 icin deneyelim

for x=0 to 10   
    A(x)=x
    y=y+A(x)
next x

Programi ile C de yazilmis asagidaki programa bakalim.

int A[10];   // (A degiskeninin icerigine gore int yada char yada short tanimlayabilirsiniz)
int x,y;

y=0;     

for (x=0; x<=10;x++) // 0,1,2,3,4,5,6,7,8,9,10 icin deneyecek
    {
      A[ x ] =x;
       y+=A ; // y=y+A de yazabilirsiniz
      }


Gordugunuz gibi Array degiskenler acisindan da hic fark yok.

Ornek programda

int A[10];   // (A degiskeninin icerigine gore int yada char yada short tanimlayabilirsiniz)
int x,y;

olarak tanim yaptigimiz gibi C de kullanacaginiz her degiskeni muhakkak tanimlamalisiniz.

C de Hazir fonksiyonlarin kullanimi

BASIC'de A degiskenini print komutu ile ekranda gosterebiliriz.

A degiskenini ekranda gostermek icin Goster adinda bir program parcasi yazip bunu gosub ile de cagirabilirsiniz.

C'de de ayni durum gecerli.

Ya printf yada benzeri hazir fonksiyonu cagirirsiniz yada ornegin Goster adini vereceginiz bir fonksiyonu siz yazar ve bunu cagirirsiniz.

Aslinda her ikisi de benzer seylerdir. Birisinde daha onceden birilerinin yazdigi ve kutuphane icine yerlestirdigi fonksiyonu kullanirsiniz yada kendi yazdiginiz
fonksiyonu.

Eger hazir fonksiyonlari kullanacaksaniz bununla ilgili tanimlamalarin yapildigi header dosyayi programin tepesine #include komutu ile tanimlamaniz gerekir.

Asagidaki program yukarida ornek olarak verdigimiz programdaki y degiskeninin sonucunu ekrana yazacaktir.

#include "stdio.h"  // printf fonksiyonunu kullanabilmek icin ekledik
int A[10];   // (A degiskeninin icerigine gore int yada char yada short tanimlayabilirsiniz)
int x,y;

int main()
{
      y=0;     

      for (x=0; x<=10;x++) // 0,1,2,3,4,5,6,7,8,9,10 icin deneyecek
          {

         A[ x ]=x ;
            y+=A ;  // y=y+A de yazilabilir.
           }

   printf("Toplama Sonucu=%d",y);
   return(0);
}

Buradaki printf("Toplama Sonucu=%d",y);satirinda%d ne anlama geliyor diye sorabilirsiniz. Bu sorunun cevabi printf fonksiyonunun helpinde mevcuttur.

#include "stdio.h" ile printf fonksiyonunu nasil alakalandirdin bunu include edecegimizi nereden bildin diye de sorabilirsiniz.

Bu bilgiler satin alacaginiz bir C kitabinda mevcuttur yada forumda sorabilirsiniz. Fakat en pratik olani baskalarinin yazdigi ornek programlari incelemek olabilir.


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

muhittin_kaplan

Burada Bir Soru Sorabilirmiyim.
Basicde tek derinlikli Array lar oluşturabiliyoruz. C de 2-3 olduğunu biliyorum
Yani
int A[10;10]
gibi
Bunun Nasıl bir avantajı vardır?

z

#52
Hayal gucunuzu kullanin.

Iki boyutlu dizileri ornegin ekranla ilgili rutinlerinizde x ve y coordinati icin kullanabilirsiniz.

Matris hesaplamasi icin kullanabilirsiniz.

Ekran[100], Ekranin 100.cu pixel.

Ekran[10,20], Ekranin x=10, y=20 noktasinda ki pixeli gibi
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#53
Pointer kullanımı

Pointer, Basic'de olmayan fakat C'de karşımıza çıkan önemli bir özelliktir.

XX=10 ataması ile karşılaşan derleyici,  Ramda X in saklı olduğu adrese 10 değerini yazacak kodları uretir.

Peki hangi 10 sayısını?

X char olarak tanımlandıysa Rama 0x0A
X short olarak tanımlandıysa Rama 0x000A
X int olarak tanımlandıysa Rama 0x0000000A

O halde bir degiskenin sadece adresini bilmek yetmez, degiskenin uzunlugunu da bilmek gerekir.

Normalde X=10 yazdigimizda C derleyicisi, X in daha onceki ust satirlarda ne tipte tanimlandigini bildigi icin

X=0x0A mı?, yoksa;
X=0x000A mi? yoksa;
X=0x0000000A mı? yazacağını bilir.

Işte C'de değişkenlerin char, short, int gibi tanımlanması ihtiyacının sebebi de budur.

Yukarıdaki satırlarda "X=10 ataması ile karşılaşan derleyici,  Ramda X in saklı olduğu adrese 10 değerini yazacak kodları uretir." demiştim.

Eger X=10 yazmak yerine program yazan kişi olarak Ramda X in saklı oldugu adrese 10 değerini biz yazmak isteseydik ne yapardık?

Bazı Basic derleyicilerinde Peek ve Poke komutu ile ramdaki veriler üzerinde oynamak yada verileri okumak mumkun olsa da artık bu noktadan sonra BASIC dilinden bahsetmeyeceğim.

C'de int*p tanımı yaparak integer verilerin bulunduğu adreslere erişebilen adı p olan POINTER tanımlamış oluruz.

int x;  // Bunun zaten, x bir integer değişken oldugu anlamına geldiğini biliyoruz.

Eger  p=&x; dersek p pointerine x değiskeninin adresini yerleştirmiş oluruz.

Artık *p=10; dersek x in Ramda işgal ettiği yere 0x0000000A yazmış oluruz.

eğer int x yerine char x, int*p yerine de char *p demiş olsaydık,

bu durumda  *p=10; dediğimizde x'in ramda işgal ettiği alana 0x0A yazmış olurduk.

Yukarıdaki kısmi çok iyi anlamadan aşagıdaki satırları okumaya geçmeyin.

Pointer kullanımı ne işimize yarar?

Örneklerle cevap vereceğim.

Bir fonksiyonun geri döndürebileceği değer sadece bir tanedir.

int MyFunc(int a, int b) fonlsiyonunu ele alalım.

Bu fonksiyona, a ve b verilerini kullanarak istediğimiz işlemi yaptırıp sonucunu int olarak çağıran koda bildirebiliriz.
Fakat sadece bir tane sonuç bildirebiliriz.

int MyFunc(int a, int b)
{
int s1,s2,s3,s4;

    s1=a+b;
    s2=a-b;
    s3=a*b;
    s4=a/b;
   
    buradaki s1,s2,s3,s4 sonuçlarını MyFunc fonksiyonunu çağıdan komuta nasıl bildirebiliriz?
}

Çözümlerden birisi global değişken kullanmaktır.

int s1,s2,s3,s4;

// Global değişken tanımı yaptıktan sonra

int MyFunc(int a, int b)
{
    s1=a+b;
    s2=a-b;
    s3=a*b;
    s4=a/b;

}

// Buradaki s1,s2,s3,s4 sonuçlarını MyFunc fonksiyonunu çağıran programa nasıl bildirdiğimize bakalım.

int main()
{
int a1,a2,a3,a4;
int b1,b2,b3,b4;
int c1,c2,c3,c4;

        MyFunc(10, 2); a1=s1; a2=s2; a3=s3; a4=s4;
        MyFunc(12, 3); b1=s1; b2=s2; b3=s3; b4=s4;
        MyFunc(15, 4); c1=s1; c2=s2; c3=s3; c4=s4;
        return(0);

}

Bu işlemi pointerle yapmak istersek

MyFunc fonksiyonuna, sonuçların yazılacağı değişkenlerin adreslerini bildirmemiz yeterli olur.

MyFunc sonuçların yazılacağı adresleri bildiğinden a+b, a-b, a*b, a/b işlemlerinin sonuçlarını doğrudan yazılması gereken değişkenlerin içine yerleştirir.

Bu durumda yazılımız aşağıdaki gibi olacaktır.

void MyFunc(int a, int b, int*s1, int*s2, int*s3, int*s4)
{
      *s1=a+b;
      *s2=a-b;
      *s3=a*b;
      *s4=a/b;
}

int main()
{
int a1,a2,a3,a4;
int b1,b2,b3,b4;
int c1,c2,c3,c4;

     MyFunc(10,2, &a1, &a2, &a3, &a4);
     MyFunc(12,3, &b1, &b2, &b3, &b4);
     MyFunc(15,4, &b1, &b2, &b3, &b4);
   
     return(0);
}

Ilk programı ve yapılan işlemleri, bir de yeni yazdığımız pointer kullanılmış programı ve ara işlemleri mukayese ederseniz C de Pointer kullanmanın avantajı kolayca anlaşılacaktır.

Yazı editlenerek devam edecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Alıntı yapılan: muhittin_kaplan - 31 Ekim 2011, 15:56:58
Burada Bir Soru Sorabilirmiyim.
Basicde tek derinlikli Array lar oluşturabiliyoruz. C de 2-3 olduğunu biliyorum
Yani
int A[10;10]
gibi
Bunun Nasıl bir avantajı vardır?

Çok boyutlu dizi ile bir çok şey yapılabilir. Eğer display kullanıyorsanız ve menü yapıyorsanız En sık ihtiyaç duyacağınız kullanım yeri
menü yapmak olacaktır.
const char mainmenu_header[][17]={
						  "[  ANA  MENU   ]\0",
                    "[  MAIN  MENU  ]\0",//0
									   };
const char mainmenu_titles[][34]={
						  "Sistem          \0System          \0",//0
						  "Gorunum         \0View            \0",//1
						  "Genel ayarlar   \0Global settings \0",//2
						  "Pompalar        \0Pumps           \0",//3
						  "Servis ayarlarI \0Service settings\0",//4
									   };

z

En son yukaridaki pointer basligi altinda structure ve uniondan bahsedecegim.

Simdi, konuyla ilgilenen tum arkadaslari bu basliga davet ediyorum.

Basic bilip C ile calismamis fakat bu basligi takip edenlerin C diline gecis icin dusuncelerini merak ediyorum.

Bundan sonraki konulari ele almak uzere, ornegin proton basliginda tartismaya acilmis BASIC programlarini C diliyle yeni bastan yazmak icin zaten Hitech ile kodlama yazan arkadaslari da davet ediyorum.

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

a.zorba

 yazıları takip edmeme ragmen birazda konunun pişmesini bekleyerek üzerlerinde çok durmadım ama basic den C ye geçişde en buyuk sıkıntı
delay.c 
delay.h
lcd.c
lcd.h
yani include ler in çeşidliligi ve anlaşılmasının zorlugu biraz bu konuyu açarmsınız
Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

z

Bahsettiğiniz dosyalar hakkında en ufak bilgim yok.

Amacımız ARM işlemcilere geçişte Basic kullanan arkadaşların C sorunu yok etmek.

Keil konusunun işlendiği Keil programının kurulumu ve kullanılması https://www.picproje.org/index.php/topic,35719.0.html başlığına ardından da

STM32F-Discovery örnek temel programlar  https://www.picproje.org/index.php/topic,35896.0.html başlığına bir göz atıp

sorularınızı örnek programlarda include edilen dosyalardan da seçebilirsiniz.

Yularıdaki sorunuza cevap için diğer arkadaşları beklemek gerekecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

DumrulBey

Alıntı yapılan: bunalmis - 31 Ekim 2011, 18:18:44Amacımız ARM işlemcilere geçişte Basic kullanan arkadaşların C sorunu yok etmek.

Keil konusunun işlendiği Keil programının kurulumu ve kullanılması https://www.picproje.org/index.php/topic,35719.0.html başlığına ardından da

STM32F-Discovery örnek temel programlar  https://www.picproje.org/index.php/topic,35896.0.html başlığına bir göz atıp sorularınızı örnek programlarda include edilen dosyalardan da seçebilirsiniz.
Bu vesileyle ben de yeni bir döneme giriyorum. Eski PIC Assembly'den uzaklaşmayı ve C'ye daha çok alışıp kuvvetli sistem kaynakları olan donanımlara geçmek istiyorum. Dolayısıyla yönetilmesi gereken kaynaklar fazla olunca işleri kolaylaştırmak için zemin hazırlamalı diye düşünmekteyim. Tam bu kritik dönemde bir kaç şeyi merak ediyorum:

PIC17 instruction set'deki fazladan komutlar C'ye göre uyumlu olduğunu hatırlıyorum. Bu durumda BASIC gibi dillere göre öne çıktığını söyleyebilir miyiz? Ayrıca ARM'deki instruction set hakkında bilgi var mıdır? Yoksa object code salt C ile mi oluşmaktadır?

Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

z

Aslında bu tip sorular bizi amacımızdan saptırır.

Alıntı YapPIC17 instruction set'deki fazladan komutlar C'ye göre uyumlu olduğunu hatırlıyorum. Bu durumda BASIC gibi dillere göre öne çıktığını söyleyebilir miyiz? Ayrıca ARM'deki instruction set hakkında bilgi var mıdır? Yoksa object code salt C ile mi oluşmaktadır?

Bir işlemcinin C ye uyumlu komut kümesinin olması ne kadar doğru bir tabir tartışılır. C'deki While, for gibi komutların arka planında koşacak makine kodlarının daha kolay ve daha optimize yazılmasına yarayan ve bu amacla olusturulmus komut seti, sadece C de değil, Basic'de de ASM'de de çok işe yarar.

Örneğin ARM'ın CBNZ yani Compare and Jump Not Zero makine komutu, C deki While yada For tipi komutlar için olduğu kadar Basic ve ASM için de biçilmiş kaftandır.

Basic derleyici yazanlar bu komutları kullanarak Basic'in while ve for döngülerini daha optimize  hale getirecek kodlar ürettirebilir.

ARM CM3, CM4 vs işlemcilerin komut seti ARM sitesinde mevcut.

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