Reihenfolge Funktionsparameter

OP #5948738
Guten Morgen,

wenn ihr eine Funktion programmiert - welche Reihenfolge der 
Funktionsparameter wäre für euch am logischsten?
1
uint_fast8_t ee24Cx_update_block(uint8_t *buffer, uint16_t addr, size_t size);
2
uint_fast8_t ee24Cx_update_block(uint16_t addr, uint8_t *buffer, size_t size);
3
uint_fast8_t ee24Cx_update_block(size_t size, uint8_t *buffer, uint16_t addr);
4
uint_fast8_t ee24Cx_update_block(uint16_t addr, size_t size, uint8_t *buffer);
oder gar eine der beiden nicht aufgeführten Varianten?

Wie sieht es bei Funktionen aus, die nur Eingänge haben?
1
update_display(const FixedData_t *const FixedData, VariableData_t *const VariableData, bool flag);
2
update_display(VariableData_t *const VariableData, const FixedData_t *const FixedData, bool flag);
oder noch eine andere Variante?
Moderator (Firma: Titel) Persönliche Seite
Bei der memset() Funktion ist der Pointer auf den Speicher ja das 
Wichtigste. So ein schnöder "Buffer" ist aber ggfs völlig uninteressant 
und wird von allen möglichen Funktionen verwendet.

Ich schreibe nach links das, was die Funktion eigentlich "interessant" 
macht und sich laufend ändert. Und dann in Richtung rechts als nächstes 
das, was konstant ist und dann das, was man "halt zum Funktionieren 
braucht". So wie die memset() das auch macht: woihn? was? wieviel?

Und bezogen auf die ursprüngliche Frage lautet deshalb die Antwort 
"alles möglich, kommt drauf an".
Gast
Was zusammen gehört wird direkt hintereinander übergeben:

Eigentliche Daten vor Metadaten, vor Steuerdaten. D.h. zum Beispiel 
Pointer vor der Speichergrösse auf die der Pointer zeigt. Metadaten in 
der Reihenfolge ihrer gefühlten Wichtigkeit. Steuerdaten, Flags, die das 
Verhalten der Funktion steuern zuletzt.

Bei C++ müssen die Parameter mit Default-Werten sowieso ans Ende, da 
kann man nicht immer die typische Reihenfolge einhalten.

Unterschiedliche Meinungen gibt es über die Reihenfolge von übergebenen 
Daten und zurückgegebenen Daten.

Entweder:

Zurück vor übergeben: f(int *out1, double *out2, int in1, bool in2); 
weil das der Reihenfolge bei einem Funktionsaufruf ähnelt out = f(in); 
und weil es besser zu C++ Default-Argumenten passt.

Oder:

Übergeben vor zurück f(int in1, bool in2, int *out1, double *out2); weil 
es angeblich flüssiger zu lesen ist.
Gast
Ich schreibe gerne das Ziel vor der Quelle.
Buffergrössen schreibe ich gerne vor den Buffer, so:
1
int do_something(
2
  size_t dst_size, char dst[dst_size],
3
  size_t src_size, char src[src_size]
4
);

Obwohl, ich halte mich auch nicht immer daran, und es ist eher weil 
"char a[b], size_t b" halt nicht funktioniert, und mir die T x[N] 
schreibweise besser gefällt als die T* x schreibweise.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.