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 21.06.2004, 20:50   #11
Biri
Hero
 
Registriert seit: 04.09.2001
Beiträge: 894


Standard

hi !

die von dir erwähnten sachen sind keine eigenarten von C gegenüber C++. Im Gegensatz zu C hat C++ Klassen, die gewisse Funktionalität kapseln - z.B. eine Stringklasse mit überladenem "+" und "=" Operator - deshalb ist da eine einfache Zuweisung von strings möglich. Intern führt die Klasse dann eine Speicheralokierung durch. (beim destruktor der klasse wird der spiecher wieder freigegeben).

die Zuweisung zum char* funktioniert natürlich - du brachst dazu keine "strcpy"-Funktion. Es wird allerdings nicht der string zugewiesen (d.h. kopiert), sondern die Speicheradresse, an der die Zeichenkette gespeichert ist. Dieser Speicher ist in deinem Fall am Stack, da er lokal angelegt wird, da in einer Funktion vereinbart. Nach der verlassen der Funktion wird der Speicher freigegeben, du hast jedoch noch einen Zeiger, der darauf verweist. Beim nächsten Zugriff darauf hättest du unter Windows eine memory-exception.
Was der TI macht, weiß ich nicht - ist aber sicher nicht die feine art.

Zitat:
Wenn ich aber char erg[15]; schreibe, dann gibts keine Probleme.
s.o.

wenn du eine zeichenkette speicher willst, musst du auf jeden fall "char erg[15]" schreiben - wenn die zeichenkette nicht länger als 14 (!) Zeichen ist (+ ASCII Null).
vorteil von maloc ist, dass du dynamisch zur laufzeit die größe des alokierten Speichers bestimmen kannst.

Zitat:
Wenn man static weglässt, so beschwert sich der Compiler auch nicht. Aber ich schätze mal, dass das static schon wichtig ist!?
Bei static wird die variable am heap angelegt, also beim Verlassen der Fu. nicht freigegeben.

Zitat:
Ich meinte damit, dass man in C++ sich das Allokieren von kleinen Daten sparen kann
was meinst du damit ?
was sind "kleine daten" ?

Zitat:
Aber ich bin eh schon froh dass es C fürn TI gibt, früher wurde fürn TI alles mit Assembler geschrieben!!! Da schreibt man mal 1 Seite nur um den String "Hallo Welt" auszugeben!
hab assembler nur am pc programmiert - stimmt, dauert recht lange, da was zu machen.

fg
-hannes
Biri ist offline   Mit Zitat antworten
Alt 23.06.2004, 21:42   #12
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard Hallo!

Danke für deine Antwort. War mal interessant zu wissen was sich eigentlich hinter dem einfachen = in C++ bei Strings verbirgt.

Zitat:
Was der TI macht, weiß ich nicht - ist aber sicher nicht die feine art.
Beim TI funktionierts, aber wer weiß, vielleicht würde es ja irgendwann einmal zum Absturz kommen!


Zitat:
was sind "kleine daten" ?
OK, war wohl ein Blödsinn. Ich meinte damit nur dass man damit Speicher während dem Programmablauf in Anspruch nehmen kann/freigeben kann. Und daher dachte ich dass man Allokieren vor allem für große Arrays etc. verwendet, wo man nach Gebrauch der Variable den Speicher wieder freigeben will.



Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 26.06.2004, 00:47   #13
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

PHP-Code:
char stab(double hm);//oben einmal die Fkt definieren 

void _main(void




printf("\n->%s",stab(hm)); //Aufruf der Fkt. in _main() 





char stab(double hm)  //die Funktion 


    
char *erg/* static steht für Allozierung am Heap, sonst vom Stack.
 static belässt die Variable zwischen zwei Funktionsaufrufen von stab(), während der Speicherplatz von nicht static Variablen per Assemblerbefehl ("unlink") wieder freigegeben wird ! */

 
erg=(char *)"Fehler"//wenn ich char erg[20] schreib gehts komischerweise garnicht(Compile Error) 
     
    
if(hm>0.0
        
erg=(char *)"stabil"
     
    else if(
hm==0.0
        
erg=(char *)"indifferent"
     
    else if(
hm<0.0
        
erg=(char *)"labil";     

return 
erg


zeiger="Literal"; bedeutet: Weise zeiger die Anfangsadresse des Charfeldes "..." - in diesem Fall ist "Literal" gemeint - zu.

char *erg1; ist eine Adressvariable
char erg2[20]; ist ein Characterfeld mit 19+1 (Nullterminierter Sring) oder 20 Elementen.

erg1 ... nimmt Adressen durch eine Zuweisung - also durch den '=' Operator - an.

erg2 ... ist ein Label (Anfangsadresse eines Arrays = Feld = eindimensionale Matrix).

erg2="..."; geht nicht, da erg2 kein L-Wert ist. erg2 kann nicht neu gesetzt werden, da es (=eben das gegenständliche Label) auf eine unveränderliche Speicherplatzposition zeigt.

Ein L-Wert ist eine Variable oder ein Zeiger ...

mfg Kikakater
kikakater ist offline   Mit Zitat antworten
Alt 03.07.2004, 22:57   #14
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard

Wobei aus logischen Gründen diese Zeile
Zitat:
Original geschrieben von kikakater
PHP-Code:
 erg=(char *)"Fehler"//wenn ich char 
ersatzlos gestrichen werden kann.

Allerdings ist dieser Code problematisch. Nach dem Verlassen der Funktion char * stab(double hm) gibt es keine Garantie mehr, dass die Speicheradressen, die vorher "stabil", "indifferent" oder "labil" als Inhalt hatten, dies noch tun werden. Sobald eine Funktion verlassen wird, kann im Rechner der von der Funktion belegte Speicher wieder freigegeben werden. Es ist nämlich möglich, dass der RAM-Speicher vorübergehend auf die Festplatte ausgelagert wird (virtueller Speicher). Daher sollte tunlichst der Speicher explizit über malloc oder ein statisches Array reserviert werden. (static oder eben eine globale Variable). Dann ist aber ein strcpy erforderlich.
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 04.07.2004, 03:22   #15
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Zitat:
Original geschrieben von Flink
Wobei aus logischen Gründen diese Zeile

erg=(char *)"Fehler"; //wenn ich char


ersatzlos gestrichen werden kann.

Das ist Gewohnheit und bleibt schön im Programmcode.

Wenn nicht alle logischen Fälle abgedeckt werden, wird auf den String "Fehler" verwiesen. Das ist nicht nur recht und billig, sondern programmatisch notwendig. Eine Redundanz hier in diesem Fall zu eleminieren ist strategisch nicht zu vertreten.


Zitat:

Allerdings ist dieser Code problematisch. Nach dem Verlassen der Funktion char * stab(double hm) gibt es keine Garantie mehr, dass die Speicheradressen, die vorher "stabil", "indifferent" oder "labil" als Inhalt hatten, dies noch tun werden. Sobald eine Funktion verlassen wird, kann im Rechner der von der Funktion belegte Speicher wieder freigegeben werden. Es ist nämlich möglich, dass der RAM-Speicher vorübergehend auf die Festplatte ausgelagert wird (virtueller Speicher). Daher sollte tunlichst der Speicher explizit über malloc oder ein statisches Array reserviert werden. (static oder eben eine globale Variable). Dann ist aber ein strcpy erforderlich.
Dieser Code ist deswegen nicht problematisch, weil der Compiler Stringliterale am Heap ablegt, ggf. idente Stringliterale als eine Instanz (Vorkommen) zusammenzieht, falls dieser Schalter gesetzt wurde.

Diese Art von Initialisierung wandert somit auf den Heap (deutsch Halde) und ist per definitionem als statisch zu bezeichnen.

Ich kann hier leider nicht mit Gefühlsbeschwichtigungen dienen, dies sind die Tatsachen, Gegenbeweise noch ausstehend.
kikakater 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 10:31 Uhr.


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