Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » wie Zeiger an eine Funktion übergeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.06.2006, 20:23 Uhr
Poffelnator



Wie kann ich eine Adresse an eine Funktion übergeben und diese wieder zurück geben?

C++:
#include <iostream>
#include "rechteck.h"
#include "eingabe.h"
using namespace std;

int main ()
{
    int a;
    rechteck *ptr = NULL;
    eingabe(&a, ptr);

    ptr[1].show_geo();




    return 0;
}


Hier in der main Funktion setze ich ein zeiger auf, aber wie kann ich ihn an die Funktion eingabe übergeben ohne, dass er kopiert wird.

C++:
#include <iostream>
#include "rechteck.h"

using namespace std;

void eingabe(int *a, rechteck *ptr)
{
    cout << "Wie viel Rechtecke wollen sie erzeugen? ";
    cin >> *a;
    ptr = new rechteck[*a];

    int s1,s2;

    for (int count = 1; count <= *a; count++)
    {
        cout <<" Rechteck " <<count <<endl;
        cout <<"=============" << endl;
        cout << endl;
        cout << "Seite a: ";
        cin >> s1;
        cout << "Seite b: ";
        cin >> s2;
        ptr[count -1].set(s1,s2);
        cout << endl ;

    }

} // Ende Funktion eingabe


Ich will in einer anderen Funktion den reservierten Speicher verwenden, aber die Übergabe der Adresse funktioniert nicht (glaube ich) wie bekomme ich das hin???

P.S. ist ein Crosspost www.spotlight.de/zforen/cpp/m/cpp-1150397899-20907.html

Dieser Post wurde am 15.06.2006 um 20:59 Uhr von Poffelnator editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.06.2006, 22:56 Uhr
Pler
Einer von Vielen
(Operator)


Nö, die Übergabe sieht schon richtig aus.
Wie macht sich denn der Fehler bemerkbar?

Ach so:
Du holst ja neuen Speicher.
Dann musst du entweder einen Zeiger-Zeiger Übergeben, oder die Funktion den neuen Zeiger Zurückgeben lassen

Dieser Post wurde am 15.06.2006 um 22:58 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.06.2006, 23:44 Uhr
Poffelnator



Das mit dem Zeiger auf einen Zeiger hat mit Schwierigkeiten gemacht. Jetzt lass ich die Funktion einfach über return die Adresse zurück geben. Ist nicht schön geht aber.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.06.2006, 07:22 Uhr
Pler
Einer von Vielen
(Operator)


Wieso ist das nicht schön?
Das macht man nun mal so.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.06.2006, 08:35 Uhr
Poffelnator



Weil man da nur einen Wert übergeben kann und ich mir in den Kopf gesetzt habe es eben anders zu machen. Sonst hätte ich ja gleich alles in die Main Funktion schreiben können, dann hätte ich da gar keine Probleme mit Zeigern gehabt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.06.2006, 09:19 Uhr
Pler
Einer von Vielen
(Operator)


Naja wie dem auch sei:
So sollte es funktionieren:
void eingabe(int *a, rechteck **ptr);
und beim Aufruf dann:
eingabe(&a, &ptr);
Zugriff innerhalb von eingabe():
*ptr = new rechteck[*a];
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.06.2006, 09:53 Uhr
ao

(Operator)



Zitat von Pler:
Naja wie dem auch sei:
So sollte es funktionieren:
void eingabe(int *a, rechteck **ptr);
und beim Aufruf dann:
eingabe(&a, &ptr);
Zugriff innerhalb von eingabe():
*ptr = new rechteck[*a];

... und noch ein Tipp-chen: Man kann zur Ungarischen Notation stehen, wie man will, aber es verbessert m.E. ganz enorm die Übersicht, Zeigervariablen mit p zu prefixen, und zwar ein p für jede Indirektion. Obiger Code sähe dann so aus:

C++:
void eingabe (int * pA, rechteck ** ppRechteck)
{
    *ppRechteck = new rechteck[*pA];
}


Man sieht dann der Variablen sofort an, wie viele Indirektionen nötig sind, um zum Basistyp zu kommen, und man hat es leichter, Indirektionsfehler zu finden und zu vermeiden.

Die Zeile

C++:
*ptr = new rechteck [*a];

ist zwar richtig, sieht aber auf den ersten Blick falsch aus, weil dieser Code ein vertrauteres Bild ist:

C++:
ptr = new rechteck[a];


Nichts ist ärgerlicher als vermeidbare Verwirrung.

Der oben verlinkte Wikipedia-Artikel ist übrigens lesenswert, weil er beschreibt, dass die UN eigentlich nur deswegen so in Verruf geraten ist, weil sie im Win32API missverstanden und falsch angewendet wurde.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.06.2006, 09:58 Uhr
Pler
Einer von Vielen
(Operator)


@ao:
Ich kenne diese Notation und bin selber unbedingt dafür das so (und eben so ähnlich) umzusetzen.
Ob das bei einem Zehn-Zeilen Beispiel jetzt so notwendig ist kann man sich vielleicht streiten...
Ich habe schon Leute erlebt, die das absolut nicht einsehen. Vorallem Klassenvariablen durch m_.. zu kennzeichen finde ich sehr wichtig. Vorallem wenn ählich lautende lokale Variablen in den Methoden angelegt werden!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: