Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [vb2010] Overflow di un'operazione aritmetica.

    In una Function controllo il colore di due punti di un form (esterno) e restituisco False se sono diversi oltre una certa soglia.

    Il codice incriminato:

    codice:
      Debug.Print("Color1: " & win.GetPixel(x, 0).R & " -Color2: " & win.GetPixel(x + 2, 0).R)
      'Nota: questa di sotto è la riga 1914
      If Math.Abs(win.GetPixel(x, 0).R - win.GetPixel(x + 2, 0).R) > 2 Then Return False

    L' output del Debug e l' errore:

    Color1: 58 -Color2: 65

    System.OverflowException: Overflow di un'operazione aritmetica
    in E:\visual studio 2010\Projects\.......\FrmMain.vb:riga 1914
    Non capisco... 58-65 fa -7 ed il valore assoluto è 7: dove è l' overflow?
    Ultima modifica di eziogsv; 01-12-2015 a 01:31

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    I due valori sono di tipo byte e un valore negativo non è consentito per un byte.

    Quindi devi convertire almeno uno dei due operandi ad un tipo più capace prima di operare, ad esempio

    codice:
    If Math.Abs(Convert.ToInt32(win.GetPixel(x, 0).R) - win.GetPixel(x + 2, 0).R) > 2 Then Return False
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    No, non è così, magari mi sono spiegato male.

    I due valori Byte sono entrambi positivi (58 e 65). Poi, visto che sottraggo ho scritto "58-65" ==> -7.

    Ma il segno meno si riferisce alla operazione aritmetica (sottrazione) e non al valore del Byte (che essendo rilevato con GetPixel è ovviamente positivo e compreso tra 0 e 255)

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dici che non è così perché hai provato?

    Ti ho detto che il problema è il tipo del risultato che non può essere un byte perché non può essere negativo
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Ok, quindi se ho capito bene se io sottraggo un Byte ad un Byte anche se sono all' "interno" di un Math.Abs che aspetta un integer... sempre un Byte ottengo (senza specifica dichiarazione pensavo che il risultato fosse automaticamente convertito in integer).

    Ok, trasformando ENTRAMBI in Integer PRIMA della sottrazione l' errore è sparito.

    Ty.
    Ultima modifica di eziogsv; 02-12-2015 a 00:34

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da eziogsv Visualizza il messaggio
    un Math.Abs che aspetta un integer
    Non importa cosa si aspetta la funzione (o le funzioni) che stanno all' "esterno" (fra l'alto non è vero che la Abs si attenda un integer) ma i tipi che compongono l'espressione.

    Per una espressione il risultato sarà calcolato utilizzando il tipo di dato più "capiente" presente tra gli operandi della stessa espressione. Dato che hai due byte, il risultato sarà calcolato usando un byte e solo dopo passato al resto delle funzioni.

    E' per questo che uno degli operandi deve essere di tipo adeguato in modo da non avere errori nella fase di calcolo.

    [quote]automaticamente convertito in integer[/qupte]

    Nulla di automatico.

    trasformando ENTRAMBI
    Non c'è bisogno di entrambi, come ti ho detto prima.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.