C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

sseedat

aynı değişkene farklı dosyalardan erişmek istediğinde kullanırsın.harici değişken olarak bilirim bellekte yer ayırmaz sadece derleme zamanında linker devreye girip olayları birbirine bağlar
Görünmez bir mezarlıktır Zaman...

muhittin_kaplan

Sunumu anlamiyim?
main.c dosyasinin icerisindeki degisken eger extern int a olarak tanimlarsam, mhk.c dosyasindan da ulasabilirim

armsistem

#332
Arkadaşlar merhaba , aşağıdaki dizi ile ilgili örneği anlayamadım.

- bir döngü oluşturuyorum . 4 kez tektarlanacak.

- daha sonra strncmp fonksiyonu kullanılıyor , ama neden Rec '&' şeklinde gönderiyoruz. Rec adresini mi göndermiş oluyoruz ?

http://www.csystem.org/kaynak-kod-arsivi/strncmp-fonksiyonu

- Döngüde n sürekli artıyor 1,2,3'e kadar.

- Rec[0]=B ,Rec[1]=Y ,Rec[2]=E   .... eşit değilmidir. Aşağıda if kısımda ki sorgulama nasıl gerçekleşiyor ?

unsigned char Rec[]={"BYE---"};
for(n=0; n<4 ; n++)
	{
		if (!strncmp( &Rec[n],"BYE",3 ))   
{
//event
 }	
         else	if (!strncmp( &Rec[n],"OK",2 ))   
{ 
//event
}



}

Klein

Eğer bir işaretçiye  dizinin ismini, başında & karakteri ve eleman numaras olmadan geçersen ,  dizinin başlangıç adresini vermiş olursun.

örn
char dizi[]="klllkjlklklk"
char *ptr;

ptr = dizi; ptr işaretçisine dizinin başlangıçadresini attık.

ptr= &dizi[3] şeklinde atama yaparsak , dizinin 4. karakterinin adresini atamış oluruz.


strncmp() fonksiyonu  2. parametrede verilen string ile, 1. parametrede verilen stringin 3.parametre ile belirlenen kadar uzunluktaki kısmını karşılaştırır. 
Muhtemelen dizideki verinin ilk karakteri her zaman aranan karakter olmuyor. Bu yüzden programcı aranan ilk karakterin başladığı yeri bulmak için döngüde adresi artırıyor.   

armsistem

Yanıt için çok teşekkürler. Benimde kafamı karıştıran nokta o oldu. Tamda anlamış değilim.

Aşağıda komut satırında &Rec[n] = Rec[0] = "BYE" ------> mı oluyor ?
                               
  if (!strncmp( &Rec[n],"BYE",3 ))   
 

unsigned char Rec[]={"BYE---"};
        if (!strncmp( &Rec[n],"BYE",3 ))   
   

Klein

Rec[0] = 'B'
Rec[1] = 'y'
Rec[2] = 'e'  olur.

Kafanı karıştıran sanırım  for döngüsü.

unsigned char Rec[]={"Bye---"}
Buradaki gibi dizimizin içeriği kesin belli ise , for döngüsü anlamsız. 

if (!strncmp( Rec,"Bye",3 ))
sonucu verecektir.

İçeriğimiz "xxBye---"  şeklinde olsaydı ve biz bu düzeni kesin biliyor olsaydık ,

if (!strncmp( &Rec[2],"Bye",3 ))
karşılaştırmaya dizinin 3. elemanından başla diyebilirdik.

Fakat dizimizin içeriği her zaman aynı değilse, yani bazen "xBye--" , bazen "xyzBye----" , bazen "Bye---" şeklinde geliyorsa, o zaman belediğimiz sözcüğün ilk karakterinin yerini araştırmamız gerekir.
Bu programda da yapılan o.
Önce Rec[0] dan başla karşılaştır diyor. baktı sonuç yok, n değerini 1 artırıp Rec[1] den başla diyor... böyle devam ediyor.

Bunun yerine
strchr(....)  fonksiyonu ile   B karakterinin başladığı yer bulunup sonra bu adresten başlayan karşılaştırma yapılabilir.
veya
strstr(....) fonksiyonuyla  dizi içerisinde  "Bye" kelimesi aratılır. eğer bu dizi içerisinde aradığımız kelime varsa başlangıç adresi döner.

