Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

absturz durch Array?!

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.11.2012, 12:28    Titel: absturz durch Array?! Antworten mit Zitat

Ich hoffe folgender Programschnipsel reicht euch aus um meinen Fehler zu erkennen.
die ersten Programabstürze konnte ich durch Zeile 423 verhindern
-wurden im Verzeichnisordner 14 dateien gefunden kam ein Absturz wenn ymaus > 149 wurde - mir noch logisch da nun array(>14) abgerufen würde
- nun entstehen abstürze bei Mausklick - also theoretisch ab Zeile 424

Die "SUB GetFiles" hab ich vorerst aus der Referenz übernommen und am Ende noch
Code:
gefunden = i
eingefügt

Code:

19 DECLARE SUB GetFiles( Array() as string )
...
41 DIM SHARED AS STRING dateien()
42 DIM SHARED AS STRING bzlwahl()
...
365 CASE IS = 13                      'enter
366   CLOSE
367   wort = wortteil + wort
368   dateiexist = EXEPATH + "\Save\" + wort + ".dat"
369   IF FILEexists(dateiexist) THEN
370      autowrite(&h00AA00, 15, 128, dateiexist + " existiert schon.")
371      SLEEP 2000: exit DO
372   END IF
 
 
375   CHDIR "DownTour"
376   GetFiles dateien()  'Dateien aus Ordner "DownTour" in Array "Dateien"
377                              'speichern / gefunden = gefundene Dateien
378   StartListe = 1
379   mradoffset = mrad + 1
380   FOR i = 1 to gefunden 'um mehrere Dateien auszuwählen soll im Array "bzlwahl"
381     redim preserve bzlwahl(i) 'gespeichert werden welche datei markiert ist
382     bzlwahl(i) = "o"          'mit "o" für nicht und mit "x" für geklickt
383   NEXT i
 
385   DO
386     SLEEP 25
387     ScreenLock
 
389     LINE (197, 7) - (400, 310), &hAAAAAA, BF
390     zeile = 10
391     for i = StartListe to StartListe + 4
392       IF bzlwahl(i) = "x" THEN anzfarbe = &hFFFF00 ELSE anzfarbe = &h000000
393       autowrite(anzfarbe, 200, zeile, dateien(i)) 'schrift ist ca 7 pix hoch
394       IF i = gefunden THEN EXIT FOR
395       zeile += 10
396     next
397 color &hFFFFFF: locate 1,1:? ymaus;"  ";mbuttons;"      " 'TESTZEILE
398     ScreenUnLock
399     txt = INKEY
400     IF txt = CHR(255)+"k" THEN ENDE
 
402     GETMOUSE (xmaus,ymaus,mrad,mbuttons,mclib)
403     mrad2=mrad-mradoffset
 
405     IF xmaus = -1 THEN   'sollte die Maus das Programfenster verlassen
406       exi = exis         
407     ELSE
408       exi = mrad2 - (mrad2*2) 'legt fest von wo an die Dateienliste angezeigt wird
409       exis = exi
410     END IF
411     IF exi < 1 THEN mradoffset = mrad + 1  'ist die Auswahl durch das Mrad unterdreht
412     IF exi > gefunden THEN mradoffset = mrad + gefunden:exi = gefunden 'oder überdreht
413     StartListe = exi
414     'folgende zeilen errechnen welche Datei gewählt wurde bei einem Mausklick
415     IF ymaus < 100 THEN txt = " " ELSE txt = ""
 
417     txt += STR(ymaus)
418     txt = MID(txt, 1, 2)
419     bzl = VAL(txt) + startliste - 1
420     'bzl ist nun von pixelzeile in Schriftzeile plus startliste umgerechnet
421     'also = auswahlposition
 
423     if bzl > gefunden then bzl = gefunden
424     IF mbuttons = 1 AND ymaus > 9 AND ymaus < 310 AND xmaus > 9 AND xmaus < 601 AND _
425     bzl <= gefunden AND bzlwahl(bzl) = "o" THEN bzlwahl(bzl) = "x"
 
427     IF mbuttons = 1 AND ymaus > 9 AND ymaus < 310 AND xmaus > 9 AND xmaus < 601 AND _
428     bzl <= gefunden AND bzlwahl(bzl) = "x" THEN redim preserve bzlwahl(bzl): bzlwahl(bzl) = "o"
                                       
430   LOOP

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 08.11.2012, 12:33    Titel: Antworten mit Zitat

du solltest generell um if strukturen, die logische verknüpfungen haben, immer klammern ziehen. andernfalls kann man die reihenfolge nur schwer einschätzen, wie die verknüpfung und prüfung erfolgt.

