Autore Topic: Le costanti, queste sconosciute - molto, molto principiante  (Letto 2980 volte)

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Beh, dopo i convenevoli ora inizio a fare domande inerenti alla programmazione.

La prima: apprezzo il discorso della dichiarazione delle variabili (ero tra quelli che nel basic aveva sempre contestato la mancanza di tale struttura), ho già scritto alcune righe di dichiarazioni ma solo nella forma:

DIM x_prim AS Integer

Ho tentato di inserire il comando Public ottenendo però errore, siccome la scrittura è stata fatta in Fmain.class presumo che li non si debba inserire tale comando perchè è la classe principale, ho provato anche con l'espressione Private, ma anche li il risultato è stato un errore come mai?

La seconda: ho trovato ed anche molto aprezzato la possibilità di inserire delle dichiarazione di constanti, purtroppo anche qua al momento di applicare il tutto ottengo il messaggio di errore: Unespected CONST alla linea 35 in Famin.class e l'espressione proposta è la seguente:

CONST _cond AS String = Chr$(15)   '##### inserisce la scrittura in condensato         #####

Dov'è che sbaglo?

Saluto tutti e ringrazio
Bye by Afo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #1 il: 25 Febbraio 2012, 12:47:21 »
Allora... spiegazione molto, molto principiante:

Consideriamo tre contenitori di valori:
* La "costante", è globale, e comporta che il proprio valore attribuito non possa essere modificato. Così essa non è una variabile in senso stretto. Va posta al di fuori delle routine.
* La variabile "globale" (che nell'esempio sottostante ho chiamato y_glob) può essere utilizzata in tutte le routine della Classe ove è stata dichiarata. Essa va dichiarata e posta al di fuori delle routine; ed il suo valore può essere modificato.
* La variabile "locale" va dichiarata, invece, all'interno di una routine (con Dim e senza che sia preceduta dalle parole Public o Private) comporta che detta variabile potrà essere utilizzata solo all'interno della routine ove è dichiarata.

Esempio riassuntivo:
Codice: gambas [Seleziona]

' questa è una COSTANTE:
  CONST cond AS String = "2 + 1 = "

' questa è una Variabile GLOBALE, ma avendola dichiarata come "Privata"
' potrà essere utilizzata soltanto entro questa Classe:
  Private y_glob AS Integer


Public Sub Button1_Click()

' questa è una Variabile LOCALE
' (potrò utilizzare la seguente variabile solo all'interno di questa routine):
   Dim x_prim AS Integer

  x_prim = 2

  y_glob = x_prim + 1

End


Public Sub Button2_Click()

' qui posso utilizzare la "Costante" e la variabile "Globale"
' in quanto entrambe sono... "globali":
   Print cond & y_glob
 
End


Al riguardo vedere:
http://www.gambas-it.org/wiki/index.php/Le_Variabili
http://www.gambas-it.org/wiki/index.php/Le_Costanti

Altri riferimenti interessanti nel forum sull'argomento:
http://www.gambas-it.org/smf/index.php?topic=50.msg1483#msg1483
http://www.gambas-it.org/smf/index.php?topic=107.0
http://www.gambas-it.org/smf/index.php?topic=1760.0
http://www.gambas-it.org/smf/index.php?topic=1725.msg19184#msg19184
http://www.gambas-it.org/smf/index.php?topic=1374.0
http://www.gambas-it.org/smf/index.php?topic=354.msg7265#msg7265
http://www.gambas-it.org/smf/index.php?topic=1356.msg15332#msg15332
« Ultima modifica: 13 Dicembre 2021, 16:04:52 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #2 il: 25 Febbraio 2012, 13:49:37 »
Grazie vuott,

che la costante sia solo globale era un dettaglio che non stavo considerando, ma nel caso che ho riportato qual'era l'errore? Ho visto che nel tuo esempio inserivi nella costante la stringa "2 + 1 = ", mentre io avevo assegnato Chr$(15), a prima vista mi pare che l'espressione sia valida perchè Chr$(15)  è un carattere e quindi dovrei aver assegnato comunque una stringa, il mio problema non è nell'utilizzo, ma nell'assegnazione stessa che non mi viene accettata.

