mikrocontroller.net

Forum: Compiler & IDEs verständnissfrage


Autor: VLplayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich habe eine verständnissfrage.
und zwar wenn ich mit hilfe einer funktion eine große datenmenge ,welche 
in einen lokalen array sind, zurückgeben möchte und ich dazu nur die 
adresse des arrays an das aufrufende programm geben . klappt das???

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö. Das lokale Array gibt es nach Verlassen der Funktion nicht mehr, 
ergo zeigt deine Adresse ins Nirwana.

Oliver

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Das Array wird ja zerstört, sobald die Funktion verlassen wird. 
Ein Zeiger auf das Array wäre also nicht mehr gültig.

Entwerder zu erzeugst das array dynamisch, also z.B. mit malloc() bzw. 
mit new, falls du mit C++ programmierts und gibts dann den Zeiger 
zurück.
Oder du erzeugst das Array in der aufrufenden Funktion und übergibst 
einen Zeiger (noch besser Referenz bei C++) an die Funktion, die die 
Daten dann rein schreibt.

Gruß
Thomas

Autor: VLplayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank
und wenn ich nun ein großes array an eine fkt als parameter übergeben 
wil so dass sich die daten in der funktion nicht ändern.
wie mache ich das

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau so. Du schreibst einfach nichts in da Array. Lesen kannst du ja.
Sicherheitshalber kannst du den Parameter noch als "const" deklatieren. 
Dann bekommst du eine Compilermeldung, wenn du versuchst, das Array zu 
verändern.

Gruß
Thomas

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
global static ??

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So z.B.:
void ftk (const char* arr)
{
   arr[0] = 0; //Fehler!!
}

char x[100];
ftk (x);

Wie groß dein Array ist, spielt dabei keine Rolle!

@Winfried J.:
Mit static beschränkst du dich aber auf eine Datei und verhinderst 
nicht, dass die Daten verändert werden!
VLplayer wollte aber wissen, wie man das ganze an eine Funktion 
übergibt.

Gruß
Thomas

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"global" sollte es vonn überall erreichbar machen
"static" rettet das array von einem Aufruf zum Nächsten

gegen überschreiben ist es so zwar nicht geschützt

Aber der Zugriff per Zeigerübergabe ist möglich. Was die funktion damit 
macht bestimmt deren Funktionsdefinition. Nur das Array zerstören 
(destroy) kann sie nicht. Lediglich dessen Inhalt kann sie muss sie aber 
nicht ändern.

"const" bringt nur etwas wenn der Arrayinhalt nie verändert werden soll!

Ein Datensatz welcher bereits in einem Array vorliegt in ein locales 
const Array zu kopieren frist nur Rechenzeit und Speicher.

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> "global" sollte es vonn überall erreichbar machen

Nur dass ich richtig bin. Wir reden hier von C?
Weder in C noch C++ kenn ich eine "global"-Definition.

> "static" rettet das array von einem Aufruf zum Nächsten
"static" beschränkt den Zugriff der Variable auf das aktuelle Modul. Ein 
Zugriff über "extern" von einem anderen Modul ist nicht möglich.

> Aber der Zugriff per Zeigerübergabe ist möglich. Was die funktion damit
> macht bestimmt deren Funktionsdefinition. Nur das Array zerstören
> (destroy) kann sie nicht. Lediglich dessen Inhalt kann sie muss sie aber
> nicht ändern.

Du kannst in einer Funktion dynamisch erzeugte Arrays sehr wohl 
zerstören, die durch einen Pointer übergeben wurden!

> "const" bringt nur etwas wenn der Arrayinhalt nie verändert werden soll!

Genau darum gehts VLplayer ja. Und um sicher zu sein, dass er nicht 
versehentlich doch rein schreibt, kannn er den Parameter "const" machen. 
Dann bekommt er beim compilieren eine Fehlermeldung.

> Ein Datensatz welcher bereits in einem Array vorliegt in ein locales
> const Array zu kopieren frist nur Rechenzeit und Speicher.

Hat ja auch niemand gesagt. Deswegen soll er ja einen Zeiger übergeben!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@VLplayer: Schonmal was von Groß- und Kleinschreibung gehört?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Winfried J. schrieb:
> "global" sollte es vonn überall erreichbar machen

Wozu?

> "static" rettet das array von einem Aufruf zum Nächsten

Das klingt, als ob du das auf eine lokale Variable beziehst, nicht auf 
eine globale.

> "const" bringt nur etwas wenn der Arrayinhalt nie verändert werden soll!

Falsch.

> Ein Datensatz welcher bereits in einem Array vorliegt in ein locales
> const Array zu kopieren frist nur Rechenzeit und Speicher.

Warum sollte man ihn kopieren? Man übergibt einfach einen Zeiger auf 
const, schon ist es dort, wohin man es übergibt, nicht beschreibbar.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.