Du bist nicht angemeldet.

Werbeanzeige

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 526

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

1

20.10.2006, 12:23

Array mit einem Zeigern an eine Funktion übergeben

Hallo zusammen.

Ich habe jetzt die Zeiger auch durchgearbeitet und bin nochmals zurück zu dem Beispiel, welches wir schon besprochen hatten.
Nur jetzt möchte ich ein Array mit einem Zeiger in eine Funktion übergeben.

Nun, auch das klappt nicht so, wie ich es mir vorgestellt habe. Ich habe zwar eine möglichkeit (mithilfe eines Kommentars von unsigned long) gefunden, jedoch scheint mir die nicht logisch, und so wie ich es im Buch gelernt habe.

Hier der Quellcode, wie ich mir gedacht habe, dass es klappen müsste:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
    
void add (int *pFeld);

int main (void)
{
    int Feld1[2];
    
    add (&Feld1);
}

void add (int *pFeld)
{

}


Ich habe es mit absicht so kurz, wie möglich gemacht, und auch die Funktion selber leer gelassen.

Nun, ich weiss jetzt, dass ich bei dem Funktionsaufruf kein &-Operator machen darf, nur ich weiss nicht wieso.

Nun also, ohne den &-Operator funktioniert es, aber warum?- Der ist ja zwingend, um die Adresse an den Zeiger der Funktion zu übergeben.

Dies funktioniert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
    
void add (int *pFeld);

int main (void)
{
    int Feld1[2];
    
    add (Feld1);
}

void add (int *pFeld)
{
    std::cout << pFeld << std::endl;

}


Nur, warum?-Ich meine, ich übergebe ja nichteinamal einen Wert. Wenn ich dieses Beispiel einfach ohne Zeiger machen würde, würde der Kompiler ja eine Fehlermeldung ausspucken, weil ich kein Wert (im sinn von Feld1[1] ausgewählt habe.
Und warum kann ich hier die Grösse des Array weglassen?-So weiss der Kompiler ja nichteinmal, wie gross das Array ist.

Kann mir das ganze jemand erklären, oder einen Link geben, indem es erklärt wird?-Mir erscheint das alles ein wenig undurchsichtig, vorallem, da im Buch keine Arrays mit Zeiger übergeben werden.

Danke schon im voraus!

Liebe Grüsse Drakon

2

20.10.2006, 12:53

Hallo erst mal zusammen (mein erster Eintrag hier im Forum)

Zu deiner Frage:

Die Antwort ist relativ einfach. Wenn du ein Array deklarierst, dann deklarierst du im Grunde einen Zeiger.

Feld1 ist somit ein Zeiger welcher auf den Anfang deines Arrays zeigt, also auf Feld[0]

Daher musst du Feld1 auch bei der Übergabe an die Funktion nicht referenzieren, da Feld1 schon ein Zeiger ist.

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 526

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

20.10.2006, 13:09

:idea: ahhhhh....vielen dank!!

das hilft mir schon weiter...zumindest für das Verständniss..
Darum nimmt er bei der Ausgabe einfach den ersten Wert.
Und ich nehme mal an, das die Funktion gar nicht wissen muss, wie lange das Array ist, da es ja bloss ein Zeiger ist, und darum keinen Speicherplatzt braucht...

Edit:
Jetzt habe ich aber trotztdem noch etwas.
1. Bei mehrdimensionalen Arrays funktioniert es nicht mehr. Da bekomme ich immer diese Fehlermeldung:

Quellcode

1
2
error C2664: 'add': Konvertierung des Parameters 1 von 'Felder [2][2]' in 'Felder *' nicht möglich
        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.


2. Warum kann ich, wenn das übergebene Array (Jetzt mal eindimensional) eine Struktur ist dennoch mit dem Punktoperator die Elemente ansteuern?-Ich habe gedacht, dass wenn man es mit Zeigern macht automatisch der -> Operator kommt. Dies funktioniert aber hier nicht.

4

20.10.2006, 15:21

Ich habe das ganze woanders schon einmal beschrieben. Ich denke wenn du das hier

http://www.fsr-informatik.de/forum/viewtopic.php?t=1761

gelesen hast, ist dir das alles etwas klarer.

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 526

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

20.10.2006, 15:51

ahh, also, wenn ich das jetzt richtig verstanden habe, kann ich dieses Beispiel so lassen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
    

struct Felder
{
    int aa;
};

void add (Felder pFeld[2][2]);

int main (void)
{
    Felder Feld1[2][2];
    
    add (Feld1);
}

void add (Felder pFeld[2][2])
{
    pFeld[1][0].aa = 1;
}


Dass heisst, dass jetzt das Array (auch wenn es so aussieht) NICHT als ganzes auf den Stack geschaufelt wird, sondern nur der Zeiger. Ist das richtig?

Dann ist da ber immernoch die Frage nach dem . - Operator, oder besser gesagt der -> Operator? Warum kann ich immernoch den . Operator benutzen, wenn ich doch über Zeiger eines Arrays einer Struktur zugreife?

6

20.10.2006, 16:08

Weil du im Speicher 'Felder' angelegen lässt:

Zitat

Felder Feld1[2][2];



... und nicht Zeiger auf 'Felder' :

Quellcode

1
Felder* Feld1[2][2];

(hierbei müsste der Speichplatz für die Felder allerdings noch zusätzlich allokiert werden)

Deshalb . (Punkt) und nicht -> (Pfeil)

7

20.10.2006, 22:42

Machs doch einfach mit doppelpointern ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

8

20.10.2006, 22:43

Jo einfach mit Doppelpointern... genau... Schonmal ausprobiert? Das ist
nicht so einfach wie du es dir vorstellst.

9

20.10.2006, 23:04

Mein Gott k wenn er es net hinbekommt ... ja sicha hab ich schon mit doppelpointern gearbeitet ... ist net soo schwer ... aja ... Riddick... hast du im Moment irgendwelche Probleme oder warum musst de dich so aufführen??
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

10

20.10.2006, 23:08

Glaub ich kaum, dann zeig mir mal ein Kompilier- und Funktionsfähiges Beispiel, wo ein 2D Array einer Funktion mit Doppelpointern übergeben wird.

Werbeanzeige