Frågan 28 feb. 2008 03:19 #1 Hej, jag använder mig av nedanstående loop för att konvertera 16 bit big endian till little endian.
Jag är fortfarande ny med C och jag undrar om det går det att förbättra denna loop?
  while (0 < (readBytes = fread(rwBuf, 1, sizeof(rwBuf), srcFile))) {
    // swap 16bit data
    unsigned char c2;
    for (int i = 0, n = readBytes; i < n;) {
      c2 = rwBuf[i + 1];
      rwBuf[i + 1] = rwBuf[i];
      rwBuf[i] = c2;
      i += 2;
    }
    if (1 != fwrite(rwBuf, readBytes, 1, fp)) {
      printf("failed to fwrite().\n");
      return -1;
    }
    writeBytes += readBytes;
  }
spango Medlem sedan juni 2000 8 205 inlägg Ser väl rätt funkis ut, bortsett från att din loopvariabel, n, är onödig (du kan ju lika gärna använda readBytes). Sen skulle jag kanske om jag var du flytta in inkrementeringen av i upp till for-huvudet:
  while (0 < (readBytes = fread(rwBuf, 1, sizeof(rwBuf), srcFile))) {
    // swap 16bit data
    unsigned char c2;
    for (int i = 0; i < readBytes; i += 2) {
      c2 = rwBuf[i + 1];
      rwBuf[i + 1] = rwBuf[i];
      rwBuf[i] = c2;
    }
    if (1 != fwrite(rwBuf, readBytes, 1, fp)) {
      printf("failed to fwrite().\n");
      return -1;
    }
    writeBytes += readBytes;
  }
spango, Tack!
Jag visade en kompis detta med och han säger att det går att lösa mer effektivt genom att inte använda ett index eftersom man måste beräkna offset'et varje gång.
Men eftersom jag fortfarande lär mig C så ger han mig inte svaret på en gång :( ... ;) jag lyckas dock inte klura ut det. Nån som har ett förslag?
spango Medlem sedan juni 2000 8 205 inlägg Tja, du kan ju använda pekararitmetik... *hint*
Kom ihåg att ett uttryck som arr[n] är detsamma som *(arr + n) . Alltså blir uttrycket (arr + n) en direkt pekare till element n i din array.
Phorpher Medlem sedan feb. 2000 2 300 inlägg En annan variant är att kolla på bitoperationer som är väldigt effektiva.
P PeW Medlem sedan juni 2000 10 432 inlägg