Nested Structure'lar Hakkında

Başlatan XX_CİHAN_XX, 21 Ağustos 2017, 11:03:25

XX_CİHAN_XX

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
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

JKramer

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.

mir_as82


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

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


Olarak deneyebilir misin?




XX_CİHAN_XX

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.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

quarko

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
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

foseydon

#5
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.

mir_as82

Hocam son tavsiye olarak volatile yi kaldırır mısın.

foseydon

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.