WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 12.09.2003, 14:36   #1
thyrver
Veteran
 
Registriert seit: 30.11.2001
Alter: 44
Beiträge: 290


thyrver eine Nachricht über ICQ schicken thyrver eine Nachricht über AIM schicken
Standard Speicher und Funktionen in C

Hi.
Ein Funktionsaufruf:

funktion(argument1);

Wird argument1 im Speicher neu angelegt? Und falls ja, ist nicht dann ein Pointer auf argument1 weniger speicherverbrauchend (falls argument1 zum Beispiel eine Struktur wäre)?

Mir ist klar, dass funktion(&argument1) die Möglichkeit hat argument1 zu ändern, funktion(argument1) kann das hingegen nicht. Oder seh ich das falsch?

Danke für eure Mühe.

--
lg
fabsi
thyrver ist offline   Mit Zitat antworten
Alt 12.09.2003, 14:40   #2
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

Ja. du hast das absolut richtig verstanden.

mfg

c.
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 12.09.2003, 15:20   #3
thyrver
Veteran
 
Registriert seit: 30.11.2001
Alter: 44
Beiträge: 290


thyrver eine Nachricht über ICQ schicken thyrver eine Nachricht über AIM schicken
Standard

Danke.

Und was ist zu bevorzugen? Die Übergabe eines Pointers auf den Inhalt, oder des Inhalt selbst (bzw. eine Kopie des Inhalts)?

Oder von welchem Standpunkt aus ist was zu bevorzugen eurer Meinung nach? (Das ichs mir selbst aussuchen kann wie ichs mach ist mir klar, aber es hat sicher wer Erfahrungen mit der einen oder anderen Methode, und die interessieren mich.)

mit Dank im Voraus.
--
lg
fabsi
thyrver ist offline   Mit Zitat antworten
Alt 12.09.2003, 17:35   #4
Stona
Inventar
 
Registriert seit: 28.09.2001
Beiträge: 2.179


Standard

...das kommt draufan...

wenn du sichergehen willst/musst, dass eine funktion einen übergabewert nicht verändern darf (aus welchen gründen auch immer, hab täglich damit zu tun ), würd ich immer den "call-by-value" bevorzugen.

wenn das allerdings keine rolle spielt, sondern eher speichereffizienz, ist es besser, die referenz (&value) zu übergeben
Stona ist offline   Mit Zitat antworten
Alt 14.09.2003, 10:03   #5
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard

Zitat:
wenn du sichergehen willst/musst, dass eine funktion einen übergabewert nicht verändern darf [...], würd ich immer den "call-by-value" bevorzugen.
Code:
void foo (const void* value)
{
 // damn shit I cannot change the value...
}
so würd ich das machen, denn hier kann ich sichergehen dass der wert read only ist (und für den, der die funktion benutzt ist es auch übersichtlicher)


Zitat:
sondern eher speichereffizienz, ist es besser, die referenz (&value) zu übergeben
jein
bsp:

sizeof (short*) ist bei mir zb 4
sizeof (short) ist bei mir 2

sprich würd ich die referenz übergeben hätt ich dann meine originalvariable mit 2 + einen pointer mit 4 bytes -> 6 bytes.

call by value hätt ich 2 shorts -> 4 bytes
____________________________________
Whoever built humanity left in a major design flaw: it was the tendency to bend at the knees.
Who-T ist offline   Mit Zitat antworten
Alt 14.09.2003, 11:30   #6
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

1) Call by Address setzt das Präparieren der Struktur (=Versorgen der Datenfelder mit Werten) voraus. D.h. ein Call bei Address ist im Fall einer Struktur generell zu bevorzugen, da ich vorher eine definierte Versorgung der Datenfelder sicherstellen muss. Dies zwingt zu sorgfältiger Programmierung.

2) Ein weiterer Grund ist die Verwaltung der Informationen (Struktur) im Computerspeicher. Ein Array aus Strukturen oder eine verkettete Liste bzw. ein Baum aus Strukturen kann besser verwaltet werden als das Anlegen von einzelnen Strukturen. Die Übergabe erfolgt aus dem Array/der Liste/dem Baum oder aus einer Kopie UNTER VORHERIGER Versorgung der Strukturkopie und Übergabe eines Zeigers darauf.

