Jeg får følgende fejl på kodestumpen return sp[r.Next(sp.Length)]; Hvad skal ændres?
class Question { string q ; static Question[] sp;
public Question() { }
public Question(string q) { this.q = q; sp = new Question[3]; }
public static void InitializeArray() { sp[0] =new Question("Hvad hedder hovedstaden i Ungarn?"); sp[1] = new Question("Hvem vandt Tour de France i 2006?"); sp[2] = new Question("Hvilken planet er tættest på solen?"); }
static Random r = new Random();
public Question DrawRandom() { return sp[r.Next(sp.Length)]; }
public Question DrawRandom() { Random RandomClass = new Random(); // int RandomNumber = RandomClass.Next(sp.Length-1); int RandomNumber = RandomClass.Next(); Console.WriteLine("Hejsa" + RandomNumber); return sp[RandomNumber]; }
Men stadig med kommentaren: Object reference not set to an instance of an object.Men nu på koden: return sp[RandomNumber];
Det prøvede jeg først, men den kommer ikke længere ind til : int RandomNumber = RandomClass.Next(sp.Length-1);
med kommentaren: Object reference not set to an instance of an object.
så den skriver ikke noget ud.
Det er som om objektet er null. Er det fordi det ikke er nok at skrive.
string q ; static Question[] sp;
public Question() { }
public Question(string q) { this.q = q; sp = new Question[3]; }
public static void InitializeArray() { sp[0] =new Question("Hvad hedder hovedstaden i Ungarn?"); sp[1] = new Question("Hvem vandt Tour de France i 2006?"); sp[2] = new Question("Hvilken planet er tættest på solen?"); }
public Question(string q) { this.q = q; sp = new Question[3]; }
public static void InitializeArray() { sp[0] =new Question("Hvad hedder hovedstaden i Ungarn?"); sp[1] = new Question("Hvem vandt Tour de France i 2006?"); sp[2] = new Question("Hvilken planet er tættest på solen?"); }
// static Random r = new Random();
public Question DrawRandom() { Random RandomClass = new Random(); int RandomNumber = RandomClass.Next(sp.Length-1); // int RandomNumber = RandomClass.Next(3); Console.WriteLine("Hejsa" + RandomNumber); return sp[RandomNumber]; }
public void HentSpørgsmål() { Question sp = DrawRandom(); Console.WriteLine(sp);
} }
public partial class Form1 : Form { Question question;
public Form1() { question = new Question(); InitializeComponent(); question.DrawRandom(); // question.HentSpørgsmål(); } }
Ikke dårlig ide :-) Jeg har prøvet at lade både public Question DrawRandom() og public void HentSpørgsmål() kalde public static void InitializeArray(), men det får jeg ikke noget ud af der er stadig en null ref. til return sp[RandomNumber]; Er det ikke forkert at InitializeArray() ikke har en returværdi, for hvis man kalder InitializeArray(), opretter den blot spørgsmålene, men bliver de gemt?? Hvis de automatisk blev lagt ind i sp, så skulle det jo virke??
public static void InitializeArray() { sp = new Question[3]; sp[0] =new Question("Hvad hedder hovedstaden i Ungarn?"); sp[1] = new Question("Hvem vandt Tour de France i 2006?"); sp[2] = new Question("Hvilken planet er tættest på solen?"); }
Hvad får man ud af at kalde InitializeArray()? Man får jo ikke noget retur fra metoden, og problemet er, at man kan ikke få fat i nogle af spørgsmålene.
Lige nu ser koden sådan her ud. Den kan kompilere men der kommer ikke noget output:
class Question { string q ; static Question[] sp;
public Question(string q) { this.q = q; }
public static void InitializeArray() { sp = new Question[3]; sp[0] = new Question("Hvad hedder hovedstaden i Ungarn?"); sp[1] = new Question("Hvem vandt Tour de France i 2006?"); sp[2] = new Question("Hvilken planet er tættest på solen?");
}
public Question DrawRandom() { Random RandomClass = new Random(); int RandomNumber = RandomClass.Next(3); InitializeArray(); Question sp1 = sp[RandomNumber]; return sp1; }
Problemet er at du initialisere noget static fra din non static Constructor... det vil gå galt...
samtidig bør din DrawRandom også være static rent logisk, for den arbejder ikke på en instans af objectet men på type instansen... så der er som kalp siger lidt mix op...
Det første er at du skal konvertere det der skal vær estatic til static, som jeg sagde i den tidligere tråd så var lagringen af spm osv. forker osv. men demonstrationen af spm stod... men du har fået rodet lidt rundt i hvad der skulle være static og hvad der ikke skulle være static godt og grundigt i forhold til det ex jeg gav dig...
So here goes... håber du får mere ud af det:
using System; using System.Collections.Generic; using System.Text;
namespace MyNamespace { class Program { static void Main( string[] args ) { QuestionCollection qcol = QuestionCollection.CreateCollection();
Console.WriteLine( "List all Questions:" ); foreach ( Question q in qcol ) Console.WriteLine( q );
Console.WriteLine(); Console.WriteLine( "Draw randoms until user exits:" );
class QuestionCollection : IEnumerable<Question> { private static Random Rand = new Random(); private List<Question> _innerList;
public QuestionCollection() { this._innerList = new List<Question>(); }
public static QuestionCollection CreateCollection() { QuestionCollection qcol = new QuestionCollection(); qcol.AddQuestion( "Hvad er dette kodet i?", "C#" ); qcol.AddQuestion( "Hvorfor er det kodet?", "For at hjælpe qiendr" ); qcol.AddQuestion( "Hvem har kodet det først?", "md_craig" ); return qcol; }
public void AddQuestion( string question, string awnser ) { if ( this.ContainsQuestion( question ) ) return; //Altarnatict kast en exception for at indikere at spørgsmålet allerede eksisterede. this._innerList.Add( new Question( question, awnser ) ); }
public string GetAwnser( string question ) { if ( !this.ContainsQuestion( question ) ) return "N/A"; //Altarnatict kast en exception for at indikere at spørgsmålet allerede eksisterede.
foreach ( Question q in this._innerList ) { if ( q.QuestionString == question ) return q.Awnser; }
Det var en ordentlig mundfuld. måske lige i overkanten, for jeg prøvet gøre det så simpelt som muligt i første omgang, til jeg får bedre styr på programmeringen. Som du kan se burde det være ret enkelt det jeg prøver lave, óg jeg er ikke nogen haj - obviously - så jeg har bare brug for at vide, hvordan jeg i min kode kan få fat i spørgsmålene, så jeg prøver lige at se på static non static som du skrev.
using System; using System.Collections.Generic; using System.Text;
namespace MyNamespace { class Program { static void Main( string[] args ) { QuestionCollection qcol = new QuestionCollection(); qcol.AddQuestion( "Hvad er dette kodet i?", "C#" ); qcol.AddQuestion( "Hvorfor er det kodet?", "For at hjælpe qiendr" ); qcol.AddQuestion( "Hvem har kodet det først?", "md_craig" ); Console.WriteLine( "Draw randoms until user exits:" );
Det mangler jo så en del af de ting man bør gøre, og burde kunne... men det må vi jo så prøve at bygge på langsomt så du forstår det...
Overstående indeholder som du nok kan se 3 klasser, Klassen Program skal du ikke spekulere så meget over nu og her, da du vil bruge det med en form, så du bare bruge det der står inden i main metoden et passende sted i din form istedet... fx der hvor du allerede initializere...
public partial class Form1 : Form { QuestionCollection question;
public Form1() { question = new QuestionCollection(); qcol.AddQuestion( "Hvad er dette kodet i?", "C#" ); qcol.AddQuestion( "Hvorfor er det kodet?", "For at hjælpe qiendr" ); qcol.AddQuestion( "Hvem har kodet det først?", "md_craig" );
Fordi vi har lavet vores egen "ToString" metode på klassen Question, kan de netop lade sig gøre at parse den til Console.WriteLine unden at gøre andet.
Sorry for de mange post her til sidst desuden... kom til at trykke på send et par gange...
Jeg prøver at kigge på det. Jeg tror problemet ligger i, at jeg ikke ved hvordan jeg i min kode skal få fat i et random spørgsmål fra min liste over spørgsmål som oven i købet er fundet random, så mit overblik forsvinder lidt når det er hel ny kode der bliver lavet, i stedet for at arbejde videre på den jeg har siddet og arbejdet på hele dagen. Men jeg prøver at overføre logikken fra den "nye" kode til den "gamle".
Ja, men det man kan sige det er at det nye kode IMO burde bære mere logisk da du har opdelt det ordenligt nu, dvs at klassen Question ikke længere både holder et enkelt spørgsmål, og en hel række spørgsmål...
Istedet har du nu en klasse der håndtere et fysisk spørgsmål... (Et kort i en blandet bunke fx, hvis du forestiller dig du har en bunke kort med spørgsmål fysisk i den virkelige verden hvor der på kortet står spørgsmål samt svar)...
Når man så: new Question( question, awnser ) ...
Så laver du et nyt af disse kort... Det er altså ÉT kort kun... QuestionCollection er så hele din bunke af kort... fx har du 3 kort nu.
Metoden AddQuestion svare her til at du tager et nyt stykke papir, skriver dit spørgsmål og svar på og ligger det ind i denne bunke. igen set som perspektiv til den virkelige verden...
Vi laver her 3 kort fx og ligger dem i en bunke. DrawRandom svarer til at du tager et tilfældigt kort i din stak. tager det ud og kigger på det... og så ligger vi det tilbage på dets plads igen (det er ikke helt det der sker i programeringens verden, men det giver dig måske et bedre billede af tingene)
lad os kigge på denne metode:
public void AddQuestion( string question, string awnser ) { this._innerList.Add( new Question( question, awnser ) ); }
lad so pensle den lidt ud:
public void AddQuestion( string question, string awnser ) { //Vi laver først et nyt spørgsmål, og vi skriver spørgmålet og svaret som vi ville have gjort på et kort. Question q = new Question( question, awnser );
//Efter vi har lavet spørgsmålet ligger vi det over i stakken af vores spørgsmål. this._innerList.Add( q ); }
vi prøver mer 6 spørgsmål:
question = new QuestionCollection(); //Nu har vi en tom stak, der er altså ingen spørgsmål.
qcol.AddQuestion( "Hvad er dette kodet i?", "C#" ); //Nu har vi lavet et spørgsmål og lagt det i stakken, så er der ialt 1 spm
qcol.AddQuestion( "Hvorfor er det kodet?", "For at hjælpe qiendr" ); //Nu har vi lavet et spørgsmål og lagt det i stakken, så er der ialt 2 spm
qcol.AddQuestion( "Hvem har kodet det først?", "md_craig" ); //Nu har vi lavet et spørgsmål og lagt det i stakken, så er der ialt 3 spm
qcol.AddQuestion( "Hvor bor vi henne?", "Danmark" ); //Nu har vi lavet et spørgsmål og lagt det i stakken, så er der ialt 4 spm
qcol.AddQuestion( "Hvad er den største mønt?", "en 20 krone" ); //Nu har vi lavet et spørgsmål og lagt det i stakken, så er der ialt 5 spm
qcol.AddQuestion( "Hvor mange timer er der i et døgn?", "24" ); //Nu har vi lavet et spørgsmål og lagt det i stakken, så er der ialt 6 spm
Ok nu har vi fx istedet taget og gjort det 6 gange isstedet... så nu har vi altså en stak med 6 kort, som vi har lagt i en stak.
Da vi nu har 6 kort svarer det 100% til at du kan tage en tærning og slå med den, og så trækker du kortnummer svarende til det tærningen viser. slår vi en 3'er trækker vi kort nummer 3 ud osv... grunden til jeg lige gør det således er fårdi vi nu evealuere denne metode:
public Question DrawRandom() { //Vi slår med tærningen og kigger på hvor mange øjne den viser int ojne = Rand.Next( 0, _innerList.Count );
//Vi trækker kortet der ligger på den plads som svarer til tærningens værdi. return _innerList[ ojne ]; }
Det kan godt være dette virker meget pedagogisk og for nogle vil man måske mene at det måske er lige for meget, som om man snakker til en 5 årrig... men nogle gange kan det være rart for det første lige at pensle tingene lidt ud, det er det der er gjort ved jeg lige har delt det lidt op hvad der sker i metoderne, så det er mere pedagogisk. en anden ting er at jeg har prøvet at relatere det til den virkelige verden. som for nogle igen er en god ting når man skal lærer at forstå, da det pluselig bliver mere håndgribeligt... et sted hvor vi ligsom alle kan være med, for vi forstå jo nok alle sammen den der med at tage et stykke papir, skrive et spørgsmål og et svar på, og lige det over i en bunke, tage en nyt stykke papir og gentage processen...
Og det er nemlig lige præsis det der foregår i koden.
Så jeg håber det hjælper lidt og at du ikke kommer til at tænke "Tror han jeg er helt retaderet"...
Super nu virker det og jeg har forstået. Det er åbenbart nemmere med ArrayList end Array[], og måske var problemet også, at spørgsmålene aldrig skulle have været initialiseret i en metode (InitializeArray())?? Eller var det forsi der ikke var lavet en override ToString metode iden gamle kode?
Nu er der kun 1 problem, hvordan får jeg parsed et Question til en string ved :
Det kan være fint med pædagogiske forklaringer somme tider...men jeg er ok til at forstå kode, men knap så rutineret til selv at kunne lave om de mere avancerede ting.
Jeg har brugt den nye kode, så jeg brugte ToString - men det mærkelige er at jeg kun får svaret og ikke spørgsmålet???:
Selv om du kan forstå kode, kan paralleller til virkeligheden stadig være yderst nyttigt... Det er jo typisk noget fra virkeligheden vi forsøger at komme ind i computeren alligevel...
Så selv om jeg måske efterhånden har en del års erfaring bag mig, bruger jeg stadig meget det at visualisere min kode... så jeg mener det i høj grad er en stor del af programmering at man er i stand til det...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.