Entwickler-Ecke

Basistechnologien - Variableninhal als Klasseninstanzmame benutzen?!


Special-Agent-J - So 23.05.10 10:39
Titel: Variableninhal als Klasseninstanzmame benutzen?!
ok ich würde gern folgendes machen, da ich eine unbestimmte anzahl von klasseninstanzen habe würde ich dafür bei jedem schleifendurchlauf eine neue instanz erstellen, aber ich bekomme es nicht hin eine Variable anstelle des Instanznamen zu setzten, also folgendes Beispiel:


C#-Quelltext
1:
2:
3:
4:
5:
while(dic < 500(unbestimmte zahl))
{
Schiff dic(hier soll der Variableninhalt hin) = new Schiff("Ha'tak",Maus.X, Maus.Y);
dic++
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am So 23.05.2010 um 10:46


Christian S. - So 23.05.10 10:46

Hallo und :welcome:!

Du kannst dafür z.B. ein Array [http://openbook.galileocomputing.de/visual_csharp/visual_csharp_02_005.htm#mj632c3ac812ffb6e287d59cd9ac7289c9] benutzen, wenn Du vorher genau weißt, wieviele Instanzen es werden sollen.

Wenn Du das eher variabel halten willst, kannst Du Dich in der Doku mal über eine List<T> schlau machen (Namespace System.Collections.Generic).

Grüße
Christian


Special-Agent-J - So 23.05.10 10:54

erstmal danke für die schnelle Antwort, aber
wenn ich ein Array anstatt den Namen eingebe bekomme ich folgende Fehler:


Fehler 2 Die Arraygröße kann in einer Variablendeklaration nicht angegeben werden. (Initialisieren Sie sie mit einem new-Ausdruck.) C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 120 34 Stargate Battle


Fehler 1 Fehlerhafte Arraydeklaration: Beim Deklarieren eines verwalteten Arrays steht der Rangspezifizierer vor dem Variablenbezeichner. Zum Deklarieren eines Pufferfelds fester Größe verwenden Sie vor dem Feldtyp das fixed-Schlüsselwort. C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 120 33 Stargate Battle

Hier nochmal der Code- Schnipsel, also schiffIDs ist mein array und je nach index des int schiffe soll der inhalt der Klasseninstanzname sein.


C#-Quelltext
1:
Schiff schiffIDs[schiffe] = new Schiff("Ha'tak",Maus.X, Maus.Y);                    


Christian S. - So 23.05.10 10:57

Zeig mal bitte die ganze Schleife und auch die Deklaration des Arrays :-)

//edit: Die Quelltextzeile macht nämlich schonmal keinen Sinn ;-)


Special-Agent-J - So 23.05.10 11:06


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string[] schiffIDs = new string[1000];
private int schiffe = 0;
private string schiffestring = "";
 
if (Maus.RightButton == ButtonState.Pressed)
            {
 115               schiffe += 1;
 116               schiffestring = "schiff"+ schiffe.ToString();
 117               schiffIDs[schiffe] = schiffestring;
 118               Schiff schiffIDs[schiffe] = new Schiff("Ha'tak",Maus.X, Maus.Y);
            }

ich bekomm dann folgende Fehler:
Fehler 1 Fehlerhafte Arraydeklaration: Beim Deklarieren eines verwalteten Arrays steht der Rangspezifizierer vor dem Variablenbezeichner. Zum Deklarieren eines Pufferfelds fester Größe verwenden Sie vor dem Feldtyp das fixed-Schlüsselwort. C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 118 33 Stargate Battle

Fehler 2 Die Arraygröße kann in einer Variablendeklaration nicht angegeben werden. (Initialisieren Sie sie mit einem new-Ausdruck.) C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 118 34 Stargate Battle

Fehler 3 ; erwartet. C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 118 43 Stargate Battle

Fehler 4 Ungültiger Ausdruck "=". C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 118 43 Stargate Battle

Fehler 5 ; erwartet. C:\Users\Special-Agent-J\Documents\Visual Studio 2008\Projects\Stargate Battle\Stargate Battle\Stargate Battle.cs 118 45 Stargate Battle

edit: mir ist natürlich klar das if eine verzweigung und keine Schleife ist, aber es ist in dem fall egal :D
int in string zeile 1 geändert


Christian S. - So 23.05.10 11:09

Also, Du deklarierst ein Array von Integer-Zahlen.
In der neunten Zeile willst Du dann Strings reinschreiben.
In Zeile 10 vermischst Du dann Zugriff auf ein Array mit der Deklaration einer Variablen.

Und nun meine Frage: Wenn ich Dir schon die Mühe erspare, Dir selber Informationen zu Arrays rauszusuchen, sondern Dir ein ganzes Kapitel dazu verlinke, warum liest Du es dann nicht?


Special-Agent-J - So 23.05.10 11:16

jo ist klar das es ein string sein muss! Mein Fehler...
aber um die 10. Zeile gehts da will ich ja dann den array inhalt statt jeden namen einzeln zu vergeben haben.


Christian S. - So 23.05.10 11:18

Du brauchst ein Array vom Typ Schiff[], in dem legst Du dann die Instanzen ab. Einzelne Variablen kannst Du so nicht erstellen.


Special-Agent-J - So 23.05.10 11:49

ok immerhin kann ich die arrays jetzt die instanzen schonmal speichern, danke dafür schonmal, aber jetzt tut sich ein neues Problem auf wenn ich jetzt das ganze anzeigen lassen will und die koordinaten aus meinem array holen will kommt die Meldung: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
also folgendermaßen sieht der akluelle code aus.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
private int schiffeid = 0;
Schiff[] schiff = new Schiff[1000];


 public Stargate_Battle()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            this.Content.RootDirectory = "Content\\Textures";
            graphics.PreferredBackBufferWidth = 1920;
            graphics.PreferredBackBufferHeight = 1080;
        }


        
        protected override void Initialize()
        {
            
            IsMouseVisible = true;
            graphics.GraphicsDevice.RenderState.AlphaBlendEnable = true;


            base.Initialize();

        }

       
        protected override void LoadContent()
        {
           

            spriteBatch = new SpriteBatch(GraphicsDevice);
            
            Hatak = this.Content.Load<Texture2D>("Hatak");          //Sprite laden
           
            
        }

        
        protected override void UnloadContent()
        {
            
        }

       
        protected override void Update(GameTime gameTime)
        {
            
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

           
           if (Maus.RightButton == ButtonState.Pressed)
            {
                schiffeid += 1;
                schiff[schiffeid] = new Schiff("Ha'tak",Maus.X, Maus.Y);
            }
                
               base.Update(gameTime);
        }

       
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            
           
            // TODO: Add your drawing code here
            spriteBatch.Begin();

                foreach (Schiff id in schiff)
                {

                    spriteBatch.Draw(Hatak, new Vector2(id.X, id.Y), Color.White);
                }
            
            spriteBatch.End();
            base.Draw(gameTime);


        }
    }
}


