Forum: PC-Programmierung Sieht das auf den ersten Blick sinnvoll aus?


von Noch immer derselbe (Gast)


Lesenswert?

Hier macht wohl kaum jemand etwas mit der Boost Library, aber C++ können 
ja einige noch.

Ich hatte mich ja ende letzten Jahres bemüht das Fixup Interface für den 
Boost Heap zu verstehen:

http://www.boost.org/doc/libs/1_54_0/doc/html/heap/concepts.html#heap.concepts.mutability

Da schreiben sie ja
1
handle_t t3 = pq.push(3);
2
    handle_t t5 = pq.push(5);
3
    handle_t t1 = pq.push(1);
4
5
    *t3 = 4;
6
    pq.update(t3);

Bei mir war daraus geworden
http://www.ssalewski.de/tmp/rboost_fibonacci_queue.cpp
1
void fq_update(VALUE q, VALUE hd, VALUE key)
2
{
3
  XPQ *pq;
4
  heap_data* h;
5
  Data_Get_Struct(q, XPQ, pq);
6
  Data_Get_Struct(hd, heap_data, h);
7
  if (h->parent_queue == q)
8
  {
9
    (*h->handle).payload = h->payload = convert_key(key) * pq->key_sign;
10
    pq->update(h->handle);
11
  }
12
  else
13
    rb_raise(rb_eRuntimeError, "Fibonacci_Queue.update(): node is inserted in a different queue!");
14
}

Schien ja anfangs auch gut zu funktionieren, aber seit ein paar Tagen 
habe ich doch etwas Zweifel
1
(*h->handle).payload =

Oder hätte man einfach schreiben sollen
1
*h->handle =

ich weiss nicht mehr wie ich darauf gekommen war. Mit Google findet man 
dazu auch kaum etwas. Ruby, BOOST, C++ ist schon eine etwas exostische 
Mischung.

Ich kann ja auch nicht ganz ausschließen, dass die Boost Heap 
Update-Funktionen tatsächlich fehlerhaft sind, viele Leute haben die 
wohl nicht getestet. Von 2006 fand ich einen Fehlerbericht zum 
Fibonacci-Heap, aber mit dem Binomial Heap bekomme ich auch in seltenen 
Fällen unkonsistente Ergebnisse.

Jedenfalls ist diese  fq_update-Funktion diejenige, der ich am wenigsten 
traue, das übrige hatte ich, soweit ich mich erinnere, einigermaßen 
verstanden.

Gestern habe ich durch Zufall mit Google gefunden, dass es auch eine 
Erase-Funktionen zum Löschen vom beliebigen Elementen gibt, das wird in 
der Boost Dokumentation sonst nie erwähnt. Na, wenigstens ein Nutzen von 
den vielen verschwendeten Stunden.

Links:
Beitrag "C++ Verständnis (Boost-Library)"
Beitrag "Linux, Ruby C++ Extension,, Valgrind usw."

von Jetzt aber Schluß! (Gast)


Lesenswert?

Ja, scheint wohl doch alles richtig zu sein so wie es jetzt ist.

Ich habe die Funktionen nochmals separat getestet -- keine Fehler, und 
Valgrind meckert auch nicht mehr.

Verunsichert war ich, da ich in "Dijkstra shortest path search" einige 
'Asserts' eingebaut hatte -- einer von diesen ist aber nicht wirklich 
immer erfüllt. Die sporadische Meldung "can't modify frozen string" 
beunruhig mich zwar weiterhin etwas, aber das mag andere Gründe haben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.