Code:

if a = b and c = d then


könnte interpretiert werden als
Code:

if a = (b and ) = d then


könnte aber auch lauten
Code:

if (a = b) and (c = d) then



daher solltest solche knüpfungen immer klammern.

das köntne auch schon das problem sein, habs nicht weiter angesehen.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.11.2012, 12:44    Titel: Antworten mit Zitat

Danke für den Tipp aber des Rätsels Lösung war es leider nicht
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 08.11.2012, 14:37    Titel: Antworten mit Zitat

'bzl' kann dank Zeile 423 höchstens so groß wie 'gefunden' sein - ist das Array auch bis 'gefunden' deklariert (und nicht etwa nur bis 'gefunden-1')? Der zweite mögliche Fehler wäre, wenn 'bzl' kleiner ist als der kleinste Index des Arrays.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.11.2012, 16:15    Titel: Antworten mit Zitat

also
bzl höchstens so groß wie gefunden ist richtig, damit eben kein array aufgerufen wird das nicht deklariert wurde.
und in der Referenz wird erst i multipliziert (i += 1) und dann (array(i) = ...)
was für mich genau richtig ist da das 2te parallele Array auch von 1 bis gefunden ist.

ich glaube das die Mbuttons-abfrage sich selbst aufgehoben hat

habe nun folgendes geändert

im Verzeichnis alles bis auf eine Datei gelöscht.
Code:

424     if bzl > gefunden then bzl = gefunden
425     IF bzl < 1 THEN bzl = 1
426     bzlSave = bzlwahl(bzl)
427     IF (mbuttons = 1) AND (ymaus > 9) AND (ymaus < 310) AND (xmaus > 9) AND (xmaus < 601) AND _
428        (bzl <= gefunden) AND (bzlwahl(bzl) = "o") THEN bzlSave = "x": sleep 150
 
430      IF (mbuttons = 1) AND (ymaus > 9) AND (ymaus < 310) AND (xmaus > 9) AND (xmaus < 601) AND _
431        (bzl <= gefunden) AND (bzlwahl(bzl) = "x") THEN bzlSave = "o": sleep 150
 
433     redim preserve bzlwahl(bzl):bzlwahl(bzl) = bzlSave
434   LOOP


ich denke jetzt funzt es.. werd es später noch mehreren Dateien probieren.
Ach ja und zu zweitens - da hab ich jetzt noch zeile 425 eingefügt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.11.2012, 18:06    Titel: Antworten mit Zitat

ok. falsch gedacht. es funzt nur wenn im Ordner nur eine Datei ist. Ich kann die Maus überall hin bewegen auch ausserhalb des Fensters.
Aber sobalt min. 2 Dateien im Verzeichnis sind stürzt das Prog ab. Und zwar wenn ich die Maus aus dem Fenster ziehe oder yMaus kleiner 20 wird (bei 2 Dateien) also zB yMaus 19 ist dann bzl = 1 was wiederum kleiner als gefunden ist und gar keinen absturz verursachen würde ! ? !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.11.2012, 20:57    Titel: Antworten mit Zitat

so jetzt aber
Code:
redim preserve bzlwahl(bzl):
in Zeile 433 und vorher in den IF's war wohl überflüssig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 09.11.2012, 11:02    Titel: Antworten mit Zitat

Hab nochmal fix drüber gesehen. Du solltest ebenfalls die Prüfung aufschlüsseln und stückweise ausführen.

Bisher machst du:

Code:

427     IF (mbuttons = 1) AND (ymaus > 9) AND (ymaus < 310) AND (xmaus > 9) AND (xmaus < 601) AND _
428        (bzl <= gefunden) AND (bzlwahl(bzl) = "o") THEN bzlSave = "x": sleep 150


das wäre (der übersichthalber)
Code:

IF (mbuttons = 1) AND (ymaus > 9) AND (ymaus < 310) AND (xmaus > 9) AND (xmaus < 601) AND (bzl <= gefunden) AND (bzlwahl(bzl) = "o") THEN
    bzlSave = "x"
    sleep 150
end if


der code wird nun so verarbeitet, das die prüfung komplett durchlaufen wird. Wörtlich formuliert:
WENN mbutton UND ymaus UND xmaus UND blz UND blzwahl DANN bla

und hier ist auch das problem beim zugriff.

die IF prüfung kann mit AND nicht erkennen, wenn eines der fehler fehlerhaft ist, und die nächste prüfung nicht abbrechne.
genauer gesagt ist der fehler bei der letzten prüfung.

Code:

... AND (bzl <= gefunden) AND (bzlwahl(bzl) = "o") THEN


