C Programlama diliyle şamatalar

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

muhittin_kaplan

Hocam inceledim. Font ceviriciler tek sutunlu  tablo hazirliyordu ben sonrasinda degistiriyordum. Simdi adresi alip satiri hesaplayip basacagim karakteri. Yani anlayacagin tek sutunlu bir array la yapacagim.
İlginize tesekkur ederim. Z kizdi biraz ama :)

muhittin_kaplan

void degerYaz (unsigned char *s,char *fontName)
{

	int loop;
	char a;
	char *startPoint;
	a=(*s-32);
	startPoint=fontName+(a*12);//font uzunlugu=12byte
	char deger;
	for (loop = 0; loop < 12; ++loop) {
		deger=*startPoint++;
		if (deger!=0) {
			deger=1;
		}
	}
}


sanırım yukardaki olur.

z

Hala kızıyorum. Array'ın başlangıç adresini yolladıktan sonra arrayin kaç boyutlu olduğunun önemi varmı?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan


z

Hocam neden var? Arrayın boyutunu da uzunluğunu da biliyorsun adresini de.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Hocam çift yada tek olsun, hafızada ardışık olarak durmuyormu ?
"

muhittin_kaplan

Bu aralar kalın kafalığım üzerimde, yada "iğhtiyarlıyoruz zannımca"
coşkun zaman ayırdı anlattı, ama problem bende az et yiyorum bu aralar herhalde.

aşağıdaki gibi bir yapım var.


peki neden main.c de

LCD_write_String(10,20,"DENEME YAZISI",MAVI,BEYAZ,font1);

dediğimde font1 bulunamadı diyor.

Olayı Baştan Anlatırsanız daha çok sevinirim

fatih6761

Hocam dikkat edin #include (başlık dosyalarının dahil edilmesi) ağacı gösterdiğiniz şekilde değil.
Main.c, Main.h'yi içeriyor.
Main.h, ili9325.h'yi içeriyor.
-- SON --
ili9325.c, ili9325.h'yi içeriyor.
ili9325.c, englishFont.h'yi içeriyor.
ili9325.h, englishFont.h'yi içermiyor.

muhittin_kaplan

Degil derken hatali yani. Bu isin mantigi nedir
(Cepten bagliyim bu arada)

fatih6761

Mantığı basit hocam. Preprocessor yani önişlemci denen mekanizma, #include gibi içermeleri ve #define, #ifndef gibi ifadeleri çözümlüyor. Dahil etme (include) için yaptığı tek şey belirtilen dosyanın içeriğini alıp, #includue "xxx.h" satırının yerine koyuyor.
Bu işlemin sonucunu gcc'de -E parametresi ile görebilirsiniz.
Örnek C dosyası:
#include "kod.h"

int kod(){
        myStruct yapi1;
        yapi1.a = 10;
        yapi1.b = 20;
}

H dosyası:
#ifndef KOD_H
#define KOD_H   /* özyinelemeden koru */

typedef struct {
        int a;
        short b;
} myStruct;

#endif

gcc -E kod.c çıktısı:
# 1 "kod.c"
# 1 "<command-line>"
# 1 "kod.c"
# 1 "kod.h" 1



typedef struct {
 int a;
 short b;
} myStruct;
# 2 "kod.c" 2

int kod(){
 myStruct yapi1;
 yapi1.a = 10;
 yapi1.b = 20;
}

Gördüğünüz gibi header başlık dosyası önişlendikten sonra doğrudan yerine yerleştirildi. Ve bu olay karşılıklı değil.
Yani kod.h dosyasında tanımladığım bir şeye kod.c den erişebilirim. Ancak kod.c de tanımladığım birşeye kod.h'den erişemem.
Bunun için main.c dosyasından başlayarak kağıt ve kalem eşliğinde :) bir include ağacı oluşturun. Yapmanız gereken tek şey dahil edeni üste, dahil edileni de dallanarak altına yazmak.
Bu şekilde sorunu çözebilirsiniz, kolay gelsin, iyi çalışmalar hocam...

muhittin_kaplan

derleme esnasında birkaçtane uyarı alıyorum ?

warning: pointer targets in passing argument 3 of 'LCD_write_String' differ in signedness [-Wpointer-sign]



fatih6761

Alıntı yapılan: muhittin_kaplan - 06 Nisan 2013, 14:32:26
derleme esnasında birkaçtane uyarı alıyorum ?

warning: pointer targets in passing argument 3 of 'LCD_write_String' differ in signedness [-Wpointer-sign]

Hocam parametre olarak belirtilen tip ile gönderilen tip işaret bakımından farklı diyor. Yani örneğin fonksiyonu:
void foo(int *p)

gibi tanımladınız kullanırken:
unsigned int *p1 = 0xDEADC0DE;
foo(p1);

yaptınız. Dolayısıyla işaret farkı oluyor. explicit olarak atayabilirsiniz ya da işaretleri kontrol edin.

yldzelektronik

Selamlar.C diline hakim değilim.Bir konuda sıkıntı yaşıyorum.Normalde bir fonksiyona parametre girişi yapabiliyoruz.Bunu biliyorum ancak parametreleri öteleme komutuyla nasıl giriyoruz onu anlamadım.

