Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    20

    [VB6] Too many local, nonstatic variables

    Ciao a tutti, ho un problema con VB6.

    Sto scrivendo una GUI in VB6 che si interfaccia con una dll C, il cui tipo di dato principale è costituito da un UDT.
    L'UDT in questione è questo:


    codice:
    Public Type Bearing
        F2L_avg_counter As Long  ' Contatore per la media della fase 1->2
        ' In questi vettori metto le somme intermedie per la fase 1->2
        F2L_X_SUM(CAMPIONI_DESIDERATI) As Double
        F2L_Y_SUM(CAMPIONI_DESIDERATI) As Double
        F2L_Z_SUM(CAMPIONI_DESIDERATI) As Double
        ' In questi vettori calcolo le medie per la fase 1->2 e/o metto i valori di confronto letti da file.
        F2_Golden_X(CAMPIONI_DESIDERATI) As Double
        F2_Golden_Y(CAMPIONI_DESIDERATI) As Double
        F2_Golden_Z(CAMPIONI_DESIDERATI) As Double
    
        ' VARIABILI GLOBALI FASE 2
    
        ' Variabili per la gestione delle SM di basso livello (monoassiali)
        F2_SM_curr_x As Long
        F2_SM_next_x As Long
        F2_SM_curr_y As Long
        F2_SM_next_y As Long
        F2_SM_curr_z As Long
        F2_SM_next_z As Long
        
    
        ' Contatori per le SM di basso livello (monoassiali)
        F2_counter_x As Long
        F2_counter_y As Long
        F2_counter_z As Long
    
        ' Variabili per la gestione delle SM di alto livello
        F2_SM_curr As Long
        F2_SM_next As Long
    
        ' Contatori per la SM di alto livello
        F2_OK_counter As Long
        F2_WRN_counter As Long
        F2_DMG_counter As Long
    
    
        ' VARIABILI GLOBALI FASE 1-->2
        F3L_avg_counter As Long ' Contatore per la media della fase 1->3
        ' In questi vettori metto le somme intermedie per la fase 1->3
        F3L_X_SUM(FFNUMBER) As Double
        F3L_Y_SUM(FFNUMBER) As Double
        F3L_Z_SUM(FFNUMBER) As Double
        F3_Golden_X(FFNUMBER) As Double
        F3_Golden_Y(FFNUMBER) As Double
        F3_Golden_Z(FFNUMBER) As Double
    
    
        ' VARIABILI GLOBALI FASE 3
        ' Matrice dove metto i valori per la media di x. Indici: 0->C 1->OR 2->IR 3->B
        F3_AVG_BUFFER_X(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
        ' Indice per la sscrittura sul buffer
        F3_Buffer_Idx_X As Long
        ' Matrice dove metto i valori per la media di y.
        F3_AVG_BUFFER_Y(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
        ' Indice per la scrittura sul buffer
        F3_Buffer_Idx_Y As Long
        ' Matrice dove metto i valori per la media di z.
        F3_AVG_BUFFER_Z(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
        ' Indice per la sscrittura sul buffer
        F3_Buffer_Idx_Z As Long
    
        sum_x(FFNUMBER) As Double 'Somma dei picchi x fare le medie
        sum_y(FFNUMBER) As Double 'Somma dei picchi x fare le medie
        sum_z(FFNUMBER) As Double 'Somma dei picchi x fare le medie
    
        'MACCHINE A STATI
        ' Stati SM di basso livello x
        F3_SM_curr_x_C As Long
        F3_SM_next_x_C As Long
        F3_SM_curr_x_OR As Long
        F3_SM_next_x_OR As Long
        F3_SM_curr_x_IR As Long
        F3_SM_next_x_IR As Long
        F3_SM_curr_x_B As Long
        F3_SM_next_x_B As Long
        ' Contatori SM di basso livello x
        F3_counter_x_C As Long
        F3_counter_x_OR As Long
        F3_counter_x_IR As Long
        F3_counter_x_B As Long
        ' Stati SM di basso livello y
        F3_SM_curr_y_C As Long
        F3_SM_next_y_C As Long
        F3_SM_curr_y_OR As Long
        F3_SM_next_y_OR As Long
        F3_SM_curr_y_IR As Long
        F3_SM_next_y_IR As Long
        F3_SM_curr_y_B As Long
        F3_SM_next_y_B As Long
        ' Contatori SM di basso livello y
        F3_counter_y_C As Long
        F3_counter_y_OR As Long
        F3_counter_y_IR As Long
        F3_counter_y_B As Long
        ' Stati SM di basso livello z
        F3_SM_curr_z_C As Long
        F3_SM_next_z_C As Long
        F3_SM_curr_z_OR As Long
        F3_SM_next_z_OR As Long
        F3_SM_curr_z_IR As Long
        F3_SM_next_z_IR As Long
        F3_SM_curr_z_B As Long
        F3_SM_next_z_B As Long
        ' Stati SM principale
        MAIN_SM_curr As Long
        MAIN_SM_next As Long
    
        ' Contatori SM di basso livello z
        F3_counter_z_C As Long
        F3_counter_z_OR As Long
        F3_counter_z_IR As Long
        F3_counter_z_B As Long
        
        ' Stati per la SM di alto livello
        F3_SM_curr_C As Long
        F3_SM_next_C As Long
        
        F3_SM_curr_OR As Long
        F3_SM_next_OR As Long
        F3_SM_curr_IR As Long
        F3_SM_next_IR As Long
        F3_SM_curr_B As Long
        F3_SM_next_B As Long
        ' Contatori SM di alto livello
        F3_counter_C_OK As Long
        F3_counter_OR_OK As Long
        F3_counter_IR_OK As Long
        F3_counter_B_OK As Long
        F3_counter_C_WRN As Long
        F3_counter_OR_WRN As Long
        F3_counter_IR_WRN As Long
        F3_counter_B_WRN As Long
        F3_counter_C_DMG As Long
        F3_counter_OR_DMG As Long
        F3_counter_IR_DMG As Long
        F3_counter_B_DMG As Long
        ' Contatori SM principale
        MAIN_SM_pkt_counter As Long
        MAIN_SM_window_counter As Long
        MAIN_SM_last_ret As Long
    
        packet(DATIPACCH) As Byte
        MAIN_x(CAMPIONI_DESIDERATI) As Double
        MAIN_y(CAMPIONI_DESIDERATI) As Double
        MAIN_z(CAMPIONI_DESIDERATI) As Double
    
            ' FILTRO FIR
        statFirValues_X(FIR_TAP_NUMBER) As Double
        statFirValues_Y(FIR_TAP_NUMBER) As Double
        statFirValues_Z(FIR_TAP_NUMBER) As Double
    
    
        'COSTANTI DEL CUSCINETTO
    
        ' Soglie per la fase 1->2
        F2L_X_TH As Double
        F2L_Y_TH As Double
        F2L_Z_TH As Double
    
    
        ' Soglie da sommare alla media per il calcolo dell'errore
        C_THRESHOLD As Double
        OR_THRESHOLD As Double
        IR_THRESHOLD As Double
        B_THRESHOLD As Double
    
        ' Costanti del cuscinetto
        ' Ball diameter
        DB As Double
        ' Pitch diameter
        DP As Double
        ' Number of rolling elements
        NB As Double
        ' Ball contact angle (rad)
        TETA As Double
    
        temperature(CAMPIONI_DESIDERATI) As Double
        temperature_cnt As Long
    
    
    End Type
    per la cronaca son sicuro che il tutto funzioni correttamente... anche perchè oregon mi ha dato una grossa mano in passato.

    Ora... l'algoritmo implementato in C è la traduzione di un algoritmo Matlab usato a suo tempo come test. Stavo testando il comportamento del mio programma, verificando che i risultati che fornisce siano identici a quelli che forniva matlab.
    A questo punto però mi sono accorto di un errore, ho indagato le cause e son giunto alla conclusione che per far funzionare correttamente l'algoritmo dovrei aumentare la grandezza di alcuni buffer, precisamente:

    F3_AVG_BUFFER_X
    F3_AVG_BUFFER_Y
    F3_AVG_BUFFER_Z

    che son così definiti:
    codice:
    F3_AVG_BUFFER_X(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
    F3_AVG_BUFFER_Y(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
    F3_AVG_BUFFER_Z(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
    Io dovrei aumentare il valore di F3_AVG_BUFFER_LENGTH che fino ad ora è stato 16.
    L'idea era quella di provare a dichiararlo davvero molto grosso, ovvero 1024, 2048 o addirittura 4096.

    In C ovviamente nessun problema... in VB mi salta fuori un:

    "Fixed or static data can't be larger than 64K"

    al che ho iniziato a diminuire la grandezza del buffer fino a che l'errore non è sparito...ovvero con

    F3_AVG_BUFFER_LENGTH = 456.

    Il mio programma inizia con una schermata di selezione della lingua, dopodichè viene caricata la configurazione del sistema da un file, il che comporta avere una variabile di tipo bearing.

    A questo punto mi salta fuori l'errore:

    "Too many locals, nonstatic variables"

    ho provato a diminuire ancora il valore di F3_AVG_BUFFER_LENGTH e quando vale 110 non mi da più problemi, ma non è ancora abbastanza per il corretto funzionamento del mio programma...
    qualcuno sa come posso fare per risolvere questo problema?

    Grazie mille in anticipo


    Apo

  2. #2
    Ciao,
    incuriosito dall'errore per me nuovo ho fatto una ricerca e trovato questo

    http://support.microsoft.com/?scid=k...79140&x=6&y=12

    HTH

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    20
    Grazie mille... è uno sbattone infinito (il mio programmaè quasi alla fine... quindi dovrò modificare un casino di roba) ma mi sa che è l'unica soluzione.

    Solo una cosa... nella pagina dice

    "Manually calculate the size necessary for the UDT"

    ora, il mio UDT è enorme, tra l'altro i vettori di VB non usano solo lo spazio necessario per salvare n valori di un tipo ma hanno delle sorta di intestazioni in più quindi dovrei fare un calcolo assurdo con una probabilità di commetere un errore molto alta....
    mi chiedevo... ma se per calcolare la grandezza uso:

    Size = Len(bearing)

    non dovrei avere il numero di byte richiesti per salvare il mio UDT?
    Sto dicendo una stupidaggine?

  4. #4
    [OT]Fossi in te scriverei la GUI in questione in .NET, almeno usi un linguaggio più moderno e non hai limitazioni di questo genere.[/OT]
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    20
    Fosse per me farei la stessa cosa... ma non comendo io... i capi han deciso così e mi tocca fare così

  6. #6
    Potresti lasciare gestire la struttura in questione solo alla parte C del programma, che fornirebbe una serie di funzioni per operare su di essa; l'applicazione VB6 otterrebbe solo un handle "opaco" alla struttura (di fatto potrebbe essere un normale puntatore ad essa per la parte C), su cui opererebbe solo tramite le funzioni in questione.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.