Dizi elemanlarına başka değikenlere bağlama olabilirmi

Başlatan rree, 15 Kasım 2012, 12:20:29

rree


   int8  Adizi[64];

#Define  Fnks  Adizi[1]                          //      Adizi sinin 1. elemanınan Fnks tanımladım
int32   iadres Adizi[2] ........Adizi[5]       //      Adizi sinin 2 ,3,4,5 elemanına  int32 iadres değişkeni tanımlamak mümkünmü?

adem89

CCS  bilmiyorum ama aşağıdaki pointer işini göreceğini düşünüyorum


#define iadres *p

int main()
{
   int adizi[5];
   int *p;
   p = &adizi[2];       
   *p=10;                   //adizi[2] nin adresine yazılıyor
   iadres = 20;         // *p ile idres aynı yeri gösteriyor
}

Seckin ALAN

#2
Adizisi int 8 tanımlanmış, siz int8'e boyunta bir değişkene int32 uzunluğunda bir veri atamaya çalışıyorsunuz. Bu sağlıklı olmaz veri kaybı yaşarsınız.

Ya iadresi int8'e indirmelisiniz yada Adizisinin boyutunu int32'ye çekmelisiniz.

Bunları yaptığınızı varsayalım
Adizi[2] = iadres;
Adizi[3] = iadres;
Adizi[4] = iadres;
Adizi[5] = iadres;

Yazıdan çıkan sonuç bu. Fakat 4 byte yer tutan int32'yi 1 byte 1 byte ayırmak ise kastınız bunun için bit kaydırma kullanmalısınız.
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

rree

 int8  Adizi[64];

#Define  Fnks  Adizi+1     
#Word  iadres=Adizi+2    Yapsam word (int16) iadres bağlamış oluyorum istediğim bu değil
#Dword  iadres=Adizi+2    yapmak istediğim bu  #Dword diye bir tanım yok?

Basicde bir komut vardı çok kolaydı
  Dim  Adizi(64) as byte
  Dim Fnks As byte Absolute Adizi+1
  Dim  iadres As Dword absolute Adizi+2
    Yanlış hatırlamıyorsam Değişkenin adresini istediğim adrese veya başka bir değişken ile çakıştırabiliyordum.

Değişkenin adresini pointer kullanmadan doğrudan yazabiliceğimiz bir yapı  arıyorum.
  int32  DegA  Adreini yazabilecek bir yapı varmı?

AlexanderII

#4
Merhaba, istediğiniz tanımlamayı union kullanarak yapabilirsiniz.

struct buffer_def
{
	int8 fnc;
        int32 address;

} ;

union myBuffer{
    struct buffer_def buffer;
    int8 data[5];
}; 

union myBuffer data;

// data.data[0] = 5;  veya data.buffer.fnc = 5; şeklinde bellekteki aynı adrese erişim sağlanabilir, aynı koşul data[1,2,3,4] ve address içinde geçerlidir.

yamak

Alıntı yapılan: AlexanderII - 15 Kasım 2012, 15:11:54
Merhaba, istediğiniz tanımlamayı union kullanarak yapabilirsiniz.

struct buffer_def
{
	int8 fnc;
    union 
	{
        int8 address[4];
        int32 address_4;
	} address;

} ;

union myBuffer{
    struct buffer_def buffer;
    int8 data[5];
};

union myBuffer data;

data.data[0] = 5;
data.buffer.fnc = 2;
data.buffer.address[0] = 5;
data.buffer.address_4 = 2;

Bu kodun çalışıp çalışmadığını hiç denediniz mi?
Bu kodda hatalı deneyecek olan arkadaş niye olmuyo yaa diye kafa patlatmasın :)
1. hata:
data.data[0] ile data.buffer.fnc aynı bellek bölgesini gösterir. Yani data.buffer.fnc=2 dedikten sonra data.data
  • ın değeri de 2 olur.
    2. hata:
    data.buffer.address[0] değil data.buffer.address.address[0] olacak.
    3.hata
    data.buffer.address_4 değil data.buffer.address.address_4 olacak.
    4.hata da
    data.buffer.address.address_4=2 den  sonra data.buffer.address.address[0] ın değeri de 2 olur.

rree

Union işimi görmedi yada anlamdım.İlgilenen arkadaşlara tşkr.  Arkadaşlar denerken buldum.
#Byte ve #word tanımı önceden değişken tanımlanırsa yapısını bozmadan adresini değiştiriyor.
unsigned int8 paket[64]; //Dizi tanımlıyoruz
int8 Ufnk;
#Byte UFnk= paket+1     //UFnk adresi Paket[1]  oldu

int32 mmcAdres;
#Word  mmcAdres  =Paket+2 // MmcAdres adresi Paket[2] ile Paket[6] Oldu

char PrAd[20];
#Byte  PrAd  =Paket+7   // PrAd dizinin değeri Paket[7] ile Paket[27] oldu



void main(void)
{   
Strcpy(PrAd,"Ramazan");
mmcAdres=0x04030201;

Paket[28]=0;
Paket[29]=0;

}
:) :) :) :)

AlexanderII

#7
Alıntı yapılan: yamak - 15 Kasım 2012, 17:53:53
Bu kodun çalışıp çalışmadığını hiç denediniz mi?
Bu kodda hatalı deneyecek olan arkadaş niye olmuyo yaa diye kafa patlatmasın :)
1. hata:
data.data[0] ile data.buffer.fnc aynı bellek bölgesini gösterir. Yani data.buffer.fnc=2 dedikten sonra data.data
  • ın değeri de 2 olur.
    2. hata:
    data.buffer.address[0] değil data.buffer.address.address[0] olacak.
    3.hata
    data.buffer.address_4 değil data.buffer.address.address_4 olacak.
    4.hata da
    data.buffer.address.address_4=2 den  sonra data.buffer.address.address[0] ın değeri de 2 olur.
Merhaba, zaten arkadaşında istediği data.data
  • ile data.buffer.fnc'nin aynı adresi göstermesi, ikisini alt alta yazma sebebim ikisine nasıl erişildiğini görmesi içindi. Kodu sonuçta forum sayfasında yazdığım için compile etmedim. Dolayısıyla bakan arkadaş data.buffer.address[0] değil data.buffer.address.address[0] olacağını anlayabilir. Bu sadece forumda aceleyle yazıldığı için gözden kaçan bir yazım hatası.

yamak

Hocam anladım öyle olduğunu fakat işe yeni başalayan arkadaşların kafası karışabilir.

AlexanderII

Alıntı yapılan: yamak - 15 Kasım 2012, 18:14:29
Hocam anladım öyle olduğunu fakat işe yeni başalayan arkadaşların kafası karışabilir.

Haklısınız dikkat etmek gerekli, yardım edelim derken daha çok kafa karışıklığına da sebep olabiliriz. Yanıt yazmamın sebebi, 1. ve 4. adımda belirttiğiniz hataların, aslında arkadaşın istediği durumlar olduğunu belirtmekti. Üstteki kodu kafa karışıklığına sebep vermemek adına düzelttim.

sadogan

Make komutu kullanarak yapılabilir.

unsigned int32 x;
int8  Adizi[64];
Adizi[1]=1;
Adizi[2]=2;
Adizi[3]=3;
Adizi[4]=4;
x=make32(Adizi[1],Adizi[2],Adizi[3],Adizi[4]); //x=01020304

rree

union ile yazmaya çalıştım  4 saat  çalışmadan sonra. Deg32 bitlik değişkenim var.Bu değişkene
bye cinsinden parçalayan Byte3, Byte2, Byte1,Byte0 oluşmakta yine word cinsinden iki ye parçalayan
Word1,Word0  değişkenleri oluşturdum ve kullanımı kolay olsun diye #define tanımladım.
struct DegStrcATyp{
        char Byte3;
        char Byte2;
        char Byte1;
        char Byte0;
      };
struct DegStrcBTyp{
        int Word1;
        int Word0;
      };
struct DegStrcCTyp{
       unsigned long deg32;
      };
union DegUnType {
      struct DegStrcATyp DegStrcA;
      struct DegStrcBTyp DegStrcB;
      struct DegStrcCTyp DegStrcC;
   };
union  DegUnType DegUn;
#define x32int DegUn.DegStrcC.deg32
#define x8int0 DegUn.DegStrcA.Byte0
#define x8int1 DegUn.DegStrcA.Byte1
#define x8int2 DegUn.DegStrcA.Byte2
#define x8int3 DegUn.DegStrcA.Byte3
#define x16int0 DegUn.DegStrcB.Word0
#define x16int1 DegUn.DegStrcB.Word1

void main()

      x32int=0x12345678;
      PrintOut(PrintHandler, "Okunan = %8.0d\r\n",x8int3) ;
      //  ekran çıktısı 120 gösterdi