Grundsätzliche Frage zu Funktionen
-
Hallo.. Ich komme gerade sozusagen aus der Javawelt und überlege wie ich mich in den Stil von einer typischen C Funktion reindenken kann.
In Java zählt Kapselung sehr viel und man gibt praktisch alles nötige an die Funktion ab.
Folgendes Problem ich habe ein 1dim Array und ein 2dim Array. Wenn ich diese beiden in einer Funktion benutzen wollen würde müsste 2 Zeiger und Angaben für die Länge mitgeben. Alternativ könnt ich globale Variablen definieren.Gibt es einen verbreiteten Designstandard zum Umgang mit Arrays in Funktionen ?
chil14r
-
Also wenn ich ANSI-C programmieren würde, würde ich das genauso machen wie du das sagst. Pointer und Size übergeben. Bei mehrdimensionalen Arrays dann entsprechend auch mehr Size-Angaben.
Als ich noch ANSI-C programmiert habe, habe ich auch immer versucht auf globale Variablen zu verzichten, wenn es irgendwie möglich war.
-
chil14r schrieb:
Hallo.. Ich komme gerade sozusagen aus der Javawelt und überlege wie ich mich in den Stil von einer typischen C Funktion reindenken kann.
In Java zählt Kapselung sehr viel und man gibt praktisch alles nötige an die Funktion ab.
Folgendes Problem ich habe ein 1dim Array und ein 2dim Array. Wenn ich diese beiden in einer Funktion benutzen wollen würde müsste 2 Zeiger und Angaben für die Länge mitgeben. Alternativ könnt ich globale Variablen definieren.Gibt es einen verbreiteten Designstandard zum Umgang mit Arrays in Funktionen ?
chil14r
Du kannst auch ein Array (keinen Zeiger) übergeben...
-
Xantus schrieb:
Du kannst auch ein Array (keinen Zeiger) übergeben...
Ist doch rein mechanistisch betrachtet dasselbe in Grün, nur mit anderer Schreibweise und Einschränkungen in der Dimensionierung.
Flexibler ist die Pointer/Size- Lösung und wenn man sich mal an ein Schema gewöhnt hat, zumindest für einen selbst lesbarer.
-
chil14r schrieb:
Folgendes Problem ich habe ein 1dim Array und ein 2dim Array. Wenn ich diese beiden in einer Funktion benutzen wollen würde müsste 2 Zeiger und Angaben für die Länge mitgeben.
ja, die länge muss mit. in C gibt es kein "hello".length() wie in Java.
chil14r schrieb:
Alternativ könnt ich globale Variablen definieren.
kannste auch, aber mach sie 'static', dann hast du noch eine gewisse kapselung. die variable ist dann nur in dem .c file sichtbar, in dem sie angelegt wurde.
-
fricky schrieb:
chil14r schrieb:
Alternativ könnt ich globale Variablen definieren.
kannste auch, aber mach sie 'static', dann hast du noch eine gewisse kapselung. die variable ist dann nur in dem .c file sichtbar, in dem sie angelegt wurde.
Ja, aber dann ist sie ja auch nicht global (= im gesamten Programm definiert und adressierbar) im Sinne der Definition. :p
statics haben zudem negative Seiteneffekte auf die Reentranz, es bleibt wie immer eigentlich zweckabhängig, was man einsetzt.Als Faustformel kann man sich merken:
Je mehr man über Stack und Heap arbeitet und darüber Kapselung betreibt, desto wiederverwertbarer wird die Source, aber die Runtime wird zumeist müder.Kommt wie schon gesagt auf die Anwendung an - Universalempfehlungen gibt es da nicht.
-
pointercrash() schrieb:
Als Faustformel kann man sich merken:
Je mehr man über Stack und Heap arbeitet und darüber Kapselung betreibt, desto wiederverwertbarer wird die Source, aber die Runtime wird zumeist müder.ich glaub da gibts keine faustformeln. ein code, der ausgiebig heap und stack benutzt, ist auf systemen ohne heap oder mit geringer stackgrösse auch nicht zu gebrauchen. aber in dem punkt stimme ich dir zu: es ist immer zweckabhängig.
-
fricky schrieb:
ich glaub da gibts keine faustformeln. ein code, der ausgiebig heap und stack benutzt, ist auf systemen ohne heap oder mit geringer stackgrösse auch nicht zu gebrauchen. aber in dem punkt stimme ich dir zu: es ist immer zweckabhängig.
Bitte genauer lesen - es bezog sich auf die Wiederverwertbarkeit von Source. Daß Heap und große Stacks auf Controllern mit 128 Byte RAM wenig Sinn machen, versteht sich von selbst - der originäre PIC- Reiskocher kam mit 64 Byte RAM aus.
-
pointercrash() schrieb:
es bezog sich auf die Wiederverwertbarkeit von Source.
das meinte ich ja auch. ein code der ausgiebig heap und stack benutzt, ist nur bedingt wiederverwertbar. besser wiederverwendbar sind z.b.:
- codes, die nur statische/globale variablen benutzen (trotz aller nachteile dieses speichertyps).
- codes, bei denen der benutzer eine 'init'-funktion aufrufen muss, die einen pointer auf den speicher bekommt, den der code dann nutzen darf.
- codes, die man über ein headerfile configurieren kann, wo, wie, welche art von speicher sie intern benutzen.
-
Danke für die zahlreichen Antworten und die kleine Einführung in Stack und Heapausnutzung