C Programlama diliyle şamatalar

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

z

Alıntı yapılan: yldzelektronik - 14 Eylül 2013, 15:47:39
......
float value = 123.123; // Bellekte 0x00 adresinde.
int *ptr = &value; //ptrnin içinde 0x00 oldu.

Ben herhangi bir yere *ptr olarak geçersem 0x00 adresinin ilk byte olarak taşıdığı değere erişiyorum.Yani 123.123 4 bytelık sayısının ilk bytena eriştim.Doğru mu?

Yani o zaman şu oluyor;
*ptr ile
ptr kullanımı fark ediyor. Doğru mu?

Bir yere *ptr olarak geçersem adresin taşıdığı değere, ptr olarak geçersem o adrese yani buradaki 0x00 a erişirim.Doğru mu?

Teşekkürler.

float value = 123.123; // Bellekte 0x00 adresinde.
int *ptr = &value; //ptrnin içinde 0x00 oldu.

Yanlis.

Dogrusu;

float value = 123.123; // Bellekte 0x00 adresinde.
float *ptr = &value; //ptrnin içinde 0x00 oldu.

*ptr ile
ptr kullanımı fark ediyor. Doğru mu?


Elbette farkli. *ptr ile pointerin gosterdigi hedefe erisiyorsun. Yildiz olmadan tek basina ptr  oldumu pointere erisiyorsun.

Bir yere *ptr olarak geçersem adresin taşıdığı değere, ptr olarak geçersem o adrese yani buradaki 0x00 a erişirim.Doğru mu?

Yanlis. Dogrusunu bir ust satirda acikladim. *ptr ile pointerin gosterdigi hedefe (adrese ulasirsin) bu tamam. ptr ile pointere ulasirsin.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fatih6761

Alıntı yapılan: yldzelektronik - 16 Eylül 2013, 09:00:28
https://www.picproje.org/index.php/topic,35908.msg364869.html#msg364869

Ne oldu şimdi?Doğru mu yanlış mı?
Hocam mikrodenetleyicide herhangi bir işletim sistemi kullanmadığınızdan bu tür kontroller yok, dolayısıyla verdiğim kod doğru. Ayrıca, kontrol olsaydı da hata vermezdi, çünkü zaten float için ayrılan 4-byte bize ait. İster char ptr ile, ister int ptr ile erişebiliriz.

yldzelektronik

   while((SSP1CON2 & 0x1F) | STAT_RW));


Satırı tam olarak ne anlam taşıyor? Biraz kafam karıştı. İlk parantez ile ikinci şart or lanıyor mu?İlk parantez veya ikinci yazan olduğu sürece anlamına mı geliyor?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

armsistem

Hocam hata vermesi lazım , parentezlerde problem var.

yldzelektronik

Alıntı yapılan: armsistem - 02 Ekim 2013, 16:51:45
Hocam hata vermesi lazım , parentezlerde problem var.

Bir parantez fazla fark ettim şimdi ancak henüz derlemedim.Sondaki parantezin biri olmayacak.Ancak halen ne olduğu çözülmüş değil?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

AsHeS

#635
Alıntı yapılan: yldzelektronik - 02 Ekim 2013, 16:42:10
   while((SSP1CON2 & 0x1F) | STAT_RW));


Satırı tam olarak ne anlam taşıyor? Biraz kafam karıştı. İlk parantez ile ikinci şart or lanıyor mu?İlk parantez veya ikinci yazan olduğu sürece anlamına mı geliyor?
Parantez hatasından ayrı olarak bu satırla iki sayı aralarında lojik OR işlemine tabii tutuluyor ve sonuç  sıfırdan farklı ise döngünün içerisine giriyor. Burada ki OR işlemi şunu ifade etmiyor SSP1CON2&0x1f işlemi veya STAT_RW sayısı 0 dan farklıysa dallan yerine bu sayıları aralarında OR işlemine tabi tutarak en sonunda karar veriyor. Misal
0b001
0b101  bitsel or işlemine tabii tutulursa sonuç 0b101 olacak ve while döngüsüne girilecektir.

yldzelektronik

#636
Teşekkürler.Peki orada SSP1CON2 bir struct ve ben şimdi derlediğimde hata alıyorum.Yapıya bu şekilde erişmem mümkün değil mi?

Yapı şöyle tanımlı;

struct {

      int1 BF;          //Bufferın doluluk durumu hakkında bilgi tutar.
//Veri Alma Modunda                               Veri Gönderme Modunda
//1==>Veri alımı tamamlandı ve SSPBUF dolu.           1==>Gönderme yapılıyor ve SSPBUF dolu.
//0==>Veri alımı tamamlanmadı ve SSPBUF boş.          0==>Gönderme tamamlanmadı ve SSPBUF boş.
      int1 UA;        //10bitlik I2C modunda adres güncelleme bitidir.
      int1 R_W;         //I2C modunda okuma/yazma yapıldığının bilgisini tutar.
// Master Modda                        Slave Modda
// 1==> Veri iletimi yapılıyor.        1==>Oku
// 0==> Veri iletimi durdu.            0==>Yaz
      int1 S;           //Start biti.
      int1 P;           //Stop biti.
      int1 D_A;         //Data veya Adres biti.
      int1 CKE;       //SmBus aktif etme biti.
      int1 SMP;       //Standart hız modu için çevrim hızı kontrolü pasif/aktif (1/0)
}SSP1STAT;
#byte SSP1STAT = 0x214     //0x214


Not : derleyici ccs c 5

mesaj birleştirme:: 02 Ekim 2013, 17:25:54

Soruyu şöyle düzelteyim.

Mcunun registerlerine direkt olarak erişmek istiyorum.Ccs kullandığımdan donanım destekli i2c fonksiyonu yazmak sıkıntı yaşatıyor.

Bu yüzden xc8 in mcu headerlerinde yaptığı gibi yapmak istedim.Gayet kullanışlı geldi.

Her register için yapı tanımlamış ve o yapı türünde bir değişken tanımlamış ve o değişkene direkt olarak registerin adresini vermiş.Bunu nasıl yapabilirim?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

kantirici

#637
@yldzelektronik madem reg. düzeyinde çalışmak istiyorsunuz bence ccs c ile vakit harcamadan direk xc8e yönelin. Bildigim kadarıyla ccs c de her portun, her reg. adresini tanımlayıp öyle kullanmak gerekiyor.

yldzelektronik

Alıntı yapılan: kantirici - 02 Ekim 2013, 18:21:26
@yldzelektronik madem reg. düzeyinde çalışmak istiyorsunuz bence ccs c ile vakit harcamadan direk xc8e yönelin.

Ben de istiyorum ama hazırda kütüphanelerim yok.Bir de orada kütüphane oluşturmak için vakit harcarsam işler iyice yavaşlar.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Klein

CCS bilmediğim için Standart C'deki TypeCasting örneği vereyim. Siz CCS' uyarlayın.

struct
{
....
}x;

 *((int *) x) = 1234;
veya
int *a;
   a = (int *)x;
  *a = 1234;

yldzelektronik

Sorunu şimdilik şöyle çözdüm;

while((*1234 & 0x1F) | SSP1STAT.R_W);

* koyduğumda ona adres muamelesi yaptı demek ki.Yanılıyor muyum?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mir_as82

 *((int *) x) = 1234
Bu kod icin konusalim:
(int*)x Demek, x olarak verilen degeri adres olarak donusum yapti.
Daha sonra,
*((int*)x) kodu ile o adresin icine 1234 degerini yazdi.
Yani İlk* casting icin.
İkincisi ise adresin icine veri yazmak icin

yldzelektronik

Alıntı yapılan: mir_as82 - 03 Ekim 2013, 07:17:21
*((int *) x) = 1234
Bu kod icin konusalim:
(int*)x Demek, x olarak verilen degeri adres olarak donusum yapti.
Daha sonra,
*((int*)x) kodu ile o adresin icine 1234 degerini yazdi.
Yani İlk* casting icin.
İkincisi ise adresin icine veri yazmak icin


Süper.

O halde ben dizi oluşturup o diziye yapının başlangıç adresini verip for döngüsü içinde yapının istediğim elemanına erişebilirim..Yanlız merak ettiğim bir şey var.Sizeof işleci yapılarda işe yarıyor mu?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Burak B

Şöyle bir örnek ekleyeyim.
    char x[4] = {1,2,3,4};
    unsigned long y;
    y= *((unsigned long *)&x[0]);


İşleminin sonucunda y de 04030201 yani 01020304 değeri atanır. Böylece bir dizi (bu bir struct olabilir) elemanlarına bir bütünmüş (unsigned long) gibi
işlem yapabiliriz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Gökhan BEKEN

Alıntı yapılan: yldzelektronik - 03 Ekim 2013, 09:15:10
Yanlız merak ettiğim bir şey var.Sizeof işleci yapılarda işe yarıyor mu?
while (*katar != '\0')
{
katar++;
katar_uzunluğu++;
}
printf("bu pointer %d karakterdir...",katar_uzunluğu);
Özel mesaj okumuyorum, lütfen göndermeyin.