Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit Referenzrückgabefunktion

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
19.07.2006, 15:14 Uhr
Yadgar



High!

Die Aufgabenstellung, an der ich im Moment herumknobele lautet:

"Erstellen Sie eine Funktion, der ein zweidimensionales Feld, dessen Dimensionen und dazu passend zwei Indexwerte übergeben werden, die bei Indexüberschreitung Abbruch mit Warnung erzwingt und ansonsten das im Aufruf angesprochene Element als Referenz zurückgibt!"

Funktion und Implementierung sehen bei mir so aus (eine Vorgängerversion für eindimensionale Felder funktionierte einwandfrei!):


C++:
double& select2(double* feld[], int dim1, int dim2, int index1, int index2)
{
   if ((index1 < 0 || index1 >= dim1) || (index2 < 0 || index2 >=dim2))
   {
      cout << "Index nicht im zulässigen Bereich!" << endl;
      exit (1);  // Programmabbruch bei Indexüberschreitung
   }
  
   return feld[index1][index2];
}



int main()
{
   double f[3][3]={{12.45, 89.14, 44.67}, {9.8, 34.21, 89.12}, {74.67, 23.96, 25.9}};
   double g[3][3];
   int i, j;

   for (i=0; i<3; i++)
   {
      for (j=0; j<3; j++)
      {
         // select(g, 3, 3, i, j) = select(f, 3, 3, i, j);
         cout << select2(f, 3, 3, i, j);
         if (j==2) cout << "\n";
         else cout << ", ";
      }
   }
   getchar();
}



...nur leider bekomme ich ständig die Fehlermeldung (bezogen auf den Aufruf in der inneren for-Schleife): cannot convert `double (*)[3]' to `double**' for argument `1' to `double& select2(double**, int, int, int, int)'

Wenn ich einer Funktion ein zweidimensionales Array übergebe, dann kann das doch nur als Array von Zeigern geschehen... oder habe ich da was übersehen?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.07.2006, 11:35 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh, eine alte unbeantwortete Frage...

N - dimensionale Felder werden in C/C++ intern immer eindimensional im Speicher abgelegt. Dh wenn Du ein solches Feld an eine Funktion übergibst, kannst Du eigentlich nur mit einem eindimensionalen Feld handtieren. Dh inbesondere, daß im Folgenden feld einfach ein Zeiger auf ein double ist.

C++:
double& select2(double* feld, int dim1, int dim2, int index1, int index2) {
      if (0<=index1 && index1<dim1 && 0<=index2 && index2<dim2) {
         return feld[dim2*index1+index2];
      }
      else {
          throw std::runtime_error("index out of range");
      }
}



In Deiner Version lautet die Deklaration ja:

C++:
double* feld[], int dim1, int dim2, int index1, int index2)


hier ist feld ein Zeiger auf ein Zeiger auf ein(ige) double(s); das moniert auch die Fehlermeldung.

solche Sachen wie "exit" solltest Du dir abgewöhnen: Ein Programm zu beenden, weil ein Index überschritten wird, ist so ähnlich wie ein Auto verschrotten, weil der Tank leer ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.07.2006, 12:02 Uhr
Yadgar



High!


Zitat von virtual:
Oh, eine alte unbeantwortete Frage...

N - dimensionale Felder werden in C/C++ intern immer eindimensional im Speicher abgelegt. Dh wenn Du ein solches Feld an eine Funktion übergibst, kannst Du eigentlich nur mit einem eindimensionalen Feld handtieren. Dh inbesondere, daß im Folgenden feld einfach ein Zeiger auf ein double ist.



Wo ist denn dann die explizit mehrdimensionale Schreibweise überhaupt zulässig, bzw. wann kann man die mehrdimensionale Schreibweise verwenden, wann muss es feld[y*Breite+x] sein?


Zitat von virtual:

solche Sachen wie "exit" solltest Du dir abgewöhnen: Ein Programm zu beenden, weil ein Index überschritten wird, ist so ähnlich wie ein Auto verschrotten, weil der Tank leer ist.


Ausnahmen werfen kommt erst weiter hinten im "Aupperle" dran, ich bin im Moment bei Seite 301 von 1015...

Wie ich gerade deinen Lösungsvorschlag nachvollziehe: es klappt nach wie vor nicht, ich bekomme jetzt die Fehlermeldung:

invalid initialization of reference of type 'double&' from expression of type 'double*'

Wieso das? Ich will doch nur jeweils eine einzelne Double-Variable zurückgeben und kein ganzes Feld!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 26.07.2006 um 12:35 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.07.2006, 12:53 Uhr
Tommix



Hallo,
meinst Du so was?

C++:
double& select2(double feld[3][3], int dim1, int dim2, int index1, int index2)
{
   if ((index1 < 0 || index1 >= dim1) || (index2 < 0 || index2 >=dim2))
   {
// usw. Rest wie bei Dir...


Erlaubt wäre auch

C++:
double& select2(double feld[][3], int dim1, int dim2, int index1, int index2)


- was ich bei mehrdimensionalen Feldern eher unschön finde.
Praktisch wäre evtl auch ein

C++:
typedef double matrix[3][3];

double& select2(matrix feld, ...



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.07.2006, 13:21 Uhr
Yadgar



High!


Zitat von Tommix:
Hallo,
meinst Du so was?

C++:
double& select2(double feld[3][3], int dim1, int dim2, int index1, int index2)
{
   if ((index1 < 0 || index1 >= dim1) || (index2 < 0 || index2 >=dim2))
   {
// usw. Rest wie bei Dir...




...das führt zur Fehlermeldung

invalid initialization of non-const reference of type 'double&' from a temporary of type 'double*' ,

bezogen auf die return-Zeile der Funktion.



Zitat von Tommix:

Erlaubt wäre auch

C++:
double& select2(double feld[][3], int dim1, int dim2, int index1, int index2)


- was ich bei mehrdimensionalen Feldern eher unschön finde.



Funktioniert auch nicht, gleiche Fehlermeldung wie im ersten Beispiel.


Zitat von Tommix:

Praktisch wäre evtl auch ein

C++:
typedef double matrix[3][3];

double& select2(matrix feld, ...





Auch nicht der Hit - wieder dieselbe Fehlermeldung! Und dann sind diese Meldungen auch noch so kryptisch... von Nerds für Nerds entwickelt!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.07.2006, 14:04 Uhr
Tommix




Zitat von Yadgar:
... wieder dieselbe Fehlermeldung! ...

Es ist ja auch dreimal der gleiche Code im Prinzip.
Visual C++ kommt damit klar. Noch mal in Gänze, womöglich hast Du mittlerweile irgenwo ein * zuviel:

C++:
#include <iostream>
using namespace std;

typedef double matrix[3][3];

double& select2(matrix feld, int dim1, int dim2, int index1, int index2)
{
   if ((index1 < 0 || index1 >= dim1) || (index2 < 0 || index2 >=dim2))
   {
      cout << "Index nicht im zulässigen Bereich!" << endl;
      exit (1);  // Programmabbruch bei Indexüberschreitung
   }
  
   return feld[index1][index2];
}



int main()
{
   matrix f={{12.45, 89.14, 44.67}, {9.8, 34.21, 89.12}, {74.67, 23.96, 25.9}};
   matrix g;
   int i, j;

   for (i=0; i<3; i++)
   {
      for (j=0; j<3; j++)
      {
         select2(g, 3, 3, i, j) = select2(f, 3, 3, i, j);
         cout << select2(g, 3, 3, i, j);
         if (j==2) cout << "\n";
         else cout << ", ";
      }
   }
   getchar();

   return 0;
}


Ausgabe

Code:
12.45, 89.14, 44.67
9.8, 34.21, 89.12
74.67, 23.96, 25.9



- Tommix

Dieser Post wurde am 26.07.2006 um 14:05 Uhr von Tommix editiert.
 
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: