Struct & Union kullanımı

Başlatan yldzelektronik, 10 Temmuz 2013, 17:53:13

JKramer

#15
http://www.ccsinfo.com/forum/viewtopic.php?p=177610

Mümkün görünmüyor. Struct içindeki sıralı değişkenlerin toplamı 8 bit olmalı; 7+1, 6+2 gibi.

yamak

Alıntı yapılan: M_B - 25 Temmuz 2013, 14:53:02
malesef o sekılde de olmuyor.
Anladıgım kadarıyla derleyici 16 biti gecmek istemiyor.
şu şekilde yapınca kızmıyor
typedef  union
{
      int all;
      struct{
         int b0 :7;
         int b1 :1;
         int b2 :7;
         int b3 :1;
         int b4 :4;
        };
}bittype;

Hocam o kısmı dikkatimi çekmemişti.Zaten PIC lerde derleyiciler int değişkenler için bellekte 16 bit uzunluğunda yer ayırıyor. int all; u long int all olarak değiştirirseniz muhtemelen düzelir.

M_B

Alıntı yapılan: JKramer - 25 Temmuz 2013, 15:23:11
http://www.ccsinfo.com/forum/viewtopic.php?p=177610

Mümkün görünmüyor. Struct içindeki sıralı değişkenlerin toplamı 8 bit olmalı; 7+1, 6+2 gibi.

Hocam doğru da Denediğim iki derleyici sorunsuz olarak derliyor.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

JKramer

Mümkün görünmüyor derken CCS'i kastettim, verdiğim adreste anlatmışlar durumu.

M_B

#19
Alıntı yapılan: JKramer - 25 Temmuz 2013, 16:17:15
Mümkün görünmüyor derken CCS'i kastettim, verdiğim adreste anlatmışlar durumu.
Teşekkür ederim Hocam;
Bu işi CCS C ile yapamayacagız Yukardaki gibi yapabilmiş olsaydım 
https://www.picproje.org/index.php/topic,47937.0/topicseen.html linkteki 7 segment Displayı sürecektim.
Artık baska yol bulmam gerekiyor veya Derleyici kullanmam gerekecekti.
Olsa idi yapım
typedef  union
              {
              long all;
              struct {
                      unsigned  display1    :7;
                      unsigned  display2    :7;
                      unsigned  display3    :7;
               	      unsigned  display4    :7;
               	      unsigned  nokta       :4;
                      };
             }bittype;
   
bittype  Displayler;

olacaktı
Displayler.display1=1;
Displayler.display2=2;
Displayler.display3=3;
Displayler.display4=4;
Displayler.nokta=1;
dedikten sonra
Displayler.all; verisini bit bit gönderecektim.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yldzelektronik

Selamlar.

struct{
   char Mod;                          
   char Out_ID;                  
   char Request_Type;               
   char Unit_ID;               
   char Const_ID[3];     
   char Rx_Buffer_Size;
   float Calibration;         
}Parameters;

//Parameters = {0,0,0,2{'P',0,0},4,0.00};


Şeklinde bir yapı tanımlıyorum ancak yapının elemanlarına ilk değer veremiyorum.Tek seferde

Parameters = {0,0,0,2{'P',0,0},4,0.00};

şeklinde değer verilebiliyor diye biliyorum.Ancak hata alıyorum.
"Expecting a decleration."
İlk değer verme işini nasıl yapabilirim ki?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Klein

#21
İlk değer verme söz dizimi derleyiciye göre değişiyor.  İçteki küme parantezini kaldırıp, Array'e ilk değer atıyormuş gibi deneyin.
Ayrıca ilk değeri tanımladığın noktada vermen gerek.

struct
{
..
...
...
} x ={.....};
şeklinde.

mesaj birleştirme:: 16 Eylül 2013, 15:07:42

Öneri :
Bir yapıyı tanımlarken doğrudan değişken olarak değil , bir tip olaraktanımlamak, daha sonra o yapıyı başka yerde kullanmak , fonksiyona parametre geçmek, pointer ile işaretlemek gibi konularda kolaylık sağlar.
bu yüzden benim önerim yapıyı tip olarak tanımlayıp , değişkeni bu tipten elde etmek olur.
typedef struct
{
......
......

}xx_tipi;

xx_tipi  a;
xx_tipi *b;
xx_tipi  c ={......};

.....
fonksiyon ( xx_tipi *param)
{
....
}

vs.. vs..

yldzelektronik

#22
Alıntı yapılan: Klein - 16 Eylül 2013, 14:59:51
İlk değer verme söz dizimi derleyiciye göre değişiyor.  İçteki küme parantezini kaldırıp, Array'e ilk değer atıyormuş gibi deneyin.
...

Bu şekilde çalıştı. teşekkürler.

Ancak bu kez enum ile sorun yaşıyorum.Ccs den mi kaynaklanıyor bilmiyorum.Ancak garip bir şekilde hata silsilesi bırakmıyo yakamı :S




Onu /**/ içine alsam source dosyasında fonksiyonun başı için aynı hata mesajını veriyor.

Header içinde
typedef enum I2C_State_t
{
   I2C_ACCES_ERROR = -2,
   I2C_BUS_ERROR
};


şeklinde tanımlama yapıp,source dosyada;

I2C_State_t I2C_State;


şeklinde bildiriyorum.Arkasından fonksiyon geliyor.;

double Read_Hca0811(void){

...
}


Eğer header içerisindeki enum tanımını silersem fonksiyonun

double Read_H


kısmında hata veriyor.Anlam veremedim.İlginç olan kısmı hata verdiği satırın 1-14.sütünları arasında oluyor.Hangi satır için hata verirse versin 1-14. sütünlar hatalı.Hata mesajı da aynı.

Fikri olan var mı?

mesaj birleştirme:: 17 Eylül 2013, 10:49:17

main programda include ettiğim stdlib dosyasında bile aynı hatayı verdi.Bütün includeleri açıklama satırıyla -//- disable yapınca bu kez stdlib dosyasında aynı hata mesajını verdi.Garip bir durum ama çözümü bilen var mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

#23
Selamlar.

Yapı içinde yapı tanımı nasıl yapılır?Kuralları nedir?Yapı içinde yapı tanımlandığında elemanlara erişim nasıl olur?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.