turkuazaga

Üye
Katılım
23 Aralık 2018
Mesajlar
58
struct timespec yapısında ifade edilen mutlak zamanı belli bir süre kaydırmak için şöyle bir fonksiyon yazdım ama bazan doğru çalışıyor bazan yanlış.Bir saattir ben koda bakıyorum kod bana bakıyor ama hiç ilerleme yok prolem ne olabilir?

Kod:
void timespec_msoffset(struct timespec *ts, int msoffset)
{
      int64_t at=(uint64_t)ts->tv_sec*1000000000+ts->tv_nsec;
      at+=msoffset*1000000;
      ts->tv_sec=at/1000000000;
      ts->tv_nsec=at%1000000000;
}
 
Son düzenleme:
Programı aynı girdilerle tekrar tekrar çalıştırırsan her seferinde farklı sonuç mu alıyorsun? Yoksa fonksiyona bazı parametreler verilirse doğru bazılarında yanlış sonuç mu çıkıyor? Bunların ikisinin anlamı çok farklı.
 
Programda pthread_cond_timedwait kullaniyorum ve en fazla 10 saniye beklemesini istiyorum. Değişik timeout sürelerle deniyorum bazı değerlerde düzgün bazılarında fonksiyon hemen anında ETIMEDOUT döndürüyor.
 
Sanırım msoffset argümanı milisaniye olarak ne kadar zaman ekleneceğini ifade ediyor. Sana bir ipucu vereyim bakalım bulabilecek misin. -2000 ... +2000 aralığındaki değerler için her zaman doğru çalışıyor mu? -5000 .. +5000 aralığının dışındaki değerlerde de hep yanlış çalışıyor mu?
 
Overflow olabilir diyorsunuz herhalde.Onu gözönünde bulundurdum ve mutlak zamanı 64 bitlik (int64_1) bir değişkene atıyorum ve gereken zaman ilerletmesini veya geriletmesini elde ettikten sonra da tekrar timespec'e dönüştürüyorum.Overflow olmaması gerekir.
 
1 saniye ile denedim doğru çalıştı 30 saniye ile denedim hemen timeout yedi.O halde anlamadığım bir şekilde overflow oluyor ama nerede göremiyorum.
 
Öncelikle program kodu eklerken kodun yazıldığı dili CODE kutusunda belirt böylece o dile göre renklendirme yapsın ve daha kolay anlaşılsın kod. Bir de programda kullandığın ifadeler ve operatörler arasında da bir boşluk bırak. Böyle herşey bitişik olunca anlaması çok zor oluyor, çok yanıltır seni.

C:
void timespec_msoffset(struct timespec* ts, int msoffset)
{
   int64_t at = (uint64_t)ts->tv_sec * 1000000000 + ts->tv_nsec;
   at += msoffset * 1000000;
   ts->tv_sec = at / 1000000000;
   ts->tv_nsec = at % 1000000000;
}

Problem taşma meydana gelmesi. Tamam zamanı 64 bite dönüştürüyorsun, ama sonra 32 bitlik bir sayıyı (msoffset) 1000000 ile çarpıyorsun. Eğer msoffset 2148 veya daha büyük ise tam da burada bir taşma meydana gelir, sayı negatife düşer ve süreyi ileri alacağına geri almış olursun. Doğrusu orada msoffset değişkenini de önce 64 bite dönüştürmek:

C:
void timespec_msoffset(struct timespec* ts, int msoffset)
{
   /* once timespeci 64 bit integer yap */
   int64_t at = (uint64_t)ts->tv_sec * 1000000000 + ts->tv_nsec;

   /* msoffset kadar kaydir. Ama once msoffset degiskenini 64 bit yap !!! HATA BURADA */
   at += (int64_t)msoffset * 1000000;

   /* tekrar timespece donustur */
   ts->tv_sec = at / 1000000000;
   ts->tv_nsec = at % 1000000000;
}
 
Veya

C:
void timespec_msoffset(struct timespec* ts, int msoffset)
{
    int64_t at = ts->tv_sec * 1000000000LL + ts->tv_nsec;
    at += msoffset * 1000000LL;
    ts->tv_sec = at / 1000000000LL;
    ts->tv_nsec = at % 1000000000LL;
}
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,879
Mesajlar
100,183
Üyeler
2,488
Son üye
ilter

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top