Italian Consigli per principiante

Claudio57

Member
Licensed User
Longtime User
Allego un piccolo progettino. Giuro che non ci sto capendo più niente. Nel Btn1_Click (evento che calcola la classifica) riempio ClaS con ClasVec. Ci sono due possibilità; per ognuna di queste c'è un'anomalia. Boh? Chissà cosa sbaglio :-(
 

Attachments

  • Esempio.zip
    7.8 KB · Views: 324

ellpopeb4a

Member
Licensed User
Longtime User
non so bene che problema hai ma lo sort funziona e la classifica mi sembra in ordine ho modificato solo questo

B4X:
txt1.text=""
    For i=1 To 8
        txt1.text=txt1.text & clas(i).Nome & " - " & clas(i).Punti  & CRLF
    Next
 

Claudio57

Member
Licensed User
Longtime User
Ti sembra che funzioni. Continua a pigiare sul bottone classifica e vedrai che continua ad aumentare i punti. Non devi azzerare il txt1 sennò come fai a vedere da una volta all'altra che aggiunge i punti che non dovrebbe?
 

ellpopeb4a

Member
Licensed User
Longtime User
questo è un bel paradosso tu che l hai fatto lo vedi sbagliato io che lo provo mi sembra giusto
io vedo che le squadre che vincono prendono due punti

Gara(1).nome1="Pisa"
Gara(1).nome2="Roma" <- vince
Gara(1).set1=1
Gara(1).set2=3
Gara(2).nome1="Rovigo"
Gara(2).nome2="Napoli" <- vince
Gara(2).set1=0
Gara(2).set2=3
Gara(3).nome1="Salerno" <- vince
Gara(3).nome2="Imperia"
Gara(3).set1=3
Gara(3).set2=0
Gara(4).nome1="Bologna" <- vince
Gara(4).nome2="Ancona"
Gara(4).set1=3
Gara(4).set2=0

le altre non prendono i due punti
B4X:
clas(z1).Punti=ClasVec(z1).Punti+2 ' assegno sempre due punti per comodità
non so con che logica volevi funzionasse ma x me i conti tornano ;)
 

Claudio57

Member
Licensed User
Longtime User
Cioè, vuoi dirmi che se premi "Classifica" per più di una volta la classifica viene sempre uguale? Cioè, dopo la prima pressione è giusto che la classifica si aggiorni ma con la seconda pressione i punti in classifica non devono più cambiare. Se premi più volte guarda quanti punti ha Bologna. Dovrebbe sempre averne 58 e invece continuano ad aumentare. Non è logico.
 

Claudio57

Member
Licensed User
Longtime User
Ehhhh, bravo! Ma se io ogni volta assegno alla classifica i valori di partenza non dovrebbe cambiare i punteggi, su cerchiamo di essere attenti ;-)
 

Claudio57

Member
Licensed User
Longtime User
Ripeto cosa dovrebbe fare:
All'entrata della sub Btn1_click c'è il ciclo for next che assegna alla classifica da fare i valori della classifica di partenza che nel mio programma viene letta in avvio da un file binario mentre qui l'ho simulata nell'Activity Create. Anche i risultati sono simulati. Quando premo il btn "classifica" entra nella sub e dovrebbe riportare tutti i valori della nuova classifica ai valori della classifica iniziale. E questo che non fa. Non capisco perché. Sto B4A è uno schifo, credetemi.
 

LucaMs

Expert
Licensed User
Longtime User
Hai ragione.
Evidentemente, i tipi, e quindi gli array di tipi, si comportano come le variabili oggetto
(non uso i tipi, molto meglio le classi, dammi retta).

Cmq, con le classi sarebbe lo stesso.

Se tu fai VarOggettoA = VarOggettoB, non è il contenuto della variabile
che finisce in VarOggettoA, ma il riferimento a una zona di memoria
che diventa comune sia a VarOggettoA che a VarOggettoB,
con la conseguenza che se cambi
VarOggettoA.Punti +2
anche VarOggettoB.Punti avrà +2
e viceversa
 

LucaMs

Expert
Licensed User
Longtime User
Comunque, usa due routine:

sub LeggiVecchiaClass, in cui metti:
B4X:
    For i=1 To 8
        Clas(i).nome=ClasVec(i).Nome
        Clas(i).Punti=ClasVec(i).Punti
        Clas(i).SetVinti=ClasVec(i).SetVinti
    Next

sub NuovaGara, in cui metti i calcoli,
MA...
B4X:
    For i = 1 To 4
        Cercaindici (i)
        If Gara(i).set1 > Gara(i).set2 Then    ' vittoria in casa
            Clas(z1).Punti = Clas(z1).Punti + 2 ' assegno sempre due punti per comodità
            Clas(z1).SetVinti = Clas(z1).SetVinti + Gara(i).set1
            Clas(z2).SetVinti = Clas(z2).SetVinti + Gara(i).set2
        End If
        If Gara(i).set1 < Gara(i).set2 Then    ' vittoria in trasferta
            Clas(z2).Punti = Clas(z2).Punti + 2 ' assegno sempre due punti per comodità
            Clas(z1).SetVinti = Clas(z1).SetVinti + Gara(i).set1
            Clas(z2).SetVinti = Clas(z2).SetVinti + Gara(i).set2
        End If      
    Next

DOPO che hai "giocato", chiamato NuovaGara,
salvi la classifica nella "vecchia"
B4X:
    For i=1 To 8
        ClasVec(i).nome=Clas(i).Nome
        ClasVec(i).Punti=Clas(i).Punti
        ClasVec(i).SetVinti=Clas(i).SetVinti
    Next
 

Claudio57

