# Integer-Variablen sortieren



## Hafke (14. Juli 2005)

Also, ich habe 30 Variablengruppen zu je 4 Variablen:

a1,b1,c1,d1
a2,b2,c2,d2
a3,b3,c3,d3
usw.

jetzt möchte ich nach der a1,a2,a3,... Variablen sortieren. 

z.B.: a1 = 3 ; a2 = 7 ; a3 = 5 

dann möchte ich in die vierte Variable schreiben, welche position die dazugehörige gruppe hat. Also:

d2 = 1 ; d3 = 2 ; d1 = 3

Wie mache is das mit möglichst wenig Code?

Ich habe schon einiges über Arrays gelesen nur weiß ich nicht wie ich auf dei einzelnen Zahlen zugreifen kann...


----------



## dignsag (14. Juli 2005)

Also das mit deiner Sortierung habe ich glaube ich nicht ganz verstanden. Vielleicht machst du mal ein konkretes Beispiel.

 Für deinen Fall sähe ein Array so aus:


```
Dim Zahl(29, 3) as Integer
```
 
 Und einzeln (nur als Beispiel) könntest du ihnen so werte zuweisen:


```
'würde in deinem Fall a1 entsprechen
 Zahl(0, 0) = 1
 'würde in deinem Fall b1 entsprechen
 Zahl(0, 1) = 2
```
 
 Beachten musst du dabei das in einem Array die 0 auch als Arrayelement gilt. Willst du also 5 Arrayelemente deklarieren musst du das Array so deklarieren:


```
Dim XY(4) as Integer
```
 
 Ein Array kannst du natürlich mit jedem Datentyp erstellen.

 Um deine Variablenbeispiele in Arrays nochmal aufzufassen:


```
Dim a(29) as Integer
 Dim b(29) as Integer
 Dim c(29) as Integer
 Dim d(29) as Integer
```
 
 Arrayelemente lassen sich natürlich auch mit Variablenwerten ansprechen:
 z.B. ...

```
Dim i as Integer
 Dim Array(15) as String
 
 i = "Hallo"
 
 If Array(i) = "Hallo" then ...
```
 
 Für Schleifen z.B. ...


```
Dim i as Integer
 Dim Array(9) as String
 
 For i = 0 to 9
 	  Array(i) = i + 1
 Next i
```
 
 Hoffe ich konnte bissl helfen.

 Gruß Dignsag

 P.S.: Mit Sortierungen innerhalb von Arrays kann ich dir auch helfen. Aber erst muss ich mal verstehen was du willst!


----------



## Hafke (14. Juli 2005)

Großes Dankeschön erstmal, das hilft mir richtig weiter.

Nur noch ne Frage:


```
Dim i as Integer
 Dim Array(15) as String
 
 i = "Hallo"
 
 If Array(i) = "Hallo" then ...
```

1. bei "Dim i As Integer" kann man doch nur Zahlen speichern oder? Weil da i = "Hallo" steht
2. bei dem "If Array(i)..." welche Position hat "i", ich meine ist das "Hallo" auf irgendeinem der 16 Speicherplätze oder an einem bestimmten, wenn ja an welchem?


zu meiner Sortierung:

Ich möchte ein Spiel programmieren, bei dem man eine Bestenliste aufrufen kann, max Speicherplätze = 30, dazu muss ich ja schauen wer den "Highscore" hat (Variable 1), den Namen des Spielers (Variable 2) und die Position (Variable 3)

Also soll er nach Variable 1 sortieren, beginnen mit dem höchsten Punktestand und dann die Namen dazuschreiben. 

Hoffentlich hilft dir das mein Prob zu verstehen...


----------



## Julian Maicher (14. Juli 2005)

Er meinte wohl eher sowas:

```
Array(1) = "Hallo"
```

Wenn du alle Ergebnisse in einem Array speicherst, ist ein Sortieren nicht mehr sonderlich schwer.
Da kannst du fertige Sortieralgorithmen wie Quicksort, Bubblesort o.ä. verwenden.
Einen solchen Algorithmus findest du z.B. hier: http://vb-tec.de/qsort.htm

* Ups, das mit den Namen habe ich wohl gerade überlesen. Ich denk aber mal drüber nach


----------



## dignsag (14. Juli 2005)

Sorry du hast natürlich vollkommen recht mit dem Integer, dann kannman kein "Hallo" speichern. Werde mir dein Problem morgen noch mal näher anschaun, und dann besser antworten, bin jetzt zu müde!

 Der rest des beispiels stimmte übrigens, es sollte nur aufzeigen das ein Arrayelement auch mit Variablenwerten angesprochen werden kann.

 Übrigens die Zahl in der Klammer entspricht dem Arrayelement, in dem dein Variablenwert den du zuweist im endeffekt gespeichert wird. Du kannst diesen wert dann also auch wieder über die Zahl abrufen!


```
Array(0) = 1
 Array(1) = 2
 Array(2) = 3
 'usw.
 
 'dann kannst du z.B. sagen
 Debug.Print Array(1)
 'damit rufst du das 2. Element des Arrays "Array" auf!
```


----------



## dignsag (15. Juli 2005)

```
Sub sortieren()
  Dim Punkte(29) as Long
  Dim Name(29) as String
  Dim Zaehler as Integer
  Dim Zaehler2 as Integer
  
  For Zaehler = 0 to 29
  	 For Zaehler2 = 0 to 29
  		  If Punkte(Zaehler) > Punkte(Zaehler2) and Zaehler <> Zaehler2 then
  			   tauschen(Punkte(Zaehler), Punkte(Zaehler2))
  			   tauschen(Name(Zaehler), Name(Zaehler2))
  		  End If
  	 Next
  Next
  
  End Sub
  
  
  Sub tauschen(ByRef Wert1 as Variant, ByRef Wert2 as Variant)
  Dim Merken as Variant
  
  Merken = Wert1
  Wert1 = Wert2
  Wert2 = Merken
  End Sub
```
 
  So die erklärung dazu!
  Die beiden Schleifen sortieren deine Arrayinhalte nach den Punkten absteigend!
  Im endeffekt steht das dann so in dem Array z.B.:

  Punkte(0) = 9999
  Punkte(1) = 9842
  Punkte(2) = 8123
  ...
  usw.

  Und dazu werden den gleichen Elementen in dem anderen Array "Name" die Namen zugeordnet

  Punkte(0) = 9999;      Name(0) = Hans
  Punkte(1) = 9842;      Name(1) = Michael
  Punkte(2) = 8123;      Name(2) = Torsten
  ...
  usw.

  Das heißt die gleichen Zahlen in den zwei Arrays gehören zueinander!
  Die Sub tauschen tauscht einfach die Inhalte der 2 Werte die eingegeben werden.
 Vorraussetzung ist, das die Arrayinhalte schon enhalten sind. Und das bei der Befüllung daran gedacht wurde, das jeder Punkte Zahl der Name im gleichen Element des anderen Arrays zugeordnet sein muss.
 Die Positon ergibt sich ja sowieso aus den Punkten. Kannst du ja auch im nachhinein noch anfügen!

  Hoffe du hast es verstanden und kannst was damit anfangen

  Für Fragen, meld dich einfach!

  Gruß Dignsag


----------



## Hafke (15. Juli 2005)

Vielen Dank. Ich baue das jetzt mal ein melde mich wieder.


----------



## Hafke (16. Juli 2005)

Die Einträge

```
tauschen(Punkte(Zaehler), Punkte(Zaehler2))       
tauschen(Name(Zaehler), Name(Zaehler2))
```

sind bei mir Rot und er erwartet ein "="


edit: bei Zugriff auf Array schreibe ich

debug.print array(i) = was-ich-speichern-möchte

und wie is es andersrum

was-ich-gespeichert-habe = ?


----------



## dignsag (18. Juli 2005)

Entschuldigung Fehler meinerseits...

  Du musst die tauschen-Sub ohne Klammern schreiben:


```
tauschen Punkte(Zaehler), Punkte(Zaehler2)       
 tauschen Name(Zaehler), Name(Zaehler2)
```
 
 Deine zweite Frage versteh ich nicht, mit andersrum! Was willst du andersrum machen?

 Gruß Dignsag


----------



## Hafke (18. Juli 2005)

Also
	
	
	



```
Dim Temp As Variant

Temp = Text1.Text 'Hier speichere ich den Text aus der TextBox in die Variable Temp
Text1.Text = Temp 'Hier speichere ich die Variable Temp in die TextBox
```

Wie funktioniert das mit nem Array?


```
Dim Temp(i) As Variant

debug.print Temp(0) = Text1.Text 'In Array speichern
Text1.Text = ? 'Aus Array laden, wie geht das
```


----------



## dignsag (18. Juli 2005)

Das geht genauso wie mit Variablen:


```
Text1.Text = Temp(0)
```
 
 Arrays funktionieren grundlegend wie Variablen, nur mit dieser Zusatzfunktion, das man mehrere Elemente der Variable (Array) ansprechen kann, durch die Zahl in der Klammer.


----------



## Hafke (18. Juli 2005)

Ich habe meine Variablen und Arrays in einem Modul "Variablen.bas" gespeichert:

```
Public Name(29) As Variant
```

und in einer Form:

```
Dim temp As Variant
.
.
.
temp = Name(0)
```

Da kommt die Fehlermeldung beim Kompilieren:

Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft.


----------



## dignsag (18. Juli 2005)

Wenn du die Variablen und Arrays wo anderst gespeichert hast als da wo du sie brauchst musst du zuerst noch den Ort angeben in dem sich deine Variable (Array) befindet:


```
Variablen.temp = Variablen.Name(0)
```
 
 Warum speicherst du überhaupt die Variablen in einem separaten Modul? Du kannst sie doch global zu der Form dazu tun, dann hast du den Streß nicht! ^^


----------



## Hafke (18. Juli 2005)

Naja, ich hab halt 10 weitere Formen, die alle auf die Variablen zugreifen, das hat mir ein Freund vorgemacht und ich habs bei ihm abgeschaut, funktioniert auch wunderbar bis auf das Array.

Aber so gehts. Jetz hab ich alle Info zusammen. Mal testen ob das Prog auch tut.


----------



## Hafke (18. Juli 2005)

OK. Es funktoniert alles wunderbar, genau so wie ich mir das gedacht hab.  

Jetzt hab ich nur noch eine Frag für spätere Projekte:

Es wird ja nach Punkten Sortiert und die Namen werden dazugeschrieben. Wie kann ich noch mehr dazuschreiben.

Also nach Punkten Sortieren und zb. Vorname, Punkte des besten Level, Datum der Higscore usw. dazuschreiben.


----------



## dignsag (19. Juli 2005)

Hi Hafke,

 freut mich das es funktioniert!
 Du kannst immer neue Informationen hinzutun indem du da wo du die Arrays füllst die Information schon hinzutust. Und bei der stelle wo du "tauschen" tust dieses Array mit anfügst. Wichtig ist das die zugehörige Information (Datum, Vorname usw.) immer im selben Element des neuen Arrays gespeichert ist wie die alte Information im alten Array.

 Gruß Dignsag


----------



## Hafke (19. Juli 2005)

Juhu. Funktioniert Wunderbar.

Vielen Dank.

Da hast du mir ne menge Zeit erspaart.


----------



## dignsag (19. Juli 2005)

Freut mich zu hören ^^

 Bleib dran


----------

