Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: XX_CİHAN_XX - 21 Ağustos 2017, 11:03:25

Başlık: Nested Structure'lar Hakkında
Gönderen: XX_CİHAN_XX - 21 Ağustos 2017, 11:03:25
Header File'da aşağıdaki gibi bir struct tanımlansın
typedef struct _structTimer{
volatile struct _structTimer *NextTimer;
volatile struct _structTimer *PreviousTimer;
        .
        .
        .
}structTimer;


Source File'da aşağıdaki gibi bir fonksiyon olsun.
void apiTimer_RemoveTimer(volatile structTimer *p_stTimer)
{
p_stTimer->PreviousTimer->NextTimer = p_stTimer->NextTimer;
if (p_stTimer->NextTimer != NULL) {
p_stTimer->NextTimer->PreviousTimer = p_stTimer->PreviousTimer;
                .
                .
                .
}


Ben bu mantığı tam anlayamadım. Struct içinde kendi struct'ını pointer olarak neden tanımlamış olabilir? Struct içindeki volatile ile başlayan yapıyı Struct'in içinde değil de dışında tanımlaması daha mantıklı olmaz mıydı?

Ek olarak derlediğimde derleyici source koddaki

p_stTimer->PreviousTimer->NextTimer = p_stTimer->NextTimer;
ve
p_stTimer->NextTimer->PreviousTimer = p_stTimer->PreviousTimer;

satırları hakkında  aşağıdaki warningi veriyor.
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: JKramer - 21 Ağustos 2017, 11:30:13
Alıntı yapılan: XX_CİHAN_XX - 21 Ağustos 2017, 11:03:25
Ben bu mantığı tam anlayamadım. Struct içinde kendi struct'ını pointer olarak neden tanımlamış olabilir?
https://www.learn-c.org/en/Linked_lists gibi.
Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: mir_as82 - 21 Ağustos 2017, 12:02:08

(p_stTimer->PreviousTimer-)>NextTimer = p_stTimer->NextTimer;
veya

_structTimer(p_stTimer->PreviousTimer)->NextTimer = p_stTimer->NextTimer;


Olarak deneyebilir misin?



Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: XX_CİHAN_XX - 21 Ağustos 2017, 14:56:26
Listed Linker mantığını anladım. Artık her şey daha mantıklı geliyor :)
@mir_as82, dediğiniz şekilde warning'te bir düzelme olmuyor. Bu warning çalışmayı etkilemiyor gibi ama yinede insanı rahatsız ediyor. Tip dönüşümü yapmaya çalıştım ama yemedi.
Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: quarko - 21 Ağustos 2017, 15:05:53
Alıntı yapılan: XX_CİHAN_XX - 21 Ağustos 2017, 14:56:26
Listed Linker mantığını anladım. Artık her şey daha mantıklı geliyor :)
@mir_as82, dediğiniz şekilde warning'te bir düzelme olmuyor. Bu warning çalışmayı etkilemiyor gibi ama yinede insanı rahatsız ediyor. Tip dönüşümü yapmaya çalıştım ama yemedi.

IAR da şu şekilde warning leri bastırabilirsiniz.  :)

#pragma diag_suppress = Pa082
        //;
        //;
// derleyicinin uyarı vermesine neden olan kodlarınız...
        //;
        //;
#pragma diag_default = Pa082
Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: foseydon - 21 Ağustos 2017, 15:43:40
Kendine pointer'i olan struct linked list yapısının temel elemanıdır. Linked list mantığına bakarsan olayı anlarsın. Burada bir çeşit circular linked list yapmış gibi. Kodun tamamını görebilmek neden böyle birşey yaptığını da anlayabiliriz.
Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: mir_as82 - 21 Ağustos 2017, 17:46:45
Hocam son tavsiye olarak volatile yi kaldırır mısın.
Başlık: Ynt: Nested Structure'lar Hakkında
Gönderen: foseydon - 21 Ağustos 2017, 18:42:22
Alıntı yapılan: mir_as82 - 21 Ağustos 2017, 17:46:45
Hocam son tavsiye olarak volatile yi kaldırır mısın.

hocam orda volatile anahtar kelimesinin kullanılmasının bir sebebi var. Volatile kullanarak kodu yazan kişi bu elemanlar üzerinde yapılan işlemlerin takip eden sırada yapılmasını garanti altına alıyor. Kaldırırsanız,  işi derleyicinin insafına bırakmış oluyorsunuz.