du prüft ob bzl <= gefunden ist.

was ist aber, wenn blz = 0 oder -1 ist? .. dann ist blz ebenfalls <= gefunden. aber das array blzwahl geht nur von 0 oder 1 bis n.

1. muss hier eine eingrenzung erfolgen:
Code:

if (bzl >= lbound(bzlwahl)) AND (blz <= ubound(bzlwahl)) THEN


damit prüfst du, ob blz in den grenzen des arrays liegt. wenn dies nicht der Fall ist, dann wird nicht weiter gearbeitet. LBound = untere grenze, UBound = Obere grenze

2. sollte man nicht den arrayzugriff in die selbe if packen, in der man die grenze prüft.
IF prüft alle angaben, bevor es abbricht, sofern mit AND und nicht mit ANDALSO gepfüt wird. AND wird IMMER komplett verknüpft. ANDALSO verknüpft nur solange, bis eine bedingung nicht erfüllt ist, und ignoriert bzw. bricht die restlichen verknüpfungen ab.

aber das lassen wir erstmal raus.

3.
teile die IF prüfung in mehrere schritte auf. Das hilft auch bei deiner übersicht.
Code:

IF (mbuttons = 1) AND (ymaus > 9) AND (ymaus < 310) AND (xmaus > 9) AND (xmaus < 601) Then
    if (bzl >= lbound(bzlwahl)) AND (blz <= ubound(bzlwahl)) THEN
        If (bzlwahl(bzl) = "o") THEN
            bzlSave = "x"
            sleep 150
        End If
    End If
End If


Hier sieht man auch schon, das bestimmte bedingungen erfüllt sein müssen, bevor weiter gearbeitet werden soll. Das macht ebenfalls dann auch dein Programm udn sollte damit zumindest den zugriffsfehler auf das array beheben. egal, wie weitere fehler im app vorhanden sein könnten.

Die korrecktur von "blz > gefunden then blz = gefunden" kannst du dir als fix jetzt spaaren. Wenn es auserhalb der grenze ist, dann wird nicht weiter gearbeitet. SOlche fixes sind nur dann sinvoll, wenn man auch dann einen eintrag haben will, wenn man auserhalb der position das minimum oder maximum erhalten will.

beispiel:
Code:

if mausx > maxhoehe then mausx = maxhohe
if mausx < minhoehe then mausx = minhoehe


hiermit bestimmst du, das der wert in mausx niemals auserhalb seine grenzen liegen kann.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 09.11.2012, 12:45    Titel: Antworten mit Zitat

Oh super, Danke

also bei folgender Variante würde die IF Prüfung abgebrochen sofern kein Mausklick registriert wurde?
Code:
IF (mbuttons = 1) ANDALSO


jetzt muss ich nur nochmal fragen wegen des arrays. Ich habe das so verstanden.

dies ist ein einfaches Array bzw ein begrenztes:
Code:
DIM tage(0 TO 6) AS STRING  = {"M", "D", "M", "D", "F", "S", "S"}
natürlich auch ohne Klammern.
Hier kann ich jederzeit den Inhalt ändern
Code:
tage(0) = ""


und so sieht ein dynamisches Array aus
Code:
DIM SHARED AS STRING bzlwahl()

und hier meine eigendliche Frage, verstanden hab ich es so das ich um den Inhalt zu ändern
Code:
redim preserve bzlwahl(i):bzlwahl(i) = "TEST"
schreiben muss

denn:
Code:
380   FOR i = 1 to gefunden 'um mehrere Dateien auszuwählen soll im Array "bzlwahl"
381     redim preserve bzlwahl(i) 'gespeichert werden welche datei markiert ist
382     bzlwahl(i) = "o"          'mit "o" für nicht und mit "x" für geklickt
383   NEXT i
hatte ohne redim preserv nicht gefunzt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 09.11.2012, 12:54    Titel: Antworten mit Zitat

Dim = erzeugt eien variable

Shared = eine variable die global ist (auch in sub / funktionen verfügbar)

Preserve = behält den inhalt des array bei, wenn es vergrösert / verkleinert wird. Ist diese angabe nicht vorhanden, wird der gesammte array-inhalt gelöscht

blub() = undefiniertes array

blub(0 to 10) definiertes array


beispiel:

Code:

dim array() as integer

array mit nicht definierter grösse. (leer)

Code:

dim shared array() as integer

selbes, nur das auch aus sub / function heraus darauf zugeriffen werden kann

Code:

dim array(3 to 10) as integer

array sas per index 3 bis 10 einträge besitzt ... sprich, 3, 4, 5, 6, 7, 8, 9, 10 = 8 einträge insgesammt

