KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: Was mache ich falsch?
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,
ich lerne gerade C# und hab mir da diesen Code "zusammengebastelt".

Code:
namespace tests
{
    
    class Program
    {
        int rechnen(int a, int b)
        {
            int ergebnis = a + b;
            return ergebnis;
        }
        static void Main(string[] args)
        {
            
            int zahl1 = 0;
            zahl1 = rechnen(2,3);
            Console.WriteLine(zahl1);
            Console.Read();
        }
    }
}

Eigentlich sollte ich doch jetzt einfach 5 ausgegeben bekommen, doch ich bekomme vom Kompiller immer die Meldung:

Code:
Fehler    1    Für das nicht statische Feld, die Methode oder die Eigenschaft "tests.Program.rechnen(int, int)" ist ein Objektverweis erforderlich.


Könnt ihr mir sagen was ich falsch mache???
Danke im vorraus

Das erinnert stark an Java und da ging es schon nicht, einfach nur int rechnen() zu definieren. Versuch es mal mit public int rechnen() oder static int rechnen()

Dreiundachzig :
Das erinnert stark an Java und da ging es schon nicht, einfach nur int rechnen() zu definieren. Versuch es mal mit public int rechnen() oder static int rechnen()


Danke Smile
mit static int gehts.

Dieses Problem mit static zu lösen behebt das Problem nur mit nebenwirkungen.

Das Problem liegt darin, das du aus einer statischen Funktion keine nicht statischen Objekte oder Funktionen aufrufen kannst. Dies kann man natürlich beheben in dem man das andere Objekt oder die Funktion ebenfalls statisch macht, so wie hier. Die Funktion kann dann aber ebenfalls keine anderen Funktionen mehr aufrufen, die nicht statisch sind, was dazu führt das dein Programm nur noch aus statischen Objekten und Funktionen besteht. Dadurch wird aber jeglicher Objektorientiert Vorteil verloren, weil du die Klassen nicht mehr als Objekte, sondern nur als Funktionshalter benutzen kannst.

Besser ist dehalb die Lösung einfach ein Objekt der Klasse anzulegen, und auf dessen "rechnen" Funktion zuzugreifen. Wie das in C# funktioniert weiß ich nicht, aber hier der Code in Java mit der C# Klasse Console, sollte ein nicht zu großer Unterschied sein

Code:
{
    
     class Program
     {
         int rechnen(int a, int b)
         {
             int ergebnis = a + b;
             return ergebnis;
         }
         static void main(string[] args)
         {
            
             int zahl1 = 0;

             Programm Programm = new Programm();
             zahl1 = Programm.rechnen(2,3);

             Console.WriteLine(zahl1);
             Console.Read();
         }
     }
}

Rroia :

Code:
{
    
     class Program
     {
         int rechnen(int a, int b)
         {
             int ergebnis = a + b;
             return ergebnis;
         }
         static void main(string[] args)
         {
            
             int zahl1 = 0;

             Programm Programm = new Programm();
             zahl1 = Programm.rechnen(2,3);

             Console.WriteLine(zahl1);
             Console.Read();
         }
     }
}

Da würde aber ein Fehler auftauchen, weil du Program definierst, aber Programm verwenden möchtest.
Da sollte man dann lieber auf this.rechnen() greifen.

Dreiundachzig :
Da würde aber ein Fehler auftauchen, weil du Program definierst, aber Programm verwenden möchtest.
Da sollte man dann lieber auf this.rechnen() greifen.


Ich will dich jetzt erlich nicht schlechtreden, aber this.rechnen() würde keine verbesserung zum Anfangscode bringen. Wenn keine Klasse vor der Funktion steht wird immer this.rechnen() genommen.
Und zumindest in java gibt es kein Problem wenn man die Klasse die man grade schreibt in sich selbst verwendet, kann bei C# aber alles anders sein.

Jetzt hab ich nen anderes Problem, der Code sieht mittlerweile so aus:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test1
{
    class Program
    {

        //plusrechnungsfunktion
        static int plus(int a, int b)
        {
            int sum = a + b;
            return sum;
        }
        //minusrechnungsfunktion noch unbenutzt
        static int minus(int a, int b)
        {
            int sum = a - b;
            return sum;
        }

        //malrechnungsfunktion noch unbenutzt
        static int mal(int a, int b)
        {
            int sum = a * b;
            return sum;
        }

        //teilenfunktion noch unbenutzt
        static int teilen(int a, int b)
        {
            int sum = a / b;
            return sum;
        }

        static void Main(string[] args)
        {
            //Variablen:
            string eingabe = ""; //wird zum rechnen benutzt
            //wird nicht angezeigt, falls das Programm zurückspringt
            Console.WriteLine("Taschenrechner.exe \nVersion: Test \nMady by David N. \n \nDrücke eine belibiege Taste zum Starten.");
            Console.Read();
            Top:
            Console.WriteLine("Hallo");
            Console.Read();

        }
    }
}

Aber das Console.Read(); wird einfach ignoriert und die Konsole wird beendet Noidea Noidea

mach mal Console.ReadKey();

und wofür ist das Top: ?

JensMan :
mach mal Console.ReadKey();

und wofür ist das Top: ?


Top ist ein Label, er will wahrscheinlich mit GOTO wieder nach oben springen wenn eine Rechenoperation fertig ist.

Besser wäre da aber ein Endlosschleife mit while(true)

Danke an Lett1 ,dass er sich mit Noobs wie mir rumärgert Big Grin
Der funktionierende Code sieht nun so aus:

Code:
using System;


namespace test1
{
    class Program
    {

        //plusrechnungsfunktion
        static int plus(int a, int b)
        {
            return a + b;
        }
        //minusrechnungsfunktion noch unbenutzt
        static int minus(int a, int b)
        {
            return a - b;
        }

        //malrechnungsfunktion noch unbenutzt
        static int mal(int a, int b)
        {
            return a * b;
        }

        //teilenfunktion noch unbenutzt
        static int teilen(int a, int b)
        {
            return a / b;
        }

        /// <summary>
        /// Die Main funktion
        /// </summary>
        /// <param name="args">argumente hurr</param>
        static void Main(string[] args)
        {
            string eingabe = ""; //wird zum rechnen benutzt
            //wird nicht angezeigt, falls das Programm zurückspringt
            Console.WriteLine("Taschenrechner.exe \nVersion: Test \nMady by David N. \n \nDrücke eine belibiege Taste zum Starten.");
            Console.ReadLine();
            Top:
            Console.WriteLine("Hallo");
            Console.ReadLine();
        }
    }
}

Referenz-URLs