Autor Beitrag
Special-Agent-J
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 23.05.10 10:39 
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:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 23.05.10 10:46 
Hallo und :welcome:!

Du kannst dafür z.B. ein Array 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Special-Agent-J Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
Schiff schiffIDs[schiffe] = new Schiff("Ha'tak",Maus.X, Maus.Y);					
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Special-Agent-J Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 23.05.10 11:06 
ausblenden 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


Zuletzt bearbeitet von Special-Agent-J am So 23.05.10 11:14, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Special-Agent-J Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Special-Agent-J Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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?
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
Schiff test = new Schiff("Ha'tak", Maus.X, Maus.Y);
                SchiffeListe.Add(test);