Member
Licensed User
Longtime User
Hai ragione.
Evidentemente, i tipi, e quindi gli array di tipi, si comportano come le variabili oggetto
(non uso i tipi, molto meglio le classi, dammi retta).

Cmq, con le classi sarebbe lo stesso.

Se tu fai VarOggettoA = VarOggettoB, non è il contenuto della variabile
che finisce in VarOggettoA, ma il riferimento a una zona di memoria
che diventa comune sia a VarOggettoA che a VarOggettoB,
con la conseguenza che se cambi
VarOggettoA.Punti +2
anche VarOggettoB.Punti avrà +2
e viceversa
E non c'è modo di "forzare" il passaggio per valore e non per riferimento?

Comunque se vuoi proprio capire perché secondo me B4A fa schifo metti il commento nelle prime 3 righe (quelle "elemento per elemento") e prova a togliere il commento al secondo gruppo (quello "ogni singolo campo"). Così non si aggiornerà nemmeno più la classifica, nemmeno la prima volta. Dimmi se è possibile lavorare con un compilatore così...
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Non è proprio l'deale (perché non usi solo un array, Classifica?)
ma funziona!
E non c'è modo di "forzare" il passaggio per valore e non per riferimento?

Comunque se vuoi proprio capire perché secondo me B4A fa schifo metti il commento nelle prime 3 righe (quelle "elemento per elemento") e prova a togliere il commento al secondo gruppo (quello "ogni singolo campo"). Così non si aggiornerà nemmeno più la classifica, nemmeno la prima volta. Dimmi se è possibile lavorare con un compilatore così...


Sì, infatti prima erano commentato ed ho usato invece quelle.

B4A ti assicuro che non fà schifo; somiglia molto a VB.Net della famosa Microsoft. Tutti i linguaggi "moderni" sono orientati agli oggetti e gli oggetti funzionano per riferimento.

E' solo una questione di abitudine. Anch'io, molti anni fà usavo vb6 e rimasi spaesato all'impatto con VB.Net. Ora non saprei più mettere le mani sul VB6.

Per tornare al tuo progetto... sono tante le cose che io farei diversamente, ma non ho tempo per riscriverlo io e poi... ti toglierei il divertimento e il modo di imparare :).

Ma su una cosa non mi hai risposto e mi sembra importante: perché usare due array diversi per contenere la classifica, che è unica?

P.S. sai cosa fà schifo a me (e qui mi odieranno, ma solo gli italiani che leggono, hehehe)? JAVA!

La cosa peggiore che ha sono quelle maledette parentesi graffe: il codice è illegibile!
 

Attachments

  • Esempio da tipo.zip
    7.8 KB · Views: 371
Last edited:

Claudio57

Member
Licensed User
Longtime User
Perché l'array ClasVec è quello che viene caricato a inizio giornata e man mano che arrivano i risultati viene aggiornata la classifica che viene mandata online.
 

Claudio57

Member
Licensed User
Longtime User
Non funziona neanche l'esempio che mi hai mandato tu. L'unica cosa è leggere dal file binario la classifica vecchia ogni volta che devo aggiornarla.
 

LucaMs

Expert
Licensed User
Longtime User
Non funziona neanche l'esempio che mi hai mandato tu. L'unica cosa è leggere dal file binario la classifica vecchia ogni volta che devo aggiornarla.

Beh, io non so come funzioni la tua app, ma non puoi fare:

l'array classifica sia globale per l'intera app:

all'avvio del Main, carichi la classifica dal file all'array
poi, per ogni gara aggiorni la classifica (l'array UNICO)
e alla chiusura salvi nel file binario?
 

Claudio57

Member
Licensed User
Longtime User
Ma non mi sono ancora spiegata? Forse sono talmente presa da sta cosa che non riesco a farmi capire. I risultati scritti contemporaneamente li ho messi nel programma d'esempio per far vedere che c'è quest'anomalia. In realtà i risultati arrivano in momenti diversi e non si riesce a gestire solo l'ultimo arrivato per com'è fatto tutto il resto del programma. Quindi ogni volta che arriva un risultato nuovo occorre richiamare la classifica che c'era prima dell'inizio delle gare in programma in questo turno per aggiornarla. Ecco perché ho bisogno di una classifica "vecchia" e di quella attuale. Alla fine della giornata con i risultati di tutte le gare viene salvata la nuova classifica che la prossima volta sarà la ClasVec.
 

LucaMs

Expert
Licensed User
Longtime User
Ma non mi sono ancora spiegata? Forse sono talmente presa da sta cosa che non riesco a farmi capire. I risultati scritti contemporaneamente li ho messi nel programma d'esempio per far vedere che c'è quest'anomalia. In realtà i risultati arrivano in momenti diversi e non si riesce a gestire solo l'ultimo arrivato per com'è fatto tutto il resto del programma. Quindi ogni volta che arriva un risultato nuovo occorre richiamare la classifica che c'era prima dell'inizio delle gare in programma in questo turno per aggiornarla. Ecco perché ho bisogno di una classifica "vecchia" e di quella attuale. Alla fine della giornata con i risultati di tutte le gare viene salvata la nuova classifica che la prossima volta sarà la ClasVec.


Mi spiace, sono troppo ottuso, non riesco a capire. ciao.
 

Claudio57

Member
Licensed User
Longtime User
Luca non era mia intenzione offenderti, anzi dovrei solo che ringraziarti per tutto il sostegno che mi hai dato. E' che sono incavolata con me stessa e divento sgarbata ma non era affatto mia intenzione offenderti :)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
'scolta me. Butta via i files binari e passa a SQLite. Eviterai tanti mal di testa e ti si potrà aiutare meglio, perchè userai formati NON proprietari.
Eventualmente, se proprio ti è indispensabile, fai un piccolo programma che converta i vecchi files binari in SQLite.
 
Top