2016-07-29 35 views
-1

C-Programmierer, der hier versucht, Python zu umgehen. Ich finde mich wiederholt brechen die DNY-Regel, und ich möchte wissen, ob es eine Möglichkeit gibt, einen unbekannten Typ in eine Funktion zu übergeben und darauf zu reagieren und seinen Typ dynamisch ändern. Derzeit habe ich:Verwenden mehrerer Casting-Typen in einer einzigen Funktion (c Überladungs-Workarounds)

static void ArrayFunction(void *one, void *two, uint8_t size) 
{ 
    // Get the array lengths. 
    if (size == sizeof(uint8_t)) 
    { 
     uint8_t *One = one; 
     uint8_t *Two = two; 
    } 
    if (size == sizeof(uint16_t)) 
    { 
     uint16_t *One = one; 
     uint16_t *Two = two; 
    } 
    if (size == sizeof(uint32_t)) 
    { 
     uint32_t *One = one; 
     uint32_t *Two = two; 
    } 

    for (i = 0; i < MAX_BUSES; i++) 
    { 
     // Do something with the arrays. 
     One[i] = Two[i]; 

     // Lots more code here. Maybe hundreds of lines. 
    } 
} 

Wie Sie wissen, kompiliert dieser Code nicht, da die beiden definierten Variablen sofort aus dem Anwendungsbereich fallen. Ich möchte ein Array von 8, 16, 32 usw. Länge übergeben und etwas damit tun, egal was. Ich weiß, dass ich den void-Zeiger nicht einfach verwenden kann, weil die Array-Länge unterschiedlich ist, wenn verschiedene Integer-Typen verwendet werden. Wenn ich die for-Schleife in jede der if-Anweisungen kopiere, habe ich drei Kopien des exakt gleichen Codes. Ist das in C zu kompliziert, oder gibt es einen Workaround, der die Anzahl der Male reduziert, die ich kopieren und einfügen muss? Vielen Dank!

+3

Könnten Sie bitte die Essenz dessen formulieren, was Sie in einer Frage wissen möchten? –

+0

Sorry, habe es nur mit einem allgemeineren Beispiel überarbeitet. Es ist schon eine Weile her, dass ich hier eine Frage von mir selbst stellen musste. – MPStoering

Antwort

0

Für den Fall, dass Sie jetzt präsentieren, würde eine einfache memcpy mit der entsprechenden Größe für das gesamte Array tun.

Wenn Sie wirklich kompliziertere Dinge ohne Code-Wiederholung machen möchten, könnten Sie Ihren Code mit einem Makro kapseln und einfach die Aufrufe innerhalb der if s wiederholen.

Sie können nicht viel mehr tun, C wird nicht dynamisch typisiert.

BTW, in C anstelle von mehreren if s würden Sie normalerweise eine switch verwenden.

+0

Danke, ich hatte das Gefühl, dass das nicht möglich war, aber ich wollte es nur fragen. Ich wusste von Makros, aber ich denke nicht, dass es die Lesbarkeit des Codes verbessern würde, um es wert zu sein. – MPStoering