Code:

print ubound(array)

liefert 3 zurück, bei array(3 to 10)

lbound entsprechend 10



Code:

IF (mbuttons = 1) ANDALSO

nein

Code:

IF (mbuttons = 1) ANDALSO (mbutton = 2) then


ANDALSO ist ein ersatz für AND, und nicht für Then

folglich wird bei AND geprüft:
Code:

if (A = 1) AND (A = 2) Then

Ist A = 1 UND A = 2 Dann

mit ANDALSO
Code:

if (A = 1) ANDALSO (A = 2) Then

Ist A = 1 UNDDANN Ist A = 2 Then

Wenn A nicht 1 sein sollte, wird A = 2 garnicht erst geprüft und die if sofort übersprungen

das ist bei AND nicht so. da wird immer alles geprüft, bevor entschieden wird, ob das if übersprungen wird, oder nicht.

udn da ist das problem bei array zugriffen.
wenn du in der selben if prüfst, ob ein index innerhalb des arrays liegt, und dann noch den inhalt mit diesem index prüfst, kann es passieren, das wenn r auserhalb liegt, ein zugriff auserhalb der array genzen erfolgt.

bei ANDALSO wird nach der fehlerhaften prüfung der grenze der rest garnicht erst weiter geprüft. und damit kann man es verhindern.

Allerdings solltest su dich erstmal mit den regulären verfahren auseinander setzen, bevor du zu spezielleren verfahren über gehst. Das hilft dir danna uch zu verstehen, wo der unterschied zwischen AND und ANDALSO und OR bzw ORELSE liegt.



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 09.11.2012, 13:26    Titel: Antworten mit Zitat

Zitat:
ersatz für AND, und nicht für Then
hatte ich schon verstanden, ich wollte nur nochmal sichergehen ob ich es richtig verstanden hatte wenn hinter ANDALSO die Array abfrage kommen würde, diese nicht abgefragt wird da mbuttons ja nicht 1 ist.

DIM und SHARED war auch klar nur mit REDIM und PRESERVE hab ich probleme.
Ich versuch es nochmal.
DIM wird ja nur einmalig benutzt - bin ich nun gezwungen im ablauf des Progs ein Array zu vergrößern, dann tu ich dies mit REDIM der selben Variablen und der neuen größen Angabe und damit das was das Array schon beinhaltet nicht verloren geht erweitere ich REDIM mit PRESERVE ?!

Ich mein über probieren hab ich es am Ende hinbekommen. Aber wie du schon mehr oder weniger sagtest ist es besser vorher zu WISSEN was man macht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 09.11.2012, 14:23    Titel: Antworten mit Zitat

REDIM: richtig erkannt.

ANDALSO: .. nun ... ich spiele hier nicht so sehr auf mbutton als problemträger in der if struktur an, sondern eher auf die bound-grenzen des arrays in bezug auf bzl
aber sonst, jo.

angenommen, du hast mbutton durchaus auch valid auf 1, dann würde die if weiter arbeiten. und zwar bis zum array. da bzl aber eventuell < lbound ist, hättest du wieder das problem des array zugriffes.

ich vertrete den standpunkt (was einige leider nicht tuen), das man jeden möglichen fall spezifizieren sollte, und alle unbekannten fälle durch else ausschliessen.

es sieht im app dann meist nach sehr viel code aus, wo alles mögliche, jeder zustand und x dinge geprüft werden, bevor man zur eigentlichen aufgabe kommt, aber dafür hat man später keine probleme durch ungewollte abstürze, die sich eventuell einfach durch probleme ergeben, die vorher nicht erkannt wurden.

man kann soetwas einfach verhindern, indem man wirklich jeden parameter von grundauf betrachtet und prüft.

das hat auch geschwindigkeitsvorteile zwinkern

beispielsweise mit deinem array zugriff. Ich habe deinen source so verstanden, das du anhand der maus-position einen index erzeugst, welchen du für den arrayzugriff nutzt.

nun ... selbst würde ich so vorgehen, das ich zuerst einmal die mausposition detektiere. anschliessend prüfe ich, ob die maus-position für x und y überhaupt in einem validem bereich fällt. erst wenn dem so ist, kann ich anfangen das index zu berechnen. anschliessend wird geprüft ob das index im array bereich liegt. udn wenn dem auch so ist, dann greife ich erst auf das array zu.