Per quanto riguarda il discorso delle variabili il discorso è abbastanza analogo, cio che non mi viene accettata è la dichiarazione mi viene accetta la sola dichiarazione con DIM ed un'espressione come quella che mi hai scritto te Public y_glob AS Integer mi ha dato errore, il mio pensiero è che a fare problemi sia la posizione in cui sto facendo il tutto dia problemi..... ti riporto un breve listato in modo che tu possa vedere:


' Gambas class file

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()

  FMain.hide

END

PUBLIC SUB Inizializza()

'##### dichiarazioni array #####

DIM mese AS NEW String[11]

'##### dichiarazioni degli switch di segnalazione #####

DIM sw_prova AS Boolean '##### abilita o disabilita la modalità di prova   #####
PUBLIC sw_ins AS Integer '##### segnale scelta INSERIMENTO             #####
DIM sw_stm AS Integer '##### segnale scelta STAMPA                         #####

'##### dichiarazioni variabili #####

DIM x_prim AS Integer  '##### posizione X relativa del form                ##### forse va eliminata
DIM y_prim AS Integer  '##### posizione Y relativa del form                ##### forse va eliminata

DIM _base AS String    '##### definisce la directori di base del programma #####
CONST _cond AS String  = Chr$(15)  '##### inserisce la scrittura in condensato         #####
DIM shift AS Integer   '##### alineamento bolla                            #####

DIM modello AS Integer '##### tipo di modello usato                        #####

sw_prova = FALSE '##### valore = true  ==> directory di prova  #####
                 '##### valore = false ==> directory di lavoro #####

x_prim = 0 'forse va eliminata
y_prim = 0 'forse va eliminata

IF sw_prova THEN
  _base = "win1_elab_fatt_prove_" 'rivedere l'assegnazione della directory di prova
ELSE
  _base = "win1_elab_fatt_data_" 'rivedere l'assegnazione della directori dei dati
END IF

shift = 2

modello = 1 '##### 0 === > mod. senza fincatura in header #####
            '##### 1 === > mod. con fincatura in header   #####

mese[0] = "Gen"
mese[1] = "Feb"
mese[2] = "Mar"
mese[3] = "Apr"
mese[4] = "Mag"
mese[5] = "Giu"
mese[6] = "Lug"
mese[7] = "Ago"
mese[8] = "Set"
mese[9] = "Ott"
mese[10] = "Nov"
mese[11] = "Dic"

END

PUBLIC SUB ButtonIns_Click()

.
.
.

END

PUBLIC SUB ButtonStop_Click()

  FMain.Close

END

PUBLIC SUB ListBox1_Click()

.
.
.

END


Le due espressioni  PUBLIC e CONST non mi vengono accettate, il resto si, come mai?
Bye by Afo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #3 il: 25 Febbraio 2012, 13:57:39 »
Le due espressioni  PUBLIC e CONST non mi vengono accettate, il resto si, come mai?

Ti ho già scritto  :violent: che le Costanti e le cosiddette "globali" non vanno poste all'interno delle routine; nelle quali possono stare solo le variabili locali dichiarabili premettendo la parola Dim.
Riguardati il mio esempio didattico: le ho messe tutte e tre (le Costanti, le cosiddette "globali" e le Locali). Lì è indicato come usarle.

Pertanto, queste (se non le intendi come locali):

 Public sw_ins As Integer '##### segnale scelta INSERIMENTO             #####

 Const _cond As String = Chr$(15)  '##### inserisce la scrittura in condensato         #####

vanno portate fuori e prima della routine.

Ponile all'inizio del codice, e fai la prova.  :coder:

Queste:

x_prim = 0 'forse va eliminata
y_prim = 0 'forse va eliminata


...sì, le puoi eliminare, perché - così come poste - di partenza sono già uguali a zero.
« Ultima modifica: 26 Febbraio 2012, 01:13:23 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #4 il: 25 Febbraio 2012, 18:48:21 »
In effetti avevo un pelino equivocato e ho provveduto ad eliminare la "PUBLIC SUB Inizializza()" e tutto ha preso funzionare.

