Sollte man sowas prozedural oder OOP angehen?
-
Ich schreib mir gerade eine kleine Bibliothek, die es mir eigentlich erleichtern
soll, in einem nicht näher konkretisierten Speicherbereich willkürlich lange
Bit-Strings zu verschieben, zu kopieren, und zu manipulieren.
Leider nehmen die Prozeduren allmählich immer mehr Parameter, und die Kommentare
drüber, die erklären, in welcher Domain sie funktionieren, und wo nicht,
werden immer länger. Eigentlich ein untrügerisches Indiz, dass man womöglich
mit OOP-Arbeitsweise besser gefahren wäre.
Nur wie würde man z.B. solche Funktionen gescheit in ein OOP-Konzept verpacken,
weil leider sind ja Bit-Strings nicht unbedingt (addressierbare) 'Objekte':/* SINGLE-BYTE ALIGNED BIT ARRAYS */ /* The MSB of a Byte is supposed to have 'index 0' */ unsigned getBit1MSB(const unsigned char* start, unsigned offset); /* The MSB of a Byte is supposed to have 'index 0', the LSB 'index CHAR_BIT-1'. 'value' is either 0 or !=0, the corresponding Bit is set accordingly */ void setBit1MSB(unsigned char* start, unsigned offset, unsigned value); /* Copies a sequence of (arbitrary) 'nmb' consecutive Bits, which start at {srcByte,srcOffs}, to a destination at {destByte, destOffs}. The MSB of consecutive Bytes (in case the Bit Sequences overlap several bytes) is treated as having the lowest index */ void copyBitSeq1MSB(unsigned char* destByte, unsigned destOffs, const unsigned char* srcByte, unsigned srcOffs, unsigned nmb); /* Flushes a sequence of 'nmb' Bits with 'value' (0 or 1), starting from 'offset'. The MSB of consecutive Bytes is treated as having the lowest index. */ void flushBitsMSB(unsigned char* buffStart, unsigned offset, unsigned nmb, unsigned value); /* ... etc */
Leider können die Bit-Sequenzen ziemlich 'krumm' im Speicher liegen, also
auch keine-2-er Potenz lang sein.
Trotzdem sollen die Bit-Sequenzen verschoben, und mittelfristig auch wie
herkömmtliche Array-Elemente mit 'echten' Adressen 'indiziert' werden können.
Also noch ist nicht Hopfen und Malz verloren, wenn mir jemand überschlags-
mäßig eine OOP-Herangehensweise skizzieren könnte.
Oder - ab welcher Anzahl
an Parametern pro Prozedur würdet ihr es bedenklich finden und nach
OOP-Alternativen suchen? Sind 5 Parameter schon zu viel, oder geht's grade
noch, um prozedural zu bleiben?
-
Also fangen wir mal an: Was soll diese Funktion machen? Was sind Eingabeparameter und wie ist vor allem
offset
zu interpretieren?/* The MSB of a Byte is supposed to have 'index 0' */ unsigned getBit1MSB(const unsigned char* start, unsigned offset);
-
knivil schrieb:
Also fangen wir mal an: Was soll diese Funktion machen? Was sind Eingabeparameter und wie ist vor allem
offset
zu interpretieren?/* The MSB of a Byte is supposed to have 'index 0' */ unsigned getBit1MSB(const unsigned char* start, unsigned offset);
'start' zeigt auf das erste Byte des chaotischen Speichers, und das MSB dieses
Bytes hat Index(0). Und mit 'offset==259' wäre dann z.B. das 259. Bit ab diesem
MSB des 1.Bytes gemeint, immer mit der Annahme, dass bei aufeinanderfolgenden
Bytes stets das MSB den niedrigsten 'index' (0 ... CHAR_BIT-1) 'innerhalb'
des Bytes hat.In diesem Stil:
1.Byte: [MSB_idx==0] ...[LSB_idx == CHAR_BIT-1]
2.Byte: [MSB_idx==CHAR_BIT] ... [LSB_idx == 2*CHARBIT-1]Die copy Funktion wäre dazu gedacht, z.B. 5 'aufeinander folgende' Bits, die
nach diesem Muster in irgendeinem Speicherbereich vorkommen, an
irgendeine andere Stelle im Speicher zu kopieren.
Womöglich gibt's für derartige Funktionalität aber auch schon Bibs? Wäre
natürlich am besten, wenn jemand so eine Bib schon wo gesehen hat! Bevor ich
ein Rad neu erfinde, wäre das natürlich am aller besten!
-
D.h. Adresse + Offset gehoeren immer zusammen. Wenn man sich als Beispiel die IPP anschaut, dann gehoeren Adresse + Stride immer zusammen. Auch dort wird nicht zu 'OOP' gegriffen (was auch immer das fuer dich im Kontext von C heissen mag). Ich sehe erstmal kein Problem.
-
Packe alle sinnvoll fachlich zusammengehörenden Variablen in eine Struktur, definiere eine Variable (bzw. ein Array) dafür und übergebe diese an jeweils eine Funktion als Parameter mit Namen this,self o.ä., idealerweise schon mit passendem const versehen.