Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 2b
“Alle lieben SoS 2”… Ähm… Genau. Ja.
Sei’s drum, weil ich SoS so sehr liebe und weil mein Programm wegen der überragenden Dokumentation schon seit Monaten perfekt funktioniert, brauche ich diese Funktion nicht mehr und würde sie daher billig abgeben:
#include <iostream>
#include <iomanip>
void dumpPage(PageChunk &page) {
std::cerr << "Page size: " << std::dec << page.getChunkSize() << std::endl;
char* c = page.getChunk();
for (int i = 0; i < (int)page.getChunkSize(); i++) {
if (i % 8 == 0) {
std::cerr << std::endl;
std::cerr << std::dec << std::setfill('0') << std::setw(4) << i << " ";
}
if ((c[i] >= ' ') && (c[i] <= 'z')) {
std::cerr << c[i] << " ";
} else {
std::cerr << std::hex << std::setfill('0') << std::setw(2) << (int)c[i] << " ";
}
}
std::cerr << std::endl;
}
Besser:
void dumpPage(PageChunk &page) {
std::cerr << "Page size: " << page.getChunkSize() << std::endl;
unsigned char* c = (unsigned char*)page.getChunk();
for (int i = 0; i < (int)page.getChunkSize(); i++) {
if (i % 20 == 0) {
std::cerr << std::endl;
std::cerr << std::setfill('0') << std::setw(4) << i << " ";
}
if ((c[i] >= ' ') && (c[i] <= 'z')) {
std::cerr << c[i] << " ";
} else {
std::cerr << std::hex << std::setfill('0') << std::setw(2) << (unsigned int)c[i] << std::dec << " ";
}
}
std::cerr << std::endl;
}
Hier eine etwas ausführlichere Alternative:
using namespace std;
using namespace systembuffer;
void PrintPage(ostream& s, const UniquePageID& uid)
{
int offset;
char *data;
unsigned int length;
SystemBuffer *sysBuf = SystemBufferLifeCycle::getInstance()->getBuffer();
PageChunk pageChunk = sysBuf->fix(uid);
TIDHeader tidHeader(&pageChunk);
TIDIndex tidIndex(&pageChunk);
int maxIndex = tidHeader.getMaxIndex();
char *pageData = pageChunk.getChunk();
s << "- PAGE " << uid.getPageNo() << " -" << endl;
s << "Header: " << '(' << tidHeader.getOffset() << ", " << maxIndex << ')'
<< endl;
s << "Entries: " << endl;
for (int i = 1; i < maxIndex; i++) {
offset = tidIndex.getOffset(i);
data = pageData + offset;
length = *((unsigned int *) data);
s << i << ": [" << (tidIndex.isDeleted(i) ? 'D' : ' ')
<< (tidIndex.isChained(i) ? 'C' : ' ')
<< (tidIndex.isTail(i) ? 'T' : ' ') << "] | "
<< offset << " | " << length << endl;
s << " ";
if (tidIndex.isChained(i)) {
s << "-> ";
TID(data + sizeof(unsigned int)).put(s);
} else {
s << '"' << string(data + sizeof(unsigned int), length) << '"';
}
s << endl;
}
s << endl;
sysBuf->unfix(uid);
}
MaxIndex
…
for (int i = 1; i < maxIndex; i++) {
…
waere vielleicht besser
…
for (int i = 1; i <= maxIndex; i++) {
…
dann wuerde er den maxIndex mit ausgeben… da sollten aber wohl eh nur 0-en stehen… zumindest aber kein sinnvoller index,denk ich
Laut Dokumentation soll der MaxIndex der nächstgrößere Index nach dem letzten Eintrag der Seite sein.
Wenn du es konsequent durchziehst, geht es aber auch problemlos so, wie du es meinst. Dann stimmt auch das [m]<=[/m].
Doku versus Aufgabestellung
ich habe gerade newsgroup nochmal entsprechendes Thema gelesen.Niko hat gemeint, dass es gehen wuerde ,wenn man auch nach Aufgabestellung(Maxindex ist der letzte Eintrag ) programiere.Naturlich wenn man nach Doku programmiert orginal PagePrint ist sinnvoller:)
Ich bin nicht sicher ob es nach Aufgabestellung programieren nachteil in stresstest bringen wuerde.
Wie gesagt: Da der MaxIndex nur intern verwendet wird, kommt nach außen genau das gleiche raus, solange du es konsequent durchziehst. Nur wenn du an einer Stelle nach Doku gehst und an anderer Stelle nach Aufgabenstellung, wird es Probleme geben.
Noch ein paar nette Hilfsfunktionen und Testskripte gibt’s hier: http://tyra.ra-doersch.de/svn/airhardt/sos2/aufgabe2
Es lohnt sich, ab und zu vorbeizuschauen, ob eine neue Revision online ist.
Danke für den Tipp