vielleicht sollte man das ganze zu xna verschieben!
Übrigens ist bei der Klasse Schiff X und Y eine Eigenschaft.


Kha - So 23.05.10 11:59

foreach iteriert über das gesamte Array, und da sind nach dem Einfügen des ersten Schiffs eben noch 999 nulls drin. Das ist so ein von Christian beschriebener Fall mit einer unbekannten Anzahl von Items, bei dem eine List<Schiff> viel mehr Sinn macht - schiffeid wirst du dann auch nicht mehr brauchen.


Special-Agent-J - So 23.05.10 12:16

ok super danke, tolle Lösung allerdings werd ich nicht ganz schlau draus wieso das .Add nicht funktioniert, wie muss ich das bei ner klasse machen?

C#-Quelltext
1:
SchiffeListe.Add("Ha'tak",Maus.X, Maus.Y);                    

das wäre jetzt mein ersatz für zeile 57 aber irgendwie kommt die meldung: Fehler 1 "Stargate_Battle.Schiff" ist ein(e) "Typ", wird aber wie ein(e) "Variable" verwendet.


Special-Agent-J - So 23.05.10 12:28

ok super danke für die schnell Lösung, habs schon selber hinbekommen, Lösung für Zeile 57 ist:

C#-Quelltext
1:
2:
Schiff test = new Schiff("Ha'tak", Maus.X, Maus.Y);
                SchiffeListe.Add(test);