Permalänk

instance of an object

Hellu gänget!
Är nybörjare inom programmering. C#

Har ett problem när jag försöker komma åt en klass som jag skapat. Får som felmeddelade: System.NullReferenceException: 'Object reference not set to an instance of an object.'

Jobbar med den välkände ''Bussen'' och har svårt för att komma in i det här med OOP och hur man knyter an till klasser.
Om någon snäll själ kanske kan förklara och hjälpa mig lite så vore det tacksamt.

Ha de gott / Glenn

Permalänk
Medlem

Du måste visa din kod om du ska få någon vettig hjälp. Använd gärna code-taggar när du klistrar in kod, d.v.s. [code]Kod här[/code] (jag nämner det bara för att forumet fortfarande inte har någon knapp för det, och kod blir väldigt svår att läsa annars).

Permalänk
Medlem

Bra fråga, omöjligt att säga utan någon kod.

Permalänk
Medlem

Nu är jag själv amatör men lägg upp koden vet jag! blir lättare att hjälpa då. många här på forumet är duktiga på sådant också

Permalänk
Medlem

Försök att lura din hjärna att tänka på klasser skilda från objekt genom att programmera något där du redan tänker på det sättet. Gör en klass som heter tårtrecept och .instantiera ett objekt som heter t ex princesstårta

Permalänk

.

Permalänk
Medlem

Problemet är att den här raden:

public Passagerare[] passagerare = new Passagerare[5];

skapar en array med plats för 5 Passagerare, men alla element i arrayen kommer vara null innan du lagt in några passagerare. D.v.s. arrayen har 5 tomma platser, och när du försöker använda någon av de tomma platserna som en passagerare så blir det fel.

Men det verkliga problemet är att du likt de flesta som gör denna uppgift inte använder antalPassagerare-variabeln. passagerare.Length kommer ju alltid vara 5 eftersom storleken på arrayen inte ändras, så du måste själv hålla reda på hur många platser du faktiskt fyllt med passagerare.

Permalänk
Skrivet av perost:

Problemet är att den här raden:

public Passagerare[] passagerare = new Passagerare[5];

skapar en array med plats för 5 Passagerare, men alla element i arrayen kommer vara null innan du lagt in några passagerare. D.v.s. arrayen har 5 tomma platser, och när du försöker använda någon av de tomma platserna som en passagerare så blir det fel.

Men det verkliga problemet är att du likt de flesta som gör denna uppgift inte använder antalPassagerare-variabeln. passagerare.Length kommer ju alltid vara 5 eftersom storleken på arrayen inte ändras, så du måste själv hålla reda på hur många platser du faktiskt fyllt med passagerare.

Tack för svar. Får nog utesluta OOP och nöjja mig med C.
har suttit med uppgiften i 4 dagar och håller på o bli galen, min hjärna kopplar inte detta ännu.
Tacksam för svar iallafall, ha de gott.

Permalänk
Hedersmedlem
Skrivet av GlennFromGbg:

Tack för svar. Får nog utesluta OOP och nöjja mig med C.
har suttit med uppgiften i 4 dagar och håller på o bli galen, min hjärna kopplar inte detta ännu.
Tacksam för svar iallafall, ha de gott.

Samma problem finns ju i C.

#include <stdio.h> #include <stdlib.h> struct X { int a; }; int main() { struct X **lista = malloc(sizeof(struct X*) * 5); lista[0]->a = 10; printf("Värde: %d\n", lista[0]->a); return 0; }

lista[0] är giltig att komma åt eftersom vi allokerat minne till lista, men värdet är null (eller ev. icke-initialiserat, beror nog på libc), så du kan inte använda -> på den, utan du måste allokera minne till varje element av listan också.

Permalänk
Medlem
Skrivet av GlennFromGbg:

Tack för svar. Får nog utesluta OOP och nöjja mig med C.

Det har inget med OOP att göra, du får samma fel i C förutom att C inte talar om för dig att du gjort fel:

#include <stdlib.h> #include <stdio.h> struct Passagerare { char *gender; int age; char *name; }; int main() { struct Passagerare *passagerare = malloc(5 * sizeof(struct Passagerare)); for (int i = 0; i < 5; ++i) { if (passagerare[i].age != 0) { printf("Passagerare %d är %d år gammal\n", i+1, passagerare[i].age); } else { printf("Plats %d är ledig\n", passagerare[i].age); } } free(passagerare); return 0; }

Om jag kör detta program så får jag utskriften:

Passagerare 1 är -119351272 år gammal Passagerare 2 är 0 år gammal Passagerare 3 är 0 år gammal Passagerare 4 är 0 år gammal Passagerare 5 är 0 år gammal

Felet är samma här, jag har skapat en array med 5 element men inte fyllt den med något. Så när jag försöker skriva ut alla 5 platser så får jag bara skräp ut.

I C# har du fördelen att elementen i arrayen åtminstone kommer vara null tills du fyllt dem med något, så du kan kolla om en plats är fylld eller inte. Om du faktiskt vill skriva ut vilka platser som är tomma också så kan du fortsätta loopa som du gör i utskriftsfunktionen, men du måste kolla om passageraren är null och inte om dess ålder är 0 (eftersom det inte går att kolla åldern på en passagerare som inte existerar).

Permalänk

Tack för svaren.
Nu var jag ganska otydlig men jag syftade på betyget C då där inte krävdes en KLASS av passagerare för att klara uppgiften.

Permalänk
Medlem
Skrivet av GlennFromGbg:

Tack för svaren.
Nu var jag ganska otydlig men jag syftade på betyget C då där inte krävdes en KLASS av passagerare för att klara uppgiften.

Kanske dags att börja programmera C i stället då, du har rätt inställning till OOP för det

Men hur som helst så är det som sagt inte OOP du har problem med utan hur du använder din array. D.v.s. i början så kommer din array se ut så här:

{null, null, null, null, null}

Efter att du lagt in en passagerare så blir det t.ex.:

{Passagare("man", 17, "Ove"), null, null, null, null}

O.s.v.

Jag skulle rekommendera dig att fortsätta kämpa med den här uppgiften, det är ganska grundläggande saker som du ändå snart kommer behöva kunna om du ska ta dig vidare i kursen.

Permalänk
Medlem

Problemet är att du använder "passagerare.Length". Denna är alltid 5 även när arrayen bara innehåller 5st null.

Byt ut:

for (int i = 0; i < passagerare.Length; i++)

mot

for (int i = 0; i < antalPassagerare; i++)

Då kommer loopen bara gå över de passagerare du faktiskt lagt till.

Alla index/platser som är större eller lika med antalPassagerare är lediga.

---

Alternativt så kan du byta ut din if-sats så den kollar om platsen är null

if (passagerare[i].Ålder != 0)

mot

if (passagerare[i] != null)