Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Hi-Tech Struct parametre problemi

Başlatan strom, 25 Ocak 2010, 10:12:38

strom

Arkadaşlar bu hi-tech beni öldürecek.Bir sorunu bitmeden diğeri başlıyor.
Şu tuhaflığa bakar mısınız;

struct HD{
   unsigned char x ;
   unsigned char y ;
   unsigned char hxy;
};

void MesajGonder(struct HD hd){
   unsigned char x;
   unsigned char y;
   x = hwnd.x;
   y = hwnd.y;

   KarakterYaz(x,y,'A');
      
   
}   

Arkadaşlar kodu bu şekilde çalıştırdığımda ekranda hiçbirşey göremiyorum.Ama;

void MesajGonder(struct HD hd){
   unsigned char x;
   unsigned char y;
   x = hwnd.x;
   y = hwnd.y;
       PORTC = x+y;
   KarakterYaz(x,y,'A');
      
   
}   

dediğimde PORTC'de x ve y'nin toplamı görünüyor.Bunu;
PORTC = x;
PORTC = y;
diye ayrı ayrı yaptığımda da beklenilen değerleri gösteriyor.Ama ne yaparsam yapim KarakterYaz fonksiyonuna parametre olmuyorlar.Ama;

void MesajGonder(struct HD hd){
   unsigned char x;
   unsigned char y;
   x = hwnd.x;
   y = hwnd.y;
       PORTC = x+y;
   KarakterYaz(0,0,'A');
      
   
}
yaptığımda veya;
void MesajGonder(struct HD hd){
   unsigned char x;
   unsigned char y;
   x = 10;
   y = 10;

   KarakterYaz(x,y,'A');
      
   
}
yaptığımda çalışıyor.

Günlerdir kod yazmaktan beynim sulandı.Bulamıyorum sorunu.Sizin gözünüze çarpan birşey var mı?

papylon

struct HD{unsigned char x,y,hxy;}hd;	

	a=hd.x;
	b=hd.y;
	c=hd.hxy;

// veya

hd.x=20;
hd.y=20;
hd.hxy=20;


Struct yapısında kodu yukarıdaki gibi yazmalısın.

acemi2010

Alıntı yapılan: strom - 25 Ocak 2010, 10:12:38
struct HD{
   unsigned char x ;
   unsigned char y ;
   unsigned char hxy;
};

void MesajGonder(struct HD hd){
   unsigned char x;
   unsigned char y;
   x = hwnd.x;
   y = hwnd.y;

   KarakterYaz(x,y,'A');
}   
Gerçi 26 ocak'ta açılmış konu ama.........
Burada struct ile (değişken değil !...) tip tanımlaması yapılmak istenmiyor mu? Dolaysı ile başına TYPEDEF konmalı diye düşünüyorum.

Konu ile ilgili değil gerçi ama 876A'nın C portunun sadece high nible'larını sayan bir programı paylaşmak istedim.

union  {		
	 unsigned char CHAR;	// Char
	 struct	{			// Nibbles x 4 bits
		 unsigned Lo:4;	// Lo
		 unsigned Hi:4;	// Hi
		} Nb4;
	} charX;


//              |<----------  charX.CHAR  ----------->|
//              ---------------------------------------
//     MSB      |    X X X X       |       X X X X    |     LSB
//              -------- = -------------------- = ----- 
//              |   charX.Nb4.Hi   |   charX.Nb4.Lo   |
//              ---------------------------------------


void main(void)
{
	charX.CHAR = 0xAC;   //PORTC'nin low nible'ında 0b1100'ı göreceğiz

	for(;;)
	{
		charX.Nb4.Hi++;   //high nible'ı 1 arttır
		PORTC = charX.CHAR;  //değişkeni PORTC'ye at
		DelayMS(250);  //Değişimi görebilmek için 250milisec bekle  SİZDEKİ DELAY FONKSİYONU FARKLI OLABİLİR!...
	}
}


KAYNAK

// EDuardo Rosso
// types for Hi-Tech C
// ***********************************************
// * Types definitions                           *
// ***********************************************
//
typedef union		{	// charX
	 unsigned char CHAR;	// Char
	 struct	{			// Nibbles x 4 bits
		 unsigned Lo:4;	// Lo
		 unsigned Hi:4;	// Hi
		} Nb4;
	 struct	{			// BITs
		 unsigned b00 :1;
		 unsigned b01 :1;
		 unsigned b02 :1;
		 unsigned b03 :1;
		 unsigned b04 :1;
		 unsigned b05 :1;
		 unsigned b06 :1;
		 unsigned b07 :1;
		} BITs;		
	} charX;
//
typedef union		{	// intX
	 unsigned int  INT;		// Int
	 unsigned char CHARs[2];	// Char 2 (0x0:Lo; 0x1:Hi)
	 struct	{				// BITs
		 unsigned b00 :1;
		 unsigned b01 :1;
		 unsigned b02 :1;
		 unsigned b03 :1;
		 unsigned b04 :1;
		 unsigned b05 :1;
		 unsigned b06 :1;
		 unsigned b07 :1;
		 unsigned b08 :1;
		 unsigned b09 :1;
		 unsigned b0A :1;
		 unsigned b0B :1;
		 unsigned b0C :1;
		 unsigned b0D :1;
		 unsigned b0E :1;
		 unsigned b0F :1;
		} BITs;
	 struct	{				// Nibbles x 4 bits
		 unsigned LL	:4;
		 unsigned LH	:4;
		 unsigned HL	:4;
		 unsigned HH	:4;
		} Nb4;
	 struct	{				// Nibbles x 8 bits
		unsigned char Lo; 	// CharL
		unsigned char Hi; 	// CharH
		} Nb8;
	} intX;	

//
typedef union		{	// longX
	 unsigned char CHARs[4];	// Char 4 (0x0:LLo; 0x1:LHi; 0x2:HLo; 0x3:HHi;)
	 unsigned int INTs[2]; 	// Int 2 (0x0:Lo; 0x1:Hi)
	 struct	{				// Nibbles x 4 bits
		 unsigned LLL	:4;
		 unsigned LLH	:4;
		 unsigned LHL	:4;
		 unsigned LHH	:4;
		 unsigned HLL	:4;
		 unsigned HLH	:4;
		 unsigned HHL	:4;
		 unsigned HHH	:4;
		} Nb4;
	 struct	{				// Nibbles x 8 bits
		 unsigned char LL;
		 unsigned char LH;
		 unsigned char HL;
		 unsigned char HH;
		} Nb8;
	 struct	{				// Nibbles x 16 bits
		unsigned int Lo; 	// IntL
		unsigned int Hi; 	// IntH
		} Nb16;
	 struct	{				// BITs
		 unsigned b00 :1;
		 unsigned b01 :1;
		 unsigned b02 :1;
		 unsigned b03 :1;
		 unsigned b04 :1;
		 unsigned b05 :1;
		 unsigned b06 :1;
		 unsigned b07 :1;
		 unsigned b08 :1;
		 unsigned b09 :1;
		 unsigned b0A :1;
		 unsigned b0B :1;
		 unsigned b0C :1;
		 unsigned b0D :1;
		 unsigned b0E :1;
		 unsigned b0F :1;
		 unsigned b10 :1;
		 unsigned b11 :1;
		 unsigned b12 :1;
		 unsigned b13 :1;
		 unsigned b14 :1;
		 unsigned b15 :1;
		 unsigned b16 :1;
		 unsigned b17 :1;
		 unsigned b18 :1;
		 unsigned b19 :1;
		 unsigned b1A :1;
		 unsigned b1B :1;
		 unsigned b1C :1;
		 unsigned b1D :1;
		 unsigned b1E :1;
		 unsigned b1F :1;
		} BITs;
	 signed long LONG;
	}longX;
//


Bunları tabii ki pekçoğunuz biliyorsunuzdur; ama struct ve union'u anlayabilmek için ne kadar tırmaladığımı hatırladığımdan bilmeyenler için tekrar bu başlık altında belirteyim istedim.
Bu noktada 1 sorum olacak, denedim ama olmadı: PORTC'yi struct'ın içine sokabilsek ve de charX.Nb4.Hi'ı değiştirdiğimizde direk PORTC'nin sadece high nible'ı değişse, yani extradan değişken kullanmasak  ;)
Çok mu fantazi yapıyorum acaba  ???

Herkese hayırlı çalışmalar.
Timuçin