Avatar billede plugin- Nybegynder
20. april 2005 - 09:41 Der er 8 kommentarer og
2 løsninger

brug af for-løkke og collections.ArrayList ?

Hej Eksperter!

Jeg er helt ny til C#, men har valgt at kaste mig direkte ud i et lille selvvalgt programmeringsprojekt for at få lidt mere viden om sproget. Det er så her jeg er stødt ind i det her problem. Min kode ser ud som følgende:

using System;
using System.Collections;

namespace rainbowsimple
{
   
    public class Room
    {
        //private felter
        private int _roomid;
        private int _nwall;
        private int _swall;
        private int _ewall;
        private int _wwall;
       
        //indkapsling
        public int roomid
        {
            get { return _roomid; }   
        }
       
        public int nwall
        {
            get { return _nwall; }   
        }
       
        public int swall
        {
            get { return _swall; }   
        }
       
        public int ewall
        {
            get { return _ewall; }   
        }
       
        public int wwall
        {
            get { return _wwall; }   
        }
       
        //constructor for room-klassen
        public Room(int idofroom, int roominnwall, int roominswall, int roominewall, int roominwwall)
        {
            _roomid = idofroom;
            _nwall = roominnwall;
            _swall = roominswall;
            _ewall = roominewall;
            _wwall = roominwwall;
        }
    }
   
    public class Building
    {
        //private felter
        private int _rooms;
        private ArrayList _Allrooms;
       
        //indkapsling
        public int rooms
        {
            get { return _rooms; }   
        }
       
       
        public Building(int nrofrooms)
        {
            _rooms = nrofrooms;
           
           
            for (int i=1; i<=_rooms; i++)
            {
       
                _Allrooms = new ArrayList();
                _Allrooms.Add(new Room(i, 0, 0, 2, 10));
                Room myRoom = (Room)_Allrooms[i];
                Console.WriteLine(Convert.ToString(myRoom.roomid));
                //Console.Write("Her tælles der {0} ", _Allrooms.Count);
            }
           
        }
    }
   
    public class MainClass
    {
        //private int _nrofrooms;
       
        public static void Main(string[] args)
        {
            //henter input fra bruger til feltet _rooms
            Console.Write("Hvor mange rum ønskes der i bygningen? : ");
            string _input = Console.ReadLine();
            int _nrofrooms = System.Int32.Parse(_input);
            Building Førstebygning = new Building(_nrofrooms);
            Console.WriteLine("Der oprettes {0} rum i bygningen", Førstebygning.rooms);
        }
    }
}

I koden har jeg 2 klasser, henholdsvis en rum-klasse og en bygnings-klasse. Når jeg så vil lave et obejkt udfra bygnings klassen skal den fremstille en række obejkter af rum-klassen vha. en for-løkke og placere dem i et Array.. Ved kompiling af koden opstår der ingen fejl eller advarelser, men når jeg så forsøger at kører applikationen kan jeg godt skrive ind hvor mange obejcter jeg vil have den til at lave af rum-klassen, men når jeg trykker enter, kommer følgende fejlmeddelse i en winbox:

Application has generated an exception that could not be handled.

Og i console står der så følgende:

Hvor mange rum onskes der i bygningen? : 9

Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range.
  Must be non-negative and less than the size of the collection.
Parameter name: index
  at System.Collections.ArrayList.get_Item(Int32 index)
  at rainbowsimple.Building..ctor(Int32 nrofrooms) in d:\Documents\c-sharp\stra
tegi spil\rainbowsimple\Main.cs:line 84
  at rainbowsimple.MainClass.Main(String[] args) in d:\Documents\c-sharp\strate
gi spil\rainbowsimple\Main.cs:line 102
Press any key to continue . . .

Endvidere hvis jeg prøver at lave en Count på mit ArrayList, finder den kun et obejct i Listen, hvilket jo ikke skulle passe...

Hvordan kan jeg få det til at kører som jeg vil have det? Har I nogen forslag? Kommentarer til selve koden er også meget velkommen, da jeg jo er ny i sproget og gerne vil blive bedre til at strukturer m.m.
Avatar billede the_party_dog Nybegynder
20. april 2005 - 09:45 #1
Du skal vel ikke oprette en arraylist hver eneste gang din løkke i din bygnings klasse kører? Det var lige det som faldt mig i øjnene....
Avatar billede arne_v Ekspert
20. april 2005 - 09:46 #2
Et hurtigt gæt ville være at


            for (int i=1; i<=_rooms; i++)

skulle være


            for (int i=0; i<_rooms; i++)
Avatar billede nielle Nybegynder
20. april 2005 - 09:50 #3
public Building(int nrofrooms)
        {
            _rooms = nrofrooms;
           
            _Allrooms = new ArrayList();
            for (int i=0; i<_rooms; i++)
            { 
                _Allrooms.Add(new Room(i, 0, 0, 2, 10));
                Room myRoom = (Room)_Allrooms[i];
                Console.WriteLine(Convert.ToString(myRoom.roomid));
                //Console.Write("Her tælles der {0} ", _Allrooms.Count);
            }
           
        }
Avatar billede nielle Nybegynder
20. april 2005 - 09:55 #4
2 fejl:

Du initialiserede din _Allrooms inde l løkken, og så gok don for-løkke fra 1 istedet for fra 0; Arrays i C# er 0-indekseret.
Avatar billede nielle Nybegynder
20. april 2005 - 09:56 #5
Gid man kunne redigere:

Du initialiserede din _Allrooms inde i løkken, og så gik din for-løkke fra 1 istedet for fra 0; Arrays i C# er 0-indekseret.
Avatar billede plugin- Nybegynder
20. april 2005 - 10:19 #6
Hold da op! troede ikke man fik svar så hurtigt herinde ;D kan se at det har været for-løkken med start i 1 der har lavet rod i det... sikke dog en dum fejl! arne_v og nielle MANGE tak for hjælpen.. smid et svar og I får points.
Avatar billede nielle Nybegynder
20. april 2005 - 10:30 #7
Ok, men jeg synes nu at 200 points er alt for meget til et spørgsmål af denne sværhedsgrad. 15 ville have været mere passende; Der skulle helst ikke gå inflation i pointsystemt.
Avatar billede plugin- Nybegynder
20. april 2005 - 10:37 #8
nu er jeg som sagt ny.. og for mig virkede dette spørgsmål jo som værende af en vis sværhedsgrad... men efter I er kommet med løsningen kan jeg jo godt se at det var der egentlig ikke noget i... lige gyldigt hvad så var I ihvertfald hurtige til at svarer så det fortjener lidt ekstra points... håber arne_v svarer snart så I kan dele de 200 points
Avatar billede arne_v Ekspert
20. april 2005 - 10:38 #9
svar

(og enig i at 200 point er lidt voldsomt i forhold til problemet)
Avatar billede plugin- Nybegynder
20. april 2005 - 10:44 #10
Sådan ;) i mit næste spørgsmål (som uden tvivl vil komme) skal jeg prøve at balancere pointmængden bedre...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester