C++ / CPPUnit

McAvatar

Admiral Special
Mitglied seit
11.08.2004
Beiträge
1.268
Renomée
8
Standort
Bielefeld, NRW
Hallo Leute,

ich wundere mich gerade über ein Problem, das gestern aufgetreten ist. Der folgende Kodeabschnitt ist Teil eines arithmetischen Kodierers.

Code:
while (input.peek() != EOF) {
      const unsigned char symbol = input.get();

      encodeSymbol(symbol, output);
      this->acModel.update(this->context, symbol);

      this->context = symbol;
      ++show_progress;
  }
...

void ArithmeticCoder::encodeSymbol(const uint16_t symbol, std::ostream & output) {
  this->symbolData = this->acModel.getSymbolData(this->context, symbol);
  updateLimits(symbol);

  while (true) {
...

Da die ersten beiden Zeilen in encodeSymbol() nicht unmittelbar mit der durch den Funktionsnamen implizierten Funktionalität zu tun haben, schien es mir sinnvoll, sie in die Hauptschleife zu verschieben, sprich:

Code:
while (input.peek() != EOF) {
      const unsigned char symbol = input.get();

      this->symbolData = this->acModel.getSymbolData(this->context, symbol);
      updateLimits(symbol);

      encodeSymbol(symbol, output);
      this->acModel.update(this->context, symbol);

      this->context = symbol;
      ++show_progress;
  }

Teil des Programms ist auch ein Unit Test, der ein paar Zufallszahlen generiert und die korrekte Kodierung und Dekodierung testet:

Code:
void TestArithmeticDecoder::testArithmeticCodeDecode(void) {
  std::stringstream randomChars;

  srand(time(NULL));
  for (uint32_t i = 0; i < 100000; ++i) {
    randomChars.put(rand() % 255);
  }

  std::ofstream outFile("ac_test");
  this->arithCoder.arithmeticEncode(randomChars, outFile);
  outFile.close();

  std::ifstream inFile("ac_test");
  std::stringstream decodedStream;
  this->arithDecoder.arithmeticDecode(inFile, decodedStream);
  inFile.close();

  CPPUNIT_ASSERT_EQUAL(randomChars.str().size(), decodedStream.str().size());
  CPPUNIT_ASSERT_EQUAL(0, randomChars.str().compare(decodedStream.str()));
}

Interessant an der Sache ist für mich, dass der Test in der ersten Variante durchläuft, in der zweiten mit Verschiebung der ersten beiden Anweisungen aus der encodeSymbol()-Funktion nicht mehr. Seltsamerweise funktioniert die Ausführung des zugehörigen Programms, dass im Prinzip ebenso wie der Test abläuft, ohne Probleme. Vergleicht man die ursprünglichen Dateien mit den kodierten und dekodierten mit diff oder cmp, treten keine Differenzen auf. Also wo liegt der Fehler?
 
Zurück
Oben Unten