Newsgroup: it.comp.lang.c++
Titolo: Funzione

Ciao a tutti. Ho scritto questa funzione per fare la somma di due byte(gli
passo int per comodità) per far si che, se la somma arriva oltre al max
(255), ricominci a contare da 0
Es:
SumAscii(0, 100) = 100
SumAscii(255, 1) = 0
SumAscii(255, 2) = 1
Ma quando uso cout per fare un test dei risultati, non visualizza niente.
Sbaglio una qualche sintassi (uso Visual C++ 6)
int SumAscii(int ascii,int number)
{
 int result;
 long remaining;
 result = ascii;
 remaining=number;
 while (result < 255 || remaining > 0)
 {
  remaining--;
  result++;
 }
 if (remaining == 0)
 {
  return result;
 }
 else
 {
  result=0;
  remaining--;
  result=remaining;
  return result;
 }
}

Scusa, senza neanche leggermi la funzione, usare il modulo no, eh?
0 % 256 = 0
1 % 256 = 1
2 % 256 = 2
255 % 256 = 255
256 % 256 = 0
257 % 256 = 0
512 % 256 = 0
Se poi la tua problematica č che vuoi che semplicemente il char si arrotoli
su se stesso (nel senso che vuoi che, se il max di un unsigned char č 255,
vuoi che 255 + 1 = 0), allora basta che fai cosě:
unsigned char a = 100;
unsigned char b = 300;
unsigned char c = a + b; (c = 400 % 256 se 255 č il massimo valore che puň
stare in un un. char. (su certe architetture "strane forte" i char sono piů
grandi, ma se tu lavorassi su quelle architetture ti andrebbe lo stesso bene
il risultato, quindi c = 144)
--- bye


Non lo conoscevo, mi hai lasciato senza parole. In praticva tutt ala
funzione che mi sono scrito non serve a nulla.
Grazie,
Ricky

 il risultato, quindi c = 144)
Grazie mille, e per sottrarre ( sempre ricorsivo, se arriva a zero riparte
da 255) quale č l'operatore?

 da 255) quale è l'operatore?
Se lavori direttament con gli unsigned chars provvederà a tutto lui.
Se invece lavori con gli int puoi fare così:
int a = 100;
int b = 200;
int c;
if (a >= b)
  c = (a - b)
else
  c = 256 - b + a;
chiaramente stiamo supponendo che a < 256 e b < 256. Se no alla fine metti
un c = c % 256 e vivi felice. Nota che potrebbe essere più veloce non
mettere l'if e fare direttamente: c = (256 - b + a) % 256. (perchè in questa
maniera il prefetcher ha un'unica via da seguire e non si deve chiedere "da
che parte andrà l'if?")
--- bye

Ca##ata... Se a o b possono essere DI BASE superiori a 256 E b > a allora il
modulo lo devi applicare a loro prima della sottrazione!
Quindi:
int a = 100;
int b = 200;
int c;
if (a >= b)
  c = (a - b)
else
  c = (256 - (b % 256) + (a % 256)) % 256;
L'ultimo % 256 serve nel caso a = b. Se lo hai già escluso con l'if allora
lo puoi togliere.Se sei sicuro che a < 256 && b < 256 allora puoi togliere
tutti i moduli. (il modulo è un operatore, in C il %)
--- bye

 che parte andrà l'if?")
Caspita, c'ero andato vicino, avevo fatto
(a-b) % 256
Grazie ancora,
Ricky

 (a-b) % 256
Io ho preferito andare sul sicuro... Non mi ricordavo come si comporta il
modulo con i numeri negativi. Ho appena controllato. Il risultato non è
definito. :-)
--- bye

 da 255) quale è l'operatore?
Dovrebbe andare c = (a - b + 256) % 256, purché a e b siano, ovviamente,
minori di 256.
Ciao, Spider

 SumAscii(255, 2) = 1
Penso che esistano infiniti modi più semplici.
#include <iostream>
using namespace std;
int sommaChar(unsigned char a,unsigned char b)
{
        char c(a+b);
        return static_cast<int>(c);
}
int main()
{
        int a;
        a=sommaChar(0,100);
        cout << "A = " << a << endl;
        a=sommaChar(255,1);
        cout << "A = " << a << endl;
        a=sommaChar(255,2);
        cout << "A = " << a << endl;
        return 0;
}