Fehler im Programm.

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Fehler im Programm.

Beitrag von canlot » Fr Mai 18, 2012 6:13 pm

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.
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehler im Programm.

Beitrag von Xin » Fr Mai 18, 2012 6:21 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehler im Programm.

Beitrag von cloidnerux » Fr Mai 18, 2012 6:27 pm

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<>.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehler im Programm.

Beitrag von Xin » Fr Mai 18, 2012 7:41 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Fehler im Programm.

Beitrag von canlot » Fr Mai 18, 2012 8:16 pm

Wir dürfen das leider (noch) nicht mit Listen machen.
Unwissenheit ist ein Segen

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Fehler im Programm.

Beitrag von canlot » Fr Mai 18, 2012 8:22 pm

Danke @cloidnerux jetzt sehe ich meinen Fehler auch.
Unwissenheit ist ein Segen

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Fehler im Programm.

Beitrag von canlot » Fr Mai 18, 2012 11:26 pm

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.
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehler im Programm.

Beitrag von cloidnerux » Sa Mai 19, 2012 12:35 pm

@cloidnerux das waren doch nicht die Fehler.
Debugging ist schwierig^^
Aber es hatte was mit der Verknüpfung deiner Kamele zu tun...
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Fehler im Programm.

Beitrag von oenone » So Mai 27, 2012 8:46 am

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?

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Fehler im Programm.

Beitrag von canlot » So Mai 27, 2012 2:07 pm

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.
Unwissenheit ist ein Segen

Antworten