Send(unsigned int8 WriteAddress, unsigned int8 SendByte , unsigned int8 DeviceAddress)
{}


Şeklinde bir fonksiyonum var.Ancak bu fonksiyonu başka bir yerde şöyle çağırmış;

Send( (s_data >> 8) & 0xFF ,s_data & 0xFF ,  ADDR_WM8731S) );


Benim anlamadığım her parametre için bir sürü işlem yaptırmış bu nasıl oluyor?Mesela s_data için fonk. çağırıldığında sağa sekiz ötelemiş bir de kalkıp 0xff ile andlemiş.Bunu hangi sıralamayla yapıyor?Yani s_data nın ilk değer örneğin dec 1 olsun. (0x01 aynı şey.)

Send((0x01>>8)& 0xff,x,x)


Şimdi 0x01 önce sekiz kez sağa ötelenip bir değer oluşturulacak doğru mu?Bu da 0 olacak.Bunu 0xff ile and yaparsak 0x00 olacak.Yani fonksiyon işlenmeye başladığında s_data nın değeri 0x00 olmuş olacak doğru mu?
Fonksiyonun tamamı;
{
    unsigned int i2c_state= I2C_Start();
    if(!(i2c_state))
    return DISABLE;
    I2C_SendByte(DeviceAddress & 0xFF);  
    if(!I2C_WaitAck()){I2C_Stop(); return DISABLE;}
    I2C_SendByte( WriteAddress );     
    I2C_WaitAck();   
    I2C_SendByte(SendByte);          
    I2C_WaitAck();   
    I2C_Stop(); 
    return ENABLE;
} 


Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

fatih6761

Alıntı yapılan: yldzelektronik - 15 Nisan 2013, 15:20:19
Selamlar.C diline hakim değilim.Bir konuda sıkıntı yaşıyorum.Normalde bir fonksiyona parametre girişi yapabiliyoruz.Bunu biliyorum ancak parametreleri öteleme komutuyla nasıl giriyoruz onu anlamadım.

Send(unsigned int8 WriteAddress, unsigned int8 SendByte , unsigned int8 DeviceAddress)
{}


Şeklinde bir fonksiyonum var.Ancak bu fonksiyonu başka bir yerde şöyle çağırmış;

Send( (s_data >> 8) & 0xFF ,s_data & 0xFF ,  ADDR_WM8731S) );


Benim anlamadığım her parametre için bir sürü işlem yaptırmış bu nasıl oluyor?Mesela s_data için fonk. çağırıldığında sağa sekiz ötelemiş bir de kalkıp 0xff ile andlemiş.Bunu hangi sıralamayla yapıyor?Yani s_data nın ilk değer örneğin dec 1 olsun. (0x01 aynı şey.)

Send((0x01>>8)& 0xff,x,x)


Şimdi 0x01 önce sekiz kez sağa ötelenip bir değer oluşturulacak doğru mu?Bu da 0 olacak.Bunu 0xff ile and yaparsak 0x00 olacak.Yani fonksiyon işlenmeye başladığında s_data nın değeri 0x00 olmuş olacak doğru mu?
Fonksiyonun tamamı;
{
    unsigned int i2c_state= I2C_Start();
    if(!(i2c_state))
    return DISABLE;
    I2C_SendByte(DeviceAddress & 0xFF);  
    if(!I2C_WaitAck()){I2C_Stop(); return DISABLE;}
    I2C_SendByte( WriteAddress );     
    I2C_WaitAck();   
    I2C_SendByte(SendByte);          
    I2C_WaitAck();   
    I2C_Stop(); 
    return ENABLE;
} 

Hocam neticede bu dilleri de insanlar oluşturdu. Dolayısıyla derleyiciler de insan mantığı gibi çalışıyor. İfadeler genellikle içten dışa doğru ayrıştırılıyor.
Bir ifadenin parametre verirken çağrılmasının normalden hiçbir farkı yok.
(s_data >> 8) & 0xFF

Bu sık kullanılan bir aritmetik ifadedir. s_data'nın 8.bitinden başlayan bir byte'ı ayıklamak için kullanılır.
Parantezlere bakılırsa önce s_data 8 bit sağa kaydırılır, sonra 0xFF ile 've' işlemi uygulanır. Elde edilen sonuç yığıta basılır. Fonksiyon bu değeri parametre olarak kullanır.
Karmaşıklık açısıdan şu da mümkündür:
((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7

Bunu alıp iç içe iki fonksiyona parametre gönderebilirsiniz. Hatta parametre gönderiken cast ile atama bile yapabilirsiniz, size kalmış :)

X-Fi

Aslinda olay parse etmek yani 16 bit verinin yüksek bitlerine ulaşmak. (bu işem için bir diğer yöntemde 2 nin katlarina bölmektir) Bir int. veriyi 8 kez ötelerseniz yüksek baytini küçüğe yüklersiniz. 0xFF ile andlemek ise küçük baytın dışındaki hiçbir biti alma demek anlamına geliyor. Değişkenler ram adresi olunca ve  8, 16, 32 bit belleklere sahipse veride istenilen kısımlarına ulaşmak için bu kaydırmalar kullanılıyor.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)