als problembeispiel:
angenommen, du hast (unwarscheinlich) ein array, das bis maximal &HFFFF (einen kompletten UShort an einträge erfasst. Das sind dann 65535 Einträge.

Weiter angenommen, du fragst deine maus mit UShorts ab (ist jetzt nur alles n beispiel mit Short, liese sich aber auch mit Integer realisieren)
Sobald deine Maus auserhalb des fensters läuft, erhällst du für x und y den wert -1. Da du mit UShort (U = Signiert) arbeitest, bedeutet dies, das du einen Wert von -1 in eine Variable schreibst, die nur 0-65535 aufnehmen kann.
Da die Variable durch ein Bit als U bzw Nicht-U definiert wird (Letztes Bit), würde durch das überschreiben dieses Bits durch das -1 ein Wert von 65535 heraus kommen.

Jetzt hast du also einen Validen Wert in einer Variable stehen, die eigentlich nicht Valid sein sollte, da die maus ja auserhalb deines fensters ist und nicht innerhalb.

Darum sollte jeder zustand möglichst expliziet untersucht bzw. definiert und eingegrenzt werden.

Auch könnten -1 rechnungen bei verwendung von NICHT-U's dazu führen, das Fehler bei der Index-Errechnung auftreten. Gleiches gilt auch für U's.
Durch sogenannte "Überläuft" könnte es dazu kommen, das du Valide einträge erhällst, obwohl dem nicht so ist. Das kann eben durch das Spezifizieren von Min udn Max bereiche vermieden werden.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 09.11.2012, 14:54    Titel: Antworten mit Zitat

Nochmal wegen REDIM [PRESERVE]: wie du richtig sagst , brauchst du das, um die Größe eines dynamischen Arrays zu verändern. Um das klar zu stellen: Du brauchst REDIM vermutlich nur, wenn das Array vergrößert werden soll (verkleinern geht damit zwar genauso, aber so wie ich das sehe, sammelst du ja Dateinamen und brauchst davon nicht plötzlich weniger als zuvor).

Eine mögliche Anwendung wäre, beim Auslesen der Dateien innerhalb eines Ordners Schritt für Schritt weitere Dateien in deinen Ordner zu schreiben, also das Array schrittweise zu vergrößern. Wenn das geschehen ist und du auf einen einzelnen Eintrag zugreifen möchtest, brauchst du vorher kein REDIM verwenden. Du willst die Arraygröße dazu ja nicht verändern.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 09.11.2012, 20:53    Titel: Antworten mit Zitat

Ja ihr habt das beide richtig gesehen. Ganz genau gesagt ist das ganze ein Routenplaner, sprich ich bekomme für ein Bezirk eine *.txt mit unsortierten Kundendaten (kundennummer;name;Adresse;.....u.s.w.). Diese soll eingelesen und bearbeitet werden zu einem Tourenbuch. Da es auch zusammengelegte Touren gibt musste ich mir die möglichkeit suchen mehrere Dateien anzuklicken.

Eine Zeile ist bei mir 10 Pixel hoch und die erste fängt bei 10 an. ist ymaus nun z.B. 15 ergibt das nach meiner Rechnung mit leerstelle vorn dran(da ymaus unter 100) und dann die ersten beiden Zeichen, den Index 1 plus der Startnummer der Dateiliste.

Gut war auf jedenfall nochmal der Anstoß das ymaus nur in ein Arrayindex umgerechnet wird sofern ymaus im möglichen Bereich befindet.

Und um nicht ymaus = -1 zu erhalten hatte ich diesen weg gewählt:
Code:

IF xmaus = -1 THEN
   exi = exis
ELSE
   exi = mrad2 - (mrad2*2)
   exis = exi
END IF

also ymaus kann zwar immernoch -1 sein aber passiert dies so wird der letzte positive Wert genutzt.

warscheinlich nicht der schönste Weg aber für mein kenntnisstand erstmal der beste... aber ich bin willig es besser zu machen lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 10.11.2012, 11:37    Titel: Antworten mit Zitat

woher weist du, das dieser wert zuvor gültig war?

nach dem app start wird die var auf 0 stehen, und damit ungültig sein. zwinkern

erst nach einem durchlauf, (erfolgreich) wird er einen validen wert beinhalten.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 13.11.2012, 10:04    Titel: Antworten mit Zitat

das stimmt

vor einer Abfrageschleife setze ich folgendes

Code:

mradoffset = mrad + 1    'mradoffset  = 1

GETMOUSE (xmaus,ymaus,mrad,mbuttons,mclib)     'mrad = 0
mrad2=mrad-mradoffset    'mrad2 = -1

IF xmaus = -1 THEN 
  exi = exis             
ELSE
  exi = mrad2 - (mrad2*2)   exi = 1
  exis = exi                         exis = 1
END IF
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz