Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wieder ein Problem mit einer Referenz-Rückgabe...

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
27.07.2006, 16:35 Uhr
Yadgar



High!

...auf das ich mir beim besten Willen keinen Reim machen kann!


C++:
// Dynamisches Feld
// (AUPPERLE, S. 304)

#include <iostream>
using namespace std;

bool allocDoubleField (double* f, unsigned long dim)
{
   f = new double[dim];
   if (!f)
   {
      cerr << "Konnte Speicherplatz nicht bereitstellen! ";
      exit(-1);
   }
   else return true;
}

void delDoubleField (double* f)
{
   cout << "Feld wird zerst" << (char)148 << "rt!" << endl;
   delete[] f;
}

double& select(double f[], unsigned long dim, unsigned long index)
{
   if (index < 0 || index >= dim)
   {
      cout << "**** Index nicht im zul" << (char)132 << "ssigen Bereich!" << endl;  
      exit(1);
   }

   return f[index];
}

int main()
{
   unsigned long dim, n;
   double* feld;
   double v;

   cout << "Wie gro" << (char)225 << " soll das Feld sein? ";
   cin >> dim;
   allocDoubleField(feld, dim);
   cout << "Welches Feldelement soll ver" << (char)132 << "ndert werden? ";
   cin >> n;
   cout << "Welchen Wert soll dieses bekommen? ";
   cin >> v;
   cout << "Hallo" << endl;
   select(feld, dim, n)=v;
   // cout << select(feld, dim, n);

   // delDoubleField(feld);
  
  
   system("pause");
}



Anders als bei meinen früheren Übungsaufgaben schaffe ich es einfach nicht, der zurückgegebenen Referenz einen Wert (nämlich v) zuzuweisen - das Programm hängt sich einfach auf!

Im Moment zweifele ich mal wieder akut an meiner Eignung zum Programmierer...seit vorgestern bin ich ganze vier Seiten im "Aupperle" weitergekommen! Was ist das eine elende Quälerei...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.07.2006, 16:58 Uhr
(un)wissender
Niveauwart


Du hast kein Problem mit der Rüchgabe, sondern mit der Übergabe per value bzw. Referenz.
Du über gibt den Pointer auf das Feld per value, muss aber per Referenz, da du diesen ja später nutzen willst.


C++:
//falsch
bool allocDoubleField (double* f, unsigned long dim)
//richtig
bool allocDoubleField (double*& f, unsigned long dim)


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.07.2006, 17:03 Uhr
(un)wissender
Niveauwart


Ansonsten, schicker wäre es wohl so...


C++:
#include <stdexcept>
#include <iostream>
#include <vector>

int main()
{
    unsigned long dim, n;
    double v;

    std::cout << "Wie gro" << (char)225 << " soll das Feld sein? ";
    std::cin >> dim;
    std::vector<double> buffer(dim);
    std::cout << "Welches Feldelement soll ver" << (char)132 << "ndert werden? ";
    std::cin >> n;
    std::cout << "Welchen Wert soll dieses bekommen? ";
    std::cin >> v;
    std::cout << "Hallo" <<  std::endl;
    try
    {
        buffer.at(n) = v;
    }
    catch(std::exception const &ex)  
    {
        std::cout << ex.what() << '\n';
    }      
    system("pause");
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.07.2006, 13:19 Uhr
Yadgar




Zitat von (un)wissender:
Du hast kein Problem mit der Rüchgabe, sondern mit der Übergabe per value bzw. Referenz.
Du über gibt den Pointer auf das Feld per value, muss aber per Referenz, da du diesen ja später nutzen willst.


C++:
//falsch
bool allocDoubleField (double* f, unsigned long dim)
//richtig
bool allocDoubleField (double*& f, unsigned long dim)




Referenzen auf Zeiger, das geht also tatsächlich... funktioniert in diesem Fall aber trotzdem nicht, das Programm hängt sich nach wie vor auf!

Bis bald im Khyberspace!

Yadgar, schwitzend ohne Klimaanlage und umringt von Mineralwasserflaschen...
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.07.2006, 15:09 Uhr
(un)wissender
Niveauwart


Also bei mir nicht...
Vielleicht ist dein dim zu groß. Du darfst nur auf dim - 1 zugreifen, da ist auf jeden Fall noch ein Fehler in deinem Programm.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.07.2006, 15:44 Uhr
Yadgar



High!


Zitat von (un)wissender:
Also bei mir nicht...
Vielleicht ist dein dim zu groß. Du darfst nur auf dim - 1 zugreifen, da ist auf jeden Fall noch ein Fehler in deinem Programm.


Ja, bingo... mit select(feld, dim-1, index)=v klappt es! Danke!

Und ich dachte schon, im Moment wäre einfach kein Wetter zum Programmieren ;-)...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
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: