array von einer Funktion zurückgeben nicht möglich???



  • Hallo, ich habe ein kleines Problem mit einem kleinen Programm...ich versuche über eine Funktion einen array urück zu geben..leider funktioniert dieses aber nicht...kann auch sein das es am dem prog liegt mit dem ich arbeite (da es von der syntax her alles stimmt)."arbeite mit C++Builder 5"...

    double *ermittleMinMaxRaeume(double*, double);
      double ermittleGesammtFlaesche(double*);
       double ermittleArithMW(double*, double);
    
    void __fastcall TForm1::btn1Click(TObject *Sender)
    {
      double raum[9]={8.0, 55.0, 45.0, 67.0, 33.0, 48.0, 52.0, 78.0, 49.0};
       double mingroesse=48;
        double minmax[2], flaescheges, arithMW;
    
         minmax[2]=*ermittleMinMaxRaeume(raum, mingroesse);
          flaescheges=ermittleGesammtFlaesche(raum);
           arithMW=ermittleArithMW(raum, flaescheges);
    
               edt_min->Text=minmax[0];
              edt_max->Text=minmax[1];
             edt_flaescheges->Text=flaescheges;
            edt_arithMW->Text=arithMW;
    
    }
    //---------------------------------------------------------------------------
      double *ermittleMinMaxRaeume(double *raum, double mingroesse){
               int i=1, min=0, max=0;
                double minmax[2];
    
             while(i<=raum[0]){
                      if (raum[i]>=mingroesse){
                         minmax[1]=max+1;
                      }
                         else {
                              minmax[0]=min+1;
                         }
               i++;
             }
         return minmax;
      }
           double ermittleGesammtFlaesche(double *raum){
              int i=1;
               double flaescheges=0;
    
                 while(i<=raum[0]){
                         flaescheges=flaescheges+raum[i];
                         i++;
                 }
             return flaescheges;
           }
    
                    double ermittleArithMW(double *raum, double flaescheges){
                        double arithMW=0;
    
                           arithMW = flaescheges/raum[0];
                         return arithMW;
                    }
    

    Vieleischt seht Ihr ja einen Fehler...Danke im voraus



  • Du gibst einen Zeiger auf ein temporäres Array zurück, welches am Ende der Funktion schon nicht mehr existiert.

    Und, sagmal, willst Du mit Deinen Einrückungen Zickzackwellen zeichnen?



  • arrays können nicht zurück gegeben werden. dein array double minmax[2]; ist nur lokal gültig und wird zerstört, sobald die methode abgearbeitet wurde.

    allerdings können pointer zurückgegeben werden. änder

    double minmax[2];
    

    in

    double *minmax = new double[2];
    

    und es funktioniert.

    und nicht vergessen, den speicher mittels delete später wieder freizugeben.



  • @LordJaxom:

    ich versuche;
        mit den zickzack einrückungen;
          die übersicht etwas einfacher zu gestallten;
        finde ich sehr effektiv wenn man enfängt;
      if() else if () versschachtelungen zu erstellen;
    

    @thordk: 😕



  • Du verschachtelst aber bei jeder Zeile anders, nicht nur in Blöcken... Findest Du das übersichtlich? 😕

    EDIT:
    Und Deine Rückfrage an thordk kann man bestenfalls als unzureichend beschreiben. Verstehst Du die Sprache die er spricht nicht? 😉 Oder was möchtest Du ihn fragen?

    Ansonsten bleibt das gesagte:
    Wenn Du innerhalb eines Blocks eine Variable anlegst, ist diese am Ende des Blocks wieder weg (auch wenn Du einen Zeiger auf den Speicherbereich, wo die mal war, irgendwo speicherst).



  • in dem fall von dem o.g. scipt bring das natürlich nichts mit dem zickzack....
    kleines beisp:

    else
           {
             while (k<i)
               {
                 if (zeichenkette1[k]!=zeichenkette2[k])
                   {
                     a=3;
                     break;
                   }
                    else if ((zeichenkette1[0]<'A') || (zeichenkette1[0]>='Z'))
                       {
                         a=4;
                         break;
                       }
                      else if ((zeichenkette2[0]<='A') || (zeichenkette2[0]>='Z'))
                         {
                           a=4;
                           break;
                         }
                           else if (k!=0)
                             {
                               if ((zeichenkette1[k]<'a') || (zeichenkette1[k]>='z'))
                                 {
                                   a=4;
                                   break;
                                 }
                                   else if (((zeichenkette2[k]<'a') || (zeichenkette2[k]>='z')))
                                     {
                                       a=4;
                                       break;
                                     }
                             }
                 k++;
               }
           }
    

    <--- zu jeder öffnenden klammer auch direkt unten drunter die schliesende...übersichlichter halt. und so sieht man es viel schneller...find ich halt besser als alles von der ersten spalte an anzufangen...

    das ist mir auch schon klar, das es unzureihent ist ein smily hinzusetzten...was ich nicht verdtanden habe ich an welcher stelle ich den pointer übergeben soll???da es ja in meinem fall 2 werte sind die übergeben werden sollen...sorry wenn ich nicht alles sofort verstehe...fange erst an mit c++ zu arbeiten



  • einrückung soll den programmfluß nachempfinden. deine else-if statements sind alle gleichberechtigt, daher sollten sie auch alle dieselbe einrückung besitzen.

    if()
    {
    	if()
    	else()
    	{
    		if()
    		{
    			if()
    			else()
    		}
    	}
    	if()
    	else()
    }
    else()
    if()
    else()
    

    und zur ursprünglichen frage: vielleicht solltest du dir mal den unterschied zwischen arrays und pointern klar machen. steht eigentlich in jedem halbwegs brauchbarem tutorial.



  • ...und spätestens in der vierten Ebene sollte man sich Gedanken über Refakturierung machen 😉



  • Hallo nochmal....der unterschied zwischen einem pointe und einem arry ist mir schon bewusst. ich wolte auch nur fragen ob es eine möglichkeit gibt einen arry zurück zu geben, da es für die programierung einfacher wäre (meine meinung)

    wie es aussieht ist das leider nicht möglich.

    ps. bei mir funktioniert das prog auch nicht, wenn ich einen pointer zurückgebe.



  • Direkt geht das nicht, aber du könntest dein Array in eine struct kapseln und diese zurückgeben.

    (oder du verwendest gleich die Möglichkeiten von C++ und gibst einen vector<> zurück)



  • Die Einrückung ist ja sehr vorteilhaft...


Log in to reply