Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hello
Anmeldungsdatum: 15.04.2010 Beiträge: 34
|
Verfasst am: 02.05.2010, 18:49 Titel: eingabe = INPUT(1) |
|
|
Hallo,
Ich habe dieses Programm (Auszug) geschrieben:
DIM eingabe AS INTEGER
eingabe = INPUT(1)
PRINT " Du hast " & eingabe & " gedrückt "
SLEEP
Nicht sehr späktakulär, ist aber die Grundlage für mein nächstes Programm.
Der gibt mir aber error aus:
error 159: Invalid assignment/conversion in 'eingabe = INPUT(1)'
Was hab' Ich falsch gemacht? _________________ Regards  |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 02.05.2010, 18:51 Titel: |
|
|
Input gibt immer einen String zurück, also musst du "eingabe" als String deklarieren. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 02.05.2010, 18:54 Titel: |
|
|
Hallo,
erst schickst du mir die Frage per PN und kaum hab ich die PN beantwortet, fragst du noch mal das gleiche im Forum...
Also hier die Antwort noch mal.
Die INPUT-Funktion liefert immer einen STRING zurück. Diesen kannst du mit der VAL-Funktion (siehe Eintrag zu VAL in der Befehlsreferenz) in einen numerischen Datentyp umwandeln:
Code: | DIM eingabe AS INTEGER
eingabe = VAL(INPUT(1))
PRINT "Du hast " & eingabe & " gedrueckt. "
SLEEP
END |
Hinweis: Wenn du z. B. einen Buchstaben, Leerzeichen oder sowas statt einer Zahl eingibst (z.B. "a"), liefert VAL(...) 0 zurück, ansonsten die eingegebene Zahl.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
hello
Anmeldungsdatum: 15.04.2010 Beiträge: 34
|
Verfasst am: 02.05.2010, 19:33 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | Hallo,
erst schickst du mir die Frage per PN und kaum hab ich die PN beantwortet, fragst du noch mal das gleiche im Forum...
Also hier die Antwort noch mal.
Die INPUT-Funktion liefert immer einen STRING zurück. Diesen kannst du mit der VAL-Funktion (siehe Eintrag zu VAL in der Befehlsreferenz) in einen numerischen Datentyp umwandeln:
Code: | DIM eingabe AS INTEGER
eingabe = VAL(INPUT(1))
PRINT "Du hast " & eingabe & " gedrueckt. "
SLEEP
END |
Hinweis: Wenn du z. B. einen Buchstaben, Leerzeichen oder sowas statt einer Zahl eingibst (z.B. "a"), liefert VAL(...) 0 zurück, ansonsten die eingegebene Zahl.
Viele Grüße!
Sebastian |
Ich hab' die Frage direkt danach ans Forum gestellt, sry :-$ Aber danke  _________________ Regards  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 15.05.2010, 12:56 Titel: |
|
|
hello - Neue Nachricht hat Folgendes geschrieben: | Ich hab' nochmal was mit INPUT(1) gemacht und frage mich was daran falsch ist:
Code: | DO
anfang = INPUT(1)
LOOP UNTIL (anfang = 1) OR (anfang = 2) |
Der gibt mir aus:
Code: | error 159: Invalid assignment/conversion in 'anfang = INPUT(1)' |
|
Das Problem dürfte wieder das gleiche sein wie bei deiner ursprünglichen Frage.
INPUT(...) gibt dir immer einen STRING zurück (siehe dazu: Erklärung, was das ist und wie man damit umgeht). anfang scheint in deinem Quelltext eine Variable numerischen Datentyps zu sein, also z.B. ein Integer. INPUT(...) gibt aber einfach Zeichen ("p", "#", "3", "@", ....) zurück und die kann man nicht direkt einer Zahlvariablen zuweisen, weshalb der Compiler meldet: "Invalid assignment" (zu deutsch: "ungültige Zuweisung")
Das eingegebene Zeichen von INPUT musst du zuerst mit VAL oder VALINT in eine Zahl umwandeln. Diese beiden Funktionen werden mit einem STRING "befüllt" und geben eine Zahl zurück. Wenn z.B. ein "h" eingetippt wird statt einer Zahl, geben VAL oder VALINT als Zahlwert 0 zurück. Schau dir dazu am besten folgenden Eintrag zu VALINT in der Befehlsreferenz an.
Als Lösung ergibt sich daraus:
Code: | DIM AS INTEGER anfang
DO
anfang = VALINT(INPUT(1))
PRINT anfang
LOOP UNTIL (anfang = 1) OR (anfang = 2)
PRINT "Fertig."
SLEEP |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.05.2010, 20:38 Titel: |
|
|
Evtl. sollte anstelle von VAL() besser ASC() verwendet werden, welches jedes Zeichen (Taste) als eindeutiger Wert umwandelt. Die Zahlen sind dann einfach 48-57 (ASC(x$)-48 entspricht dem VAL()-Wert), Buchstaben z.B. 97-122, 27=<Esc>-Taste usw. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
hello
Anmeldungsdatum: 15.04.2010 Beiträge: 34
|
Verfasst am: 15.05.2010, 20:40 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | hello - Neue Nachricht hat Folgendes geschrieben: | Ich hab' nochmal was mit INPUT(1) gemacht und frage mich was daran falsch ist:
Code: | DO
anfang = INPUT(1)
LOOP UNTIL (anfang = 1) OR (anfang = 2) |
Der gibt mir aus:
Code: | error 159: Invalid assignment/conversion in 'anfang = INPUT(1)' |
|
Das Problem dürfte wieder das gleiche sein wie bei deiner ursprünglichen Frage.
INPUT(...) gibt dir immer einen STRING zurück (siehe dazu: Erklärung, was das ist und wie man damit umgeht). anfang scheint in deinem Quelltext eine Variable numerischen Datentyps zu sein, also z.B. ein Integer. INPUT(...) gibt aber einfach Zeichen ("p", "#", "3", "@", ....) zurück und die kann man nicht direkt einer Zahlvariablen zuweisen, weshalb der Compiler meldet: "Invalid assignment" (zu deutsch: "ungültige Zuweisung")
Das eingegebene Zeichen von INPUT musst du zuerst mit VAL oder VALINT in eine Zahl umwandeln. Diese beiden Funktionen werden mit einem STRING "befüllt" und geben eine Zahl zurück. Wenn z.B. ein "h" eingetippt wird statt einer Zahl, geben VAL oder VALINT als Zahlwert 0 zurück. Schau dir dazu am besten folgenden Eintrag zu VALINT in der Befehlsreferenz an.
Als Lösung ergibt sich daraus:
Code: | DIM AS INTEGER anfang
DO
anfang = VALINT(INPUT(1))
PRINT anfang
LOOP UNTIL (anfang = 1) OR (anfang = 2)
PRINT "Fertig."
SLEEP |
Viele Grüße!
Sebastian |
Maaaaaaaaaaaaann, schon wieder vergessen, danke sehr  _________________ Regards  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 15.05.2010, 21:16 Titel: |
|
|
dreael hat Folgendes geschrieben: | Evtl. sollte anstelle von VAL() besser ASC() verwendet werden, welches jedes Zeichen (Taste) als eindeutiger Wert umwandelt. Die Zahlen sind dann einfach 48-57 (ASC(x$)-48 entspricht dem VAL()-Wert), Buchstaben z.B. 97-122, 27=<Esc>-Taste usw. |
Ich finde eigentlich, dass ASC in dem Zusammenhang nicht vorteilhaft wäre. Zum einen ist die Subtraktion nach dem Funktionsaufruf nötig, wobei vermutlich nur wenige die ASCII-Tabelle hinreichend im Kopf haben. Zum anderen schlägt die ASC-Methode bei Eingabepuffern von 2 oder mehr Zeichen fehl, während auch dies mit VAL bzw. VALINT (für Ganzzahlen) problemlos funktioniert:
Code: | Dim Eingabe As String
Print "Bitte gib eine zweistellige Zahl ein (ggf. mit fuehrender Null): ";
Eingabe = INPUT(2)
Print chr(34) & Eingabe & chr(34)
Print
Print " ASC(Eingabe) = " & ASC(Eingabe)
Print " ASC(Eingabe) - 48 = " & ASC(Eingabe)-48
Print " VALINT(Eingabe) = " & VALINT(Eingabe)
Sleep |
_________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 15.05.2010, 21:22 Titel: |
|
|
Ich habe in diesem Zusammenhang früher immer überprüft, ob
Code: | VAL(eingabe) > 0 OR eingabe = "0" |
ist. Bei zweiziffriger Eingabe wäre das dann natürlich entsprechend "00". _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|