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
Christian S.: C#-Tags hinzugefügtModeriert von
Christian S.: Topic aus C# - Die Sprache verschoben am So 23.05.2010 um 10:46
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"); }
protected override void UnloadContent() { }
protected override void Update(GameTime gameTime) { 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); 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); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!