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
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.
(p_stTimer->PreviousTimer-)>NextTimer = p_stTimer->NextTimer;
veya
_structTimer(p_stTimer->PreviousTimer)->NextTimer = p_stTimer->NextTimer;
Olarak deneyebilir misin?
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.
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
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.
Hocam son tavsiye olarak volatile yi kaldırır mısın.
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.