Ciò che mi dà ancora problemi è la dichiarazione "Const _cond As String = Chr$(15)" ora anche questa viene accetta, ma ottengo comunque una segnalazione di errore: Sintax error, quindi i dubbi sull'assegnazione della Chr$(15) alla costante erano più fondati di quel che pensavo visto che sostituendolo con una stringa qualsiasi l'espressione viene passata.

Per quanto riguarda le variabili x_prim e y_prim la nota 'forse va eliminata si riferisce alle variabili stesse perché penso che con gambas non ne avrò proprio bisogno; i brandelli di codice che ho inserito derivano da un precedente programma scritto in SuperBasic e quelle due variabili mi servivano per crearmi un riferimento relativo per i form che via via caricavo.

Ciao!
Bye by Afo

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #5 il: 25 Febbraio 2012, 22:44:35 »
La tua
Codice: [Seleziona]
 Const _cond As String = Chr$(15)
contiene un nome campo che comincia con il crt "_". Ci sono caratteri particolari e, credo che "-" sia uno di quelli, possa provocare errori a Gambas. Puoi vedere I caratteri da anteporre ai nomi di costanti o variabili per l'ambiente Gambas in gambas-beginner-guide.pdf
Prova a scrivere
Codice: [Seleziona]
Const $cond As String = Chr$(15)
.
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #6 il: 25 Febbraio 2012, 22:47:49 »
Ciò che mi dà ancora problemi è la dichiarazione "Const _cond As String = Chr$(15)" ora anche questa viene accetta, ma ottengo comunque una segnalazione di errore: Sintax error, quindi i dubbi sull'assegnazione della Chr$(15) alla costante erano più fondati di quel che pensavo visto che sostituendolo con una stringa qualsiasi l'espressione viene passata.

Probabilmente la dichiarazione come Costante è... allergica alle funzioni (quale è appunto Chr$() )

Dichiarala non come costante, ma semplicemente come contenitore globale:

Public _cond As String = Chr$(15)



La tua
Codice: [Seleziona]
 Const _cond As String = Chr$(15)
contiene un nome campo che comincia con il crt "_". Ci sono caratteri particolari e, credo che "-" sia uno di quelli, possa provocare errori a Gambas.
Prova a scrivere
Codice: [Seleziona]
Const $cond As String = Chr$(15)
.
Anche così: $cond dà errore di sintassi.
Come anche senza niente:
Codice: [Seleziona]
Const cond As String = Chr$(15)
dà errore.
« Ultima modifica: 26 Febbraio 2012, 16:53:27 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #7 il: 27 Febbraio 2012, 11:44:50 »
Ricordo che nelle costanti non è possibile associare una variabile o una funzione (es. Chr).
Il valore deve essere definito in fase di dichiarazione e non deve puntare a nessuna cosa al di fuori della dichiarazione stessa.

Ad es.
Codice: [Seleziona]
PUBLIC CONST pippo AS Integer = 1 'Corretto
PRIVATE CONST pluto AS String = "aBc" ' Corretto
PUBLIC CONST paperino AS Long = Clong(0) 'Errato
PRIVATE CONST minni as Boolean = (NOT pippo) ' Errato

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #8 il: 27 Febbraio 2012, 23:45:25 »
A questo punto l'unica è usare una normale variabile stringa, una volta che non viene modificata vale come una costante. :-\
Però è un pò limitativo, anche con il vecchio QB si poteva fare:

CONST false = -1, true = NOT false
Però anche li non era permesso:

CONST cond = CHR$(15)
Quindi mi sa che in ogni caso non ci si poteva fare nulla.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #9 il: 28 Febbraio 2012, 00:09:50 »
A questo punto l'unica è usare una normale variabile stringa, una volta che non viene modificata vale come una costante. :-\

...già !

In vero, la Costante ti consente di sostituire la funzione Chr$() con i caratteri escape attualmente implementati ed attivi:

Carattere escape|Equivalente ASCII
\n|Chr$(13)
\r|Chr$(10)
\t|Chr$(9)

Esempio:
Codice: gambas [Seleziona]
Public Const mia_costante As String = "\t"
« Ultima modifica: 13 Maggio 2012, 23:42:46 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #10 il: 28 Febbraio 2012, 10:47:30 »
Esatto! I valori devono essere fissi, ovvero non ritornati da operazioni e/o funzioni.
La definizione di Costante è appunto diversa da Variabile, perchè non può assumere alcun valore diverso da quello inciso nella dichiarazione. Il fatto che altri linguaggi diano la possibilità di dichiararli attraverso metodi e/o funzioni è un aiuto, ma è sicuramente un pò fuori logica.
Chr() è una funzione che non può essere utilizzata per definire una costante.
Nel tuo caso è necessario dichiarare la costante come indicato da vuott, indicando il valore numerico ASCII corrispondente al carattere voluto.
L'unico problema pootrebbe essere la definizione di caratteri oltre i primi 256 della tabella ASCII di base, oppure i primi della stessa tabella che non sono stampabili. Alcuni possono essere definiti tramite corrispondenti caratteri di escape (vedi TAB="\t"), altrimenti puoi definirli tramite il valore numerico, e utilizzarlo per le conversioni all'interno del tuo programma, es. con Chr().
« Ultima modifica: 28 Febbraio 2012, 10:49:54 da md9327 »

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #11 il: 28 Febbraio 2012, 22:21:35 »
In effetti il problema è veramente corposo, in quelle dichiarazione io vado a definire una serie di caratteri di escape per una stampante Epson e quindi ci si viene a trovare di fronte a stringhe del genere:

  PUBLIC _line AS String = Chr$(27) & Chr$(65) & Chr$(9) '##### imposta altezza riga - 1° misura

Per ora l'ambaradam funziona, voglio però dare un'occhiata ad una tabella dei caratteri ascii per vedere se riesco a riportare il tutto a livello di dichiarazione di costante.

Saluti.
Bye by Afo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #12 il: 28 Febbraio 2012, 23:02:58 »
 PUBLIC _line AS String = Chr$(27) & Chr$(65) & Chr$(9) '##### imposta altezza riga - 1° misura
Per ora l'ambaradam funziona, voglio però dare un'occhiata ad una tabella dei caratteri ascii per vedere se riesco a riportare il tutto a livello di dichiarazione di costante.

La questione ovviamente a questo punto è diventata meramente accademica, dato che in quest'altro modo funziona.
Però il tuo voler studiare ed approfondire la questione con le Costanti conserva il suo interesse e fascino teorico.
Bene.  :coder:
« Ultima modifica: 28 Febbraio 2012, 23:04:41 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #13 il: 01 Marzo 2012, 11:32:12 »
Credo che, purtroppo, non vi siano tutte le corrispondenze escape per tutti i caratteri inferiori a 32 (lo spazio).

Potresti definire un array di interi, corrispondenti ai valori ascii dei singoli caratteri, da convertire poi nelle funzioni che lo richiedono...

Offline Franco_da_vc

  • Grande Gambero
  • ***
  • Post: 215
  • Non è mai troppo tardi!
    • Mostra profilo
Re: Le costanti, queste sconosciute - molto, molto principiante
« Risposta #14 il: 18 Marzo 2012, 14:59:05 »
Riprendiamo la saga della dichiarazione, beh, questa volta non si tratta di dichiarare delle costanti, ma degli array.

Le dichiarazioni avvengono all'interno di una procedura di lettura di un file e sono state scritte in questo modo:

DIM clienti1$ AS NEW String[num - 1, 34]

La scrittura mi pare giusta, però mi da un errore del tipo Unexpettid dim in.... ora il mio interrogativo stà nel fatto che questa dichiarazione l'ho inserita nel corso della procedura e non all'inizio, non penso che ciò possa influenzare, poi mi servono in quel posto perché soli lì e non all'inizio il programma viene a conoscere dei dati necessari alle dichiarazioni stesse.

Che ne dite?

Grazie a tutti e buona domenica!
Bye by Afo