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.


Anmelden zum Antworten