Punkt 1 bezieht sich auf die Disziplin beim Programmieren
Punkt 2 auf die Praxis, Geschwindigkeit und Effizienz bei der Speicherorganisation

Es ist ein Muss eine Struktur vor der Übergabe mit korrekten Werten zu versorgen, insofern ist die zusätzliche Übergabe der Daten der Struktur über den Stack (Call by Value) ein Unsinn erster Ordnung.

mfg
Kikakater
kikakater ist offline   Mit Zitat antworten
Alt 14.09.2003, 11:33   #7
thyrver
Veteran
 
Registriert seit: 30.11.2001
Alter: 44
Beiträge: 290


thyrver eine Nachricht über ICQ schicken thyrver eine Nachricht über AIM schicken
Standard

ich habs nicht mit char oder int datentypen zu tun sondern mit Strukturen, die ihrerseits wieder strukturen, int arrays, einfachen int Datentypen enthalten. Wenn der Pointer auf meine Struktur seine 4 Byte hat kann ich damit leben, die Struktur hat sicher ein Vielfaches davon wenn ich sie selbst übergebe.

Die Methode den Übergabewert als Konstante zu übergeben gefällt mir. Danke für den Tip.

Warum interessiert mich das? Ich überleg mir bei einem Softwareprojekt den Funktionsaufrufen ein einheitliches Aussehen zu verpassen, und zerbreche mir den Kopf, was das Beste sein könnte.

Danke für eure Antworten @Stona & @Who-T.

Will noch wer seine Erfahrungen mitteilen?
thyrver ist offline   Mit Zitat antworten
Alt 14.09.2003, 11:44   #8
Stona
Inventar
 
Registriert seit: 28.09.2001
Beiträge: 2.179


Standard

noch ne infos zur übergabe von Arrays an andere Funktionen (wenn du's nicht weisst oder dich interessiert):


wenn du ein array als parameter übergibst wird - egal ob du schreibst

funktion (&array[0]);

oder

funktion (array);

immer ein pointer auf das erste element des arrays übergeben (auch im fall zwei), d.h. du kannst ein array nicht als kopie übergeben.

Pointer und Arrays in C sind ja sehr eng miteinader verwandt.

@Who-t

hast natürlich recht aber siehst, seine daten sind viel großer ale ne adresse (ich wusste das natürlich)
Stona ist offline   Mit Zitat antworten
Alt 14.09.2003, 12:06   #9
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Zitat:
Original geschrieben von Stona
...das kommt draufan...

wenn du sichergehen willst/musst, dass eine funktion einen übergabewert nicht verändern darf (aus welchen gründen auch immer, hab täglich damit zu tun ), würd ich immer den "call-by-value" bevorzugen.

wenn das allerdings keine rolle spielt, sondern eher speichereffizienz, ist es besser, die referenz (&value) zu übergeben
Call by Address ist nicht gleich Call by Reference.

Die Referenz ( function_name (data_type &reference) ) bedeutet eine Übergabe einer Adresse unter syntaktischer Verwendung einer Datenvariablenschreibweise innerhalb der Funktion ! Das ist der Unterschied zu Call by Address.

Call by Reference existiert nur in C++, nicht jedoch in C.

Der Aufruf mit einem Ampersand '&' unter C ist die Übergabe einer Adresse und nicht einer Referenz.
kikakater ist offline   Mit Zitat antworten
Alt 14.09.2003, 12:21   #10
thyrver
Veteran
 
Registriert seit: 30.11.2001
Alter: 44
Beiträge: 290


thyrver eine Nachricht über ICQ schicken thyrver eine Nachricht über AIM schicken
Standard

@kikakater
Wieso ist das ein Muß die Strukturen mit korrekten Werten zu Versorgen? Reicht das Anlegen eines Pointers auf eine Struktur (in main() ) und das anschliessende "anlegen" von Speicher und zuweisen von Werten in initStruktur(pStruktur) (als funktionsaufruf in main()) nicht aus?

@Stona
Ja, das wußte ich schon.

Ahja, es geht um reinen C Code, es kommt (ausser C++ Kommentaren ) nix C++ mässiges vor.


Meine Dankbarkeit weitet sich auch auf kikakater aus.
thyrver ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:25 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag