String zu Int Array umwandeln

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Pebender

Betreff: String zu Int Array umwandeln

BeitragSo, Okt 23, 2011 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe folgendes Problem:

Ich habe eine Textbox, in der sollen Zahlen eingetragen werden.
Wenn ich eine Zahl eingebe soll die Zahl mit einem Array verglichen werden.
Soll im Prinzip eine Funktion werden, die den Eintrag von Zahlen bis 100 zulässt und sonst keine anderen Zeichen.
Mein Problem ist dabei ich bekomme den String von der Textbox nicht in ein Int Array konvertiert.

Mein Ansatz war so:

Code: [AUSKLAPPEN]
Function Zahleneingabe()

Local c%[]=[0,1,2,3,4,5...]
Local a$   'Variable local deklarieren

    A$ = GadgetText$(Textfeld1)       'Inhalt Textfeld einer Variabeln zuordnen
      c% =Int(a$)                             'kläglicher Versuch des konvertierens
       c% = a$                                  'funktioniert auch nicht

If GadgetText$(Textfeld1)= c% Then Notify"super"     'einfache Ausgabe wenns funktioniert


End Function


Hoffe das funktioniert überhaupt mit dem Ansatz, oder gibt es eine simplere(bessere) Methode ??

mfg Peter
BMax & MaxGUI

Lastmayday

BeitragSo, Okt 23, 2011 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst in Bmax seinen string auch als array verwenden:
BlitzMax: [AUSKLAPPEN]
Local str:String = "mein text"

For Local x:Int = 0 To str.Length - 1
Print str[x]
Next

Pebender

BeitragSo, Okt 23, 2011 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
danke,

das ging ja mal schnell, werds gleich mal ausprobieren

mfg Peter
BMax & MaxGUI
 

PhillipK

BeitragSo, Okt 23, 2011 10:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitzmax behandelt Strings als Objekt und bietet dafür einige Methoden.

Die die du suchst, ist zb:

BlitzMax: [AUSKLAPPEN]
input_string$ = GadgetText$(Textfeld1) 
input_as_integer% = input_string.toInt()


es gibt viele dieser Methoden.

.toInt()
String.fromInt(zahl)
.toFloat()
String.fromFloat(zahl)

usw usw Smile

Nachtrag: ich habe die grundfrage aber nicht verstanden.
Was genau bezweckst du mit dem abgleich? Möchtest du nur unterbinden, das eine Zahl < 0 oder > 100 eingetragen wird?

Pebender

BeitragSo, Okt 23, 2011 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
im prinzip ja.
Es dürfen keine Zahlen <0 oder >100 sein und ich brauch die Zahlen für prozentuale Berechnungen.

mfg Peter
BMax & MaxGUI

Pebender

BeitragSo, Okt 23, 2011 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
das funktioniert ja, aber wie kann ich einen Integer mit einem Integer Array vergleichen ??

Code: [AUSKLAPPEN]
If input_as_integer% <> c% Then Notify "falsch"


dann kommt eine Fehlermeldung "Unable to convert int to intarray"
aber wie kann ich das convertieren ???

mfg Peter
BMax & MaxGUI
 

Lion

BeitragSo, Okt 23, 2011 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Local array:Int[1]
Local integer:Int = 5

array[0] = 5

if array[0]=integer Then Print "yup"


Wo liegt das problem?
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x
 

PhillipK

BeitragSo, Okt 23, 2011 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst dir den unterschied zwischen einem Integer und einem Integer-Array vor augen halten.

Um einen vergleich mit einem Array durchzuführen, musst du jedes einzelne Element überprüfen.
Ein Array ist nichts weiter wie eine Sammlung von werten "zusammengefasst", ums simpel auszudrücken.
Das heißt, element 1 hat wert X, element 2 hat wert Y, element N hat wert Z.

Um mal deinen Code aufzugreifen:

BlitzMax: [AUSKLAPPEN]
Function Zahleneingabe()

Local c%[]=[0,1,2,3,4,5...] 'das hier ist ein Array - mit den werten von 0 bis 100 nehme ich an.
Local a$ 'Variable local deklarieren