armsistem

hımmm dostum çok teşekkürler şimdi anladım.

Deli_Nedym

stm32f4 kitinde keil ile şu kodu yazdım. Olay o kadar ilginç ki kafayı yedim >:(
en alttaki for döngüsü sorunlu. 2 kez ledleri yakıp söndürüp, sonra for'dan çıkıp tamamen ledler yanmalı. Bu arkadaş 6 kez led yak söndür yapıyor.
Ben 4 yap dersem 12 yapıyor, 5 dersem 15 hep üç katı. Uğraştım uğraştım bi türlü nulamadım çok ufak bi yeri atlıyorum ama kafayı yedirtti bana gerçekten. Bi el atıverin hocalar  :(

#include "STM32F4xx.h"

void SystemInit()
{
unsigned int i;


    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 


 void delay_ms(int bekle)        // 168 mhz'de 1cyc=6ns
 {
   int i=0;
   int j=0;
    
   for(j=0;j<bekle;j++)
   {
     for (i=0;i<33500;i++);     // 166600*6ns=1ms
   }
 }   
 

int main()
{
     
int m=0;
 for(m=0; m<2; m++)
  {		                                            		        
                  GPIOD->ODR= 0x0000F000;     // Ledler yansin
                  delay_ms(500);
                  GPIOD->ODR= 0x00000000;     // Ledler sonsun
                  delay_ms(500); 
     }     
       GPIOD->ODR= 0x0000F000;
							
}          // Programin sonu

AsHeS

Alıntı yapılan: Deli_Nedym - 10 Ocak 2013, 07:53:39
stm32f4 kitinde keil ile şu kodu yazdım. Olay o kadar ilginç ki kafayı yedim >:(
en alttaki for döngüsü sorunlu. 2 kez ledleri yakıp söndürüp, sonra for'dan çıkıp tamamen ledler yanmalı. Bu arkadaş 6 kez led yak söndür yapıyor.
Ben 4 yap dersem 12 yapıyor, 5 dersem 15 hep üç katı. Uğraştım uğraştım bi türlü nulamadım çok ufak bi yeri atlıyorum ama kafayı yedirtti bana gerçekten. Bi el atıverin hocalar  :(

#include "STM32F4xx.h"

void SystemInit()
{
unsigned int i;


    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 


 void delay_ms(int bekle)        // 168 mhz'de 1cyc=6ns
 {
   int i=0;
   int j=0;
    
   for(j=0;j<bekle;j++)
   {
     for (i=0;i<33500;i++);     // 166600*6ns=1ms
   }
 }   
 

int main()
{
     
int m=0;
 for(m=0; m<2; m++)
  {		                                            		        
                  GPIOD->ODR= 0x0000F000;     // Ledler yansin
                  delay_ms(500);
                  GPIOD->ODR= 0x00000000;     // Ledler sonsun
                  delay_ms(500); 
     }     
       GPIOD->ODR= 0x0000F000;
							
}          // Programin sonu

Hiç sistem fonksiyonlarına bulaşmadan söyleyebilirim ki şunu bir dene
while(1) {
for(m=0; m<2; m++)
  {                                                               
                  GPIOD->ODR= 0x0000F000;     // Ledler yansin
                  delay_ms(500);
                  GPIOD->ODR= 0x00000000;     // Ledler sonsun
                  delay_ms(500);
     }     
       GPIOD->ODR= 0x0000F000;
         }

Deli_Nedym

Sonsuz döngüye giriyor  böyle

AsHeS

for yapıs....
  {                                                               
                  GPIOD->ODR= 0x0000F000;     // Ledler yansin
                  delay_ms(500);
                  GPIOD->ODR= 0x00000000;     // Ledler sonsun
                  delay_ms(500);
     }     
       GPIOD->ODR= 0x0000F000;
while(1);
Programı durdurmazsan flash üzerinden devam edebilir derleyiciye bağımlı olarak.

Deli_Nedym

Son şekilde çalıştı ama o while(1) nasıl bunu sağladı hiç anlamadım  :-X
Sonsuz döngüye girdi orda ama daha evvel oraya gelmiyordu ki bu kodlar for'un içinde dönüp duruyordu çıkınca da tekrar başa dönüyordu bunu 3 kez tekrarlıyordu , biz şimdi o bi kere yapınca sonsuz döngüye sokuyoruz o nedenle başa dönmüyor. Bir çözüm bu tamam kabul ama ne bileyim for'un kendi yazılış sistemini değiştirmedi maalesef

AsHeS

#342
Alıntı yapılan: Deli_Nedym - 10 Ocak 2013, 08:14:16
Son şekilde çalıştı ama o while(1) nasıl bunu sağladı hiç anlamadım  :-X
Sonsuz döngüye girdi orda ama daha evvel oraya gelmiyordu ki bu kodlar for'un içinde dönüp duruyordu çıkınca da tekrar başa dönüyordu bunu 3 kez tekrarlıyordu , biz şimdi o bi kere yapınca sonsuz döngüye sokuyoruz o nedenle başa dönmüyor. Bir çözüm bu tamam kabul ama ne bileyim for'un kendi yazılış sistemini değiştirmedi maalesef
Dediğinizi yanlış anladıysam düzeltirsiniz beni de  benim gönderdiğim kodda for döngüsünü bitirip ledleri yakıp programı durduruyor.Sizin düşünceniz ise aynı for döngüsüne dallandığınızı düşünüyorsunuz işin aslı öyle değil for döngüsünü bitirip ledleri set ettikten sonra programınız durmadığı veya bir döngüde kalmadığı için devam ediyor devamında ki kodları siz göremezseniz artık flash memory de ne varsa onu çalıştırır sizin de şansınıza ledler yanıp sönüyor :).

mesaj birleştirme:: 10 Ocak 2013, 08:21:13

Ayrıca siz bu döngünün durmadan olmasını istiyorsanız benim dediğimi yazmanız gerekiyor
while(1){

//sizin kodlarınız

}
Bu şekilde yazarsanız programınız hep aynı işlevi yapar siz elektriği kesinceye kadar.

Deli_Nedym

#343
Anladım hocam eyvallah for'a tekrar dallanmamasına rağmen aynı for'daki işlemleri yapması kafamı karıştırdı. Satır satır nasıl izleyebiliriz programı ? Debug yapınca daha sistem ayarlarının olduğu kodlardan çıkamıyoruum da alt satırlara direkt geçemez miyim ?

mesaj birleştirme:: 10 Ocak 2013, 17:18:47

For döngüsünün end ile bitmiyor olması da beni şaşırttı. C dillerinde öyle değil mi ? Burda neden değil ? Atıyorum ben for döngüsü içindeyken mavi butona basınca for'dan çıksın ve kaçıncı döngüdeyse bana o döngünün sayısını versin istiyorum napıcam ? Keil beni bitirdin ya  >:(

Seckin ALAN

Alıntı yapılan: Deli_Nedym - 10 Ocak 2013, 16:47:56
Anladım hocam eyvallah for'a tekrar dallanmamasına rağmen aynı for'daki işlemleri yapması kafamı karıştırdı. Satır satır nasıl izleyebiliriz programı ? Debug yapınca daha sistem ayarlarının olduğu kodlardan çıkamıyoruum da alt satırlara direkt geçemez miyim ?

mesaj birleştirme:: 10 Ocak 2013, 17:18:47

For döngüsünün end ile bitmiyor olması da beni şaşırttı. C dillerinde öyle değil mi ? Burda neden değil ? Atıyorum ben for döngüsü içindeyken mavi butona basınca for'dan çıksın ve kaçıncı döngüdeyse bana o döngünün sayısını versin istiyorum napıcam ? Keil beni bitirdin ya  >:(

for(int i=0;i<10;i++)
{

}// burada for döngüsüne tekrar dallan diyor aslında.  şart bitersede end for işlevini yerine getir.

Döngüden çıkmak için break; komutu kullanılır. Kaçıncı döngü sayısını bir değişkende tutabilirsiniz.
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana