Hallo Leute!
Auch wenn es das R-Basic-Forum ist, wollte ich mal einige Fragen zu einem C-Code stellen, den ich noch nicht ganz verstehe, aber im Idealfalle in R-Basic-Code wandeln möchte.
Also es geht um diese schöne Funktion:
Code
static void _decompress(uint16_t *dst, size_t dst_len, int stride, const uint8_t *src, size_t src_len)
{
uint8_t nrn = 0; //Frage 1
int i = 0;
int dp = 0;
while(i < dst_len){
uint16_t base; //Frage 2
uint8_t count;
uint8_t rd;
if((rd = src[dp] & 0x0F) == 0 || nrn > 0){ //Frage 3
if(nrn){
--nrn;
}else{
nrn = (src[dp++] >> 4) - 1; //Frage 4
}
base = get16(src + dp);
dp += 2;
count = base & 0x8000 ? 1 : src[dp++];
base &= 0x7FFF;
}else{
nrn = src[dp++] >> 4;
count = rd & 0x08 ? 1 : src[dp++];
base = dst[i - stride - 4 + (rd & 0x07)];
}
for(;count>0;--count,++i) //Frage 5
dst[i] = base;
}
}
Display More
Das wären meine Fragen dazu:
- Frage 1: Das ist wohl die kleinste Frage, aber interessiert mich der Vollständigkeit halber doch. Welcher Grund ist vorstellbar, daß die Variable nrn als uint angelegt wird und i und dp als int? Auch i und dp starten ja bei null und werden im Code nur erhöht (können also nicht negativ werden). Einfach nur Zufall oder ist int schneller oder ...?
- Frage 2: Werden die drei Variablen base, count und rd bei jedem Schleifendurchlauf neu angelegt (und mit null initialisiert)?
- Frage 3: Hier stehen in einer if-Abfrage Zuweisung und Vergleich. Das hatte ich noch nicht. Bedeutet die linke Seite, daß erst rd berechnet und dann rd auf null verglichen wird? Könnte man das dann quasi auch so schreiben?
- Frage 4: Diese Zeile verstehe ich so, daß ein weiteres Byte eingelesen und um vier Bit nach rechts verschoben wird, es wird also nur die obere Hälfte des Bytes verwendet. Aber welches Byte wird eingelesen?
- Das gerade aktuelle Byte, von dem oben in der if-Schleife die untere Hälfte ausgewertet wurde, wird verwendet. Danach wird der Zähler dp erhöht.
- Zuerst wird der Zähler dp erhöht und dann wird das Folge-Byte eingelesen und von dem linke Hälfte verwendet. Oder müßte dafür ++dp im Code stehen?
- Frage 5: Bei der for-Schleife war ich kurz verwirrt, weil vor dem ersten Semikolon etwas fehlt. Aber da wurde wohl nur die Variablendeklaration weggelassen, weil ja count schon definiert ist?
Hat es hier eine Bedeutung, ob da ++i oder i++ steht? Die Variable i startet ja mit null und wird nur hier in der for-Schleife erhöht. Man könnte ja denken, daß wegen ++i die Variable i erst erhöht und dann in der for-Schleife verwendet wird. Aber dann würde ja nie etwas bei i=0 geschrieben werden.
Vielen Dank für alle Antworten !