A$ = GadgetText$(Textfeld1) 'Inhalt Textfeld einer Variabeln zuordnen
c% =Int(a$) 'kläglicher Versuch des konvertierens 'hier versuchst du, den array Zeiger zu überschreiben. Mit einem Int -> geht nicht, da hier ein Int[] vorliege
c% = a$ 'funktioniert auch nicht 'hier versuchst du, einen String als Int[] einzutragen -> Fehler.

If GadgetText$(Textfeld1)= c% Then Notify"super" 'einfache Ausgabe wenns funktioniert


End Function


Ich nehme jetzt einfach mal an, das du in dem Array die möglichen eingabewerte halten möchtest.
Wenn es wirklich nur um die zahlen 0 bis 100 geht, reicht eine simple abfrage.

BlitzMax: [AUSKLAPPEN]
Local inputString:String = GagdetText(Textfeld1)
Local inputInteger:Int = inputString.toInt() 'als integer umformen.

If inputInteger < 0 Or inputInteger > 100 Then
Return 0
Else
'inputinteger ist ein wert zwischen 0 und 100.
EndIf


Wenn es allerdings explizit mit dem Array sein muss, um zb auch die Zahl 50 zu sperren, so musst du den array durchgehen und jedes Element mit der Zahl vergleichen.
Hier eine idee dazu:

BlitzMax: [AUSKLAPPEN]
Local arr:Int[] = [1,3,5,7...] '1 bis 99 - jede ungrade zahl (als beispiel)

Local inputString:String = GagdetText(Textfeld1)
Local inputInteger:Int = inputString.toInt()

Local _isInArray:Int = -1 'hilfs variable

For Local i:Int = 0 Until Len(arr) 'len liefert die Anzahl der Einträge im array! mit until wird Len()-1 durchgezählt.
If arr[i] = inputInteger Then 'der Eintrag nummer i entspricht unserer zahl!
_isInArray = i 'hier den index eintragen, falls benötigt.
Exit 'wir haben unsere Zahl erkannt, also braucht nicht weitergesucht werden : Forschleife verlassen
EndIf
Next

If _isInArray > -1 Then 'tritt dieser fall ein, wurde _isInArray gesetzt -wir können also davon ausgehen, das die eingegebene Zahl auch im Array existiert.
'Hier weiterarbeiten.
EndIf


Hoffentlich hilft dir das weiter Smile

Ps: Setz dich nochmal ein wenig mit Arrays auseinander. Die sind sau praktisch, aber frustrieren nur, wenn man sie nicht ganz versteht. Solltest du hierzu weitere fragen haben, steht dir das Forum sicher gerne zur verfügung Smile

Midimaster

BeitragSo, Okt 23, 2011 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@pebender

1.
sag mal, benötigst du das Array nur deshalb, weil du damit den Test gegen 0 bis 100 durchführen willst? Das get auch einfacher!

2.
du arbeitest in deinem Programm dioch sowieso schon mit der MaxGui. Warum dann nicht gleich ein Vorab-Verbieten aller Zeichen außer Ziffern?

3.
Und wenn schon mit der MaxGui. Warum dann keine Slider für eine solche Aufgabe? Ist viel Userfreundlicher!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Pebender

BeitragSo, Okt 23, 2011 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ich möchte halt das die Textboxen rein nur Zahlen enthalten dürfen, und keine Buchstaben und der gleichen.
ich hatte es auch schon mit chr() probiert, aber da scheitere ich daran, wenn ich zwei Zahlen eingebe (z.b 10 ) dann hängt sich das Programm auf.

ich dachte halt ich nehme ein array vergleiche den Inhalt des array mit dem Inhalt der Textbox.
ist der Inhalt <> 0 bis 100 dann sind andere Zeichen eingegeben worden.
BMax & MaxGUI
 

Lion

BeitragSo, Okt 23, 2011 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Soweit ich weiß, werden Zeichen gänzlich entfernt, wenn man einen String zu einem Integer castet, von daher wird es keinen Fehler geben. Du kannst natürlich schon bei der Eingabe verhindern, dass andere Zeichen als Zahlen eingegeben werden. Entweder mit RegEx (Regular Expressions), was ein bisschen kompliziert ist, oder du prüfst einfach nach einer Eingabe den letzten veränderten Teil...
(Ich hab keinerlei Ahnung von MaxGui und weiß daher nicht, wie du deine Eingabe machen lässt, aber ich würds so überprüfen:)
Code: [AUSKLAPPEN]
Global DeinArray$[]
'... hier das Eingabezeugs
If Int(Right(DeinArray[0],1)) >= 0 And Int(Right(DeinArray[0],1)) <= 9 Then
'Allet klar, kann weiter gehen
Else
DeinArray[0]=Left(DeinArray[0],Len(DeinArray[0])-1)
EndIf

Musst du natürlich noch an dein Zeugs anpassen. Was dieser Code machen würde sieht man ja, falls die Bedingung der Zahl erfüllt wird, kann man etwas bestimmtes passieren lassen (oder es eben lassen, falls nicht gebraucht muss man eben die Bedingung einfach umstellen und kann sich so ein bisschen Code sparen), falls es etwas anderes als eine Zahl ist, wird der Eingabe-Array einfach wieder um die letzte Eingabe gekürzt.

Ich versteh ehrlich nicht gesagt, wo dein Problem ist. Ich glaub du machst es dir irgendwo einfach ein bisschen zu kompliziert Smile
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

DaysShadow

BeitragSo, Okt 23, 2011 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das was Midimaster meint ist ganz einfach, dass es eine Funktion gibt die ein Gadget die Eingabe filtern lässt!
Die Funktion heißt SetGadgetFilter.

Es gibt ein Beispiel dazu in der Hilfe, ich habe die entsprechende Stelle modifiziert und kommentiert:
Jetzt werden lediglich Zahlen angenommen, Buchstaben und Zeichen nicht.

BlitzMax: [AUSKLAPPEN]
' setgadgetfilter.bmx

Import MaxGui.Drivers

Strict

Local window:TGadget
Global textarea:TGadget

window=CreateWindow("My Window",30,20,320,240)

textarea=CreateTextArea(0,24,ClientWidth(window),ClientHeight(window)-24,window)

SetGadgetLayout textarea,1,1,1,1
SetGadgetText textarea,"A textarea gadget that filters out down arrows~nand tab keys."
ActivateGadget textarea

SetGadgetFilter textarea,filter

Print "KEY_TAB="+KEY_TAB

Function filter(event:TEvent,context:Object)
Select event.id
Case EVENT_KEYDOWN
Print "filtering keydown:"+event.data+","+event.mods
If event.data=KEY_DOWN Return 0
If event.data=13 Return 0
Case EVENT_KEYCHAR
Print "filtering charkey:"+event.data+","+event.mods

'HIER FILTERST DU ALLE ASCII KEYCODES AUS DIE KEINE ZAHLEN SIND!
'DIE ASCII KEYCODES DER ZAHLEN REICHEN VON 48 BIS 57!
If( event.data < 48 Or event.data > 57 ) Return 0
End Select
Return 1
End Function

While WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE
End
End Select
Wend
Blessed is the mind too small for doubt

Pebender

BeitragSo, Okt 23, 2011 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
danke,

werd mich mal durchwurschteln Wink

mfg Peter
BMax & MaxGUI

Midimaster

BeitragMo, Okt 24, 2011 8:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau! Dachte ich mir doch gleich, dass SetGadgetFilter() besser zu Deinem Problem passt.

Und dann checkst Du einfach noch zusätzlich ob der Wert des Textfeldes durch den letzten Tastendruck nicht größer als 100 wurde.
BlitzMax: [AUSKLAPPEN]
While WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE
End
Case EVENT_GADGETACTION
Local tmpGadget:TGadget = TGadget(EventSource())
If tmpGadget = TextArea
TestGegenHundert tmpGadget
EndIf
End Select
Wend

Function TestGegenHundert(TextFeld:TGadget)
If GadgetText(TextFeld).ToInt()>100
SetGadgetText Textfeld, GadgetText(TextFeld)[..2]
EndIf
End Function
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Pebender

BeitragMo, Okt 24, 2011 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Midimaster

vielen Dank , habs erst jetzt gesehen.
BMax & MaxGUI

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group