Seite 1 von 1

Fehler im Programm.

Verfasst: Fr Mai 18, 2012 6:13 pm
von canlot
Ich habe eine Hausaufgabe bekommen ein Programm zu programmieren.
Es geht darum zwei Klassen zu erstellen eine Kamel Klasse und eine Karawane Klasse. Die Karawane Klasse kann dann Kamel hinzufügen löschen und weitere Funktionen durchführen. Wenn die das Programm mit den fertigen Klassen kompiliere dann funktioniert alles. Wenn ich jedoch das Programm teste kriege ich folgende Fehlermeldung:

Code: Alles auswählen

System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
   bei Kamel.Caravan.pace() in c:\Users\Jakob\Documents\SharpDevelop Projects\Kamelle\Kamelle\Program.cs:Zeile 69.
   bei Kamel.Program.Main(String[] args) in c:\Users\Jakob\Documents\SharpDevelop Projects\Kamelle\Kamelle\Program.cs:Zeile 134.

mein Code:

Code: Alles auswählen

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

namespace Kamel
{
    class Camel
    {
        private int maxspace = 0;
        private int load = 0;
        private Camel next;

        public Camel(int mp)
        {
            maxspace = mp;
            load = 0;
        }
        public int maxPace()
        {
            return maxspace;
        }
        public int pace()
        {
            return maxspace - load;
        }
        public void setLoad(int i)
        {
            if(i>0) 
            load = i;
        }
        public void addLoad()
        {
            load++;
        }
        public int getLoad()
        {
            return load;
        }
        public void setNext(Camel c)
        {   
            if(c == null)
            next = c;
        }
        public Camel getNext()
        {
            if (next == null)
                return null;
            return next;
        }
        
    }
    class Caravan
    {
        private Camel first;
        private Camel current;
        private Camel last;
        public Caravan()
        {
        }
        public int pace()
        {
            int temp = 0;
            Camel das = first;
            temp = das.pace();
            while (das != last)
            {

                if (temp > das.pace())
                    temp = das.pace();
                das = das.getNext();
            }
            return temp;
        }
        public void addCamel(Camel c)
        {
            if (first == null)
                first = c;
            last = c;
            if (current == null)
                current = c;
            else
            {
                current.setNext(c);
                current = c;
            }
        }
        public void removeCamel(Camel c)
        {
            Camel das = first;
            while (das != c)
            {
                das = das.getNext();
            }
            Camel temp = das;
            das = das.getNext();
            das = das.getNext();
            temp.setNext(das);
        }
        public void unload()
        {
            Camel das = first;
            while (das != last)
            {
                das.setLoad(0);
                das = das.getNext();
            }
        }
        public void addload()
        {
        	Camel once = first;
        	Camel nix = first;
        	while(once != first)
        	{
        		once = once.getNext();
        		if(nix.pace() < once.pace())
        			nix = once;
        	}
        	nix.addLoad();
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
        	Camel wasweis = new Camel(8);
        	Camel lol = new Camel(6);
        	Camel baba = new Camel(10);
        	Caravan meins = new Caravan();
        	meins.addCamel(wasweis);
        	meins.addCamel(lol);
        	meins.addCamel(baba);
        	Console.WriteLine("{0}",meins.pace());
        	Console.ReadKey();
        }
    }
}
Ich benutze SharpDevelop da ich das fette Visual Studio nicht installieren möchte aber daran kanns nicht liegen.
Ich hoffe jemand kann mir helfen.

Re: Fehler im Programm.

Verfasst: Fr Mai 18, 2012 6:21 pm
von Xin
Es wäre schön, wenn Du die Fehlermeldungen im Code kennzeichnest.

Aber schauen wir mal: Du machst eine Klasse "Caravan", der Construktor initialisiert first nicht. In pace() wird der vermutlich weiterhin uninitialisierte "first" (also eine Nullreferenz) auf "das" kopiert. Anschließend wird das.pace() aufgerufen.

Schau Dir mal die Funktion setNext an... ob die tut, was Du willst. Ich vermute hier hakt es.

Re: Fehler im Programm.

Verfasst: Fr Mai 18, 2012 6:27 pm
von cloidnerux
Nope, es funktioniet alles wie es soll, nur an einer stelle soll es anders als gewollt:

Code: Alles auswählen

public int pace()
        {
            int temp = 0;
            Camel das = first;
            temp = das.pace();
            while (das != last)
            {

                if (temp > das.pace())
                    temp = das.pace();
                das = das.getNext();
            }
            return temp;
        }
Hier bricht das nach dem 2 Durchlauf ab(getestet mit VS 2010 Professional), weil durch die Zuweisung von das = das.getNext() null in das geschrieben wird, wobei die Funktion viel zu umständlich ist:

Code: Alles auswählen

public Camel getNext()
        {
            if (next == null)
                return null;
            return next;
        }
es würde hier reichen, nur next zurückzugeben.

Der Fehler erreicht dann seine Destruktive Wirkung an der stelle:

Code: Alles auswählen

public void addCamel(Camel c)
        {
            if (first == null)
                first = c;
            last = c;
            if (current == null)
                current = c;
            else
            {
                current.setNext(c);
                current = c;
            }
        }
Das deinem ersten Kamel kein nächstes zugeordnet wird und dann nach dem ersten Durchlauf deiner while mal eben null steht.
Was mir hierbei auffählt, ist dass du eine nicht stringente Sortierung hast, alles fliegt wild durcheinander und du versuchst über die Klassen an sich eine Liste aufzubauen, wovon ich abraten würde, da du bei mehr als 3 Kamelen erstmal unsichtbare klassen hast, die nur von einer anderen Klasse selben Typs bekannt sind. Wird eins davon zerstört, werden da irgendwann Kamele fehlen. Sinnvoller ist die Verwendung der C# Standard Auflistungen wie list<>.

Re: Fehler im Programm.

Verfasst: Fr Mai 18, 2012 7:41 pm
von Xin
Implementiere Deine eigene Liste.

list<> sollte man meiner Meinung nach erst benutzen, wenn eine Liste selbst schreiben kann und das hakt nunmal in den ersten Versuchen gerne mal.

Re: Fehler im Programm.

Verfasst: Fr Mai 18, 2012 8:16 pm
von canlot
Wir dürfen das leider (noch) nicht mit Listen machen.

Re: Fehler im Programm.

Verfasst: Fr Mai 18, 2012 8:22 pm
von canlot
Danke @cloidnerux jetzt sehe ich meinen Fehler auch.

Re: Fehler im Programm.

Verfasst: Fr Mai 18, 2012 11:26 pm
von canlot
Xin hat geschrieben: Schau Dir mal die Funktion setNext an... ob die tut, was Du willst. Ich vermute hier hakt es.
Du hattest Recht. Das Programm funktioniert ;)
Danke.
@cloidnerux das waren doch nicht die Fehler.

Re: Fehler im Programm.

Verfasst: Sa Mai 19, 2012 12:35 pm
von cloidnerux
@cloidnerux das waren doch nicht die Fehler.
Debugging ist schwierig^^
Aber es hatte was mit der Verknüpfung deiner Kamele zu tun...

Re: Fehler im Programm.

Verfasst: So Mai 27, 2012 8:46 am
von oenone
Du solltest dir nochmal überlegen, warum du manchmal "Space" und manchmal "Pace" benutzt. Die beiden Worte haben nämlich eine unterschiedliche Bedeutung. Space = Platz, Pace = Geschwindigkeit. Ist der Wert jetzt wieviel ein Kamel tragen kann oder wie schnell ein Kamel laufen kann?

Re: Fehler im Programm.

Verfasst: So Mai 27, 2012 2:07 pm
von canlot
Je der Bedeutung nach denke ich :P Das war eine Aufgabe und wir hatten alles vorgegeben gehabt auch die Namen der Attribute und Methoden. Hab da jetzt alles so gelassen wie es war. Macht vielleicht nicht so viel Sinn aber ist sowieso nur ein kurzes Programm und nicht meine Idee.