Ereditare variabili struct su un altra function

di il
8 risposte

Ereditare variabili struct su un altra function

Salve, io ho copiato dei valori di una struct su una function e quando la visualizzo mi compare solo l'ultimo elemento, come posso fare affinchè posso rendere visibile tutti i dati della struttura su un altra classe?

properties
        
        
                
                                            s=struct('visita',{},'contatore',1,'capacita',0);

                                            

    end


 function insert(self,n)
              
            
               
                      self.s.visita(n)=self;

                     
                      
                  self.s(1).contatore=n;

          
        
           
           self.s(1).capacita=100;
           
            
            
              
             display(self.s(1).contatore);

            
            
              for i=1:self.s(1).contatore
                
               for j=1:self.s(1).contatore
                    
                    
              if strcmp(self.s.visita(i),self.s.visita(j))
                
            self.s(1).contatore=self.s(1).contatore+1;            
                
                
                
                display(self.s(1).contatore);
                
              end
              
               end
              
               
               
              end
              
             
              
              
          end
          
               
              
              
                
                
Quando richiamo self.s.visita(1) e posizione 2 mi restituisce l'ultimo elemento inserito ossia per esempio KK KK

Cioè io voglio che i dati inseriti su una struttura in una function sono visibili in un altra function senza usare global, perchè mi hanno detto che global nn può essere inizializzata in un metodo(mi hanno detto non farlo per scelta), come posso fare?

8 Risposte

  • Re: Ereditare variabili struct su un altra function

    Il codice che hai inserito è incompleto per cui è difficile, se non impossibile comprenderlo.

    Come nelle domande precedenti i termini "tecnici" (i tipi delle variabili ecc.) sono usati in modo improprio:

    Cosa di intende con:

    ho copiato dei valori di una struct su una function?
    I valori dei campi di una struttura si possono assegnare a campi di altre strutture o variabili.

    quando la visualizzo mi compare solo l'ultimo elemento
    cosa visualizzi? Una nuova struttura?


    rendere visibile tutti i dati della struttura su un altra classe
    quale altra classe? Come è definita?

    Nel codice della funzione che hai pubblicato, "self" è un parametro di input.
    Nella prima istruzione:

    self.s.visita(n)=self;

    viene assegnato ad un campo "di se stesso"; questo dovrebbe generare un messaggio di errore.

    Come è definito il parametro "self" che viene passato alla funzione?

    Dovresti pubblicare la parte del codice dove "self" viene definito o creato (se è un'istanza di una qualche classe) e, quindi come viene chiamata la funzione "insert".

    Mi sembra strano che quanto hai scritto non generi un messaggio di errore.

    Hope this helps.
  • Re: Ereditare variabili struct su un altra function

    ask_raf ha scritto:


    Il codice che hai inserito è incompleto per cui è difficile, se non impossibile comprenderlo.

    Come nelle domande precedenti i termini "tecnici" (i tipi delle variabili ecc.) sono usati in modo improprio:

    Cosa di intende con:

    ho copiato dei valori di una struct su una function?
    I valori dei campi di una struttura si possono assegnare a campi di altre strutture o variabili.

    quando la visualizzo mi compare solo l'ultimo elemento
    cosa visualizzi? Una nuova struttura?


    rendere visibile tutti i dati della struttura su un altra classe
    quale altra classe? Come è definita?

    Nel codice della funzione che hai pubblicato, "self" è un parametro di input.
    Nella prima istruzione:

    self.s.visita(n)=self;

    viene assegnato ad un campo "di se stesso"; questo dovrebbe generare un messaggio di errore.

    Come è definito il parametro "self" che viene passato alla funzione?

    Dovresti pubblicare la parte del codice dove "self" viene definito o creato (se è un'istanza di una qualche classe) e, quindi come viene chiamata la funzione "insert".

    Mi sembra strano che quanto hai scritto non generi un messaggio di errore.

    Hope this helps.

    Allora , il mio obiettivo sarebbe quello di inserire dei valori in una struct in una function e visualizzarli in un altra function.

    Io ho operato nel modo seguente:

    1) ho copiato i valori della struct posizione per posizione da cui a self viene passato un valore
    self.s.visita(n)=self

    self='prova' ad esempio e copio nella struttura prova

    poi un altra volta la richiamo e copio un nuovo valore 'prova2'

    posizione per posizone e , il problema come si fà a farlo rendere visibile i dati di una struttura su un altra classe?
  • Re: Ereditare variabili struct su un altra function

    signfra ha scritto:


    ask_raf ha scritto:


    Il codice che hai inserito è incompleto per cui è difficile, se non impossibile comprenderlo.

    Come nelle domande precedenti i termini "tecnici" (i tipi delle variabili ecc.) sono usati in modo improprio:

    Cosa di intende con:

    ho copiato dei valori di una struct su una function?
    I valori dei campi di una struttura si possono assegnare a campi di altre strutture o variabili.

    quando la visualizzo mi compare solo l'ultimo elemento
    cosa visualizzi? Una nuova struttura?


    rendere visibile tutti i dati della struttura su un altra classe
    quale altra classe? Come è definita?

    Nel codice della funzione che hai pubblicato, "self" è un parametro di input.
    Nella prima istruzione:

    self.s.visita(n)=self;

    viene assegnato ad un campo "di se stesso"; questo dovrebbe generare un messaggio di errore.

    Come è definito il parametro "self" che viene passato alla funzione?

    Dovresti pubblicare la parte del codice dove "self" viene definito o creato (se è un'istanza di una qualche classe) e, quindi come viene chiamata la funzione "insert".

    Mi sembra strano che quanto hai scritto non generi un messaggio di errore.

    Hope this helps.

    Allora , il mio obiettivo sarebbe quello di inserire dei valori in una struct in una function e visualizzarli in un altra function.

    Io ho operato nel modo seguente:

    1) ho copiato i valori della struct posizione per posizione da cui a self viene passato un valore
    self.s.visita(n)=self

    self='prova' ad esempio e copio nella struttura prova

    poi un altra volta la richiamo e copio un nuovo valore 'prova2'

    posizione per posizone e , il problema come si fà a farlo rendere visibile i dati di una struttura su un altra classe?
    quando io visualizzo all'interno della struttura mi da solo l'ultimo elemento inserito in questo caso posizione 1 vuota posizione2 'prova2'
    come mai?
  • Re: Ereditare variabili struct su un altra function

    ask_raf ha scritto:


    Il codice che hai inserito è incompleto per cui è difficile, se non impossibile comprenderlo.

    Come nelle domande precedenti i termini "tecnici" (i tipi delle variabili ecc.) sono usati in modo improprio:

    Cosa di intende con:

    ho copiato dei valori di una struct su una function?
    I valori dei campi di una struttura si possono assegnare a campi di altre strutture o variabili.

    quando la visualizzo mi compare solo l'ultimo elemento
    cosa visualizzi? Una nuova struttura?


    rendere visibile tutti i dati della struttura su un altra classe
    quale altra classe? Come è definita?

    Nel codice della funzione che hai pubblicato, "self" è un parametro di input.
    Nella prima istruzione:

    self.s.visita(n)=self;

    viene assegnato ad un campo "di se stesso"; questo dovrebbe generare un messaggio di errore.

    Come è definito il parametro "self" che viene passato alla funzione?

    Dovresti pubblicare la parte del codice dove "self" viene definito o creato (se è un'istanza di una qualche classe) e, quindi come viene chiamata la funzione "insert".

    Mi sembra strano che quanto hai scritto non generi un messaggio di errore.

    Hope this helps.


    
    
    classdef contatore
        %UNTITLED Summary of this class goes here
        %   Detailed explanation goes here
        
        properties
            
            
                    
                        s=struct('visita',{},'contatore',1,'capacita',0);
    
                                                
                    conta;
        end
        
        methods(Static)
            
    
            function r=setGlobalx(self,n)
    
    global x
    
    r=x;
    
    self.s(1).visita(n)=self;
    
    x=self.s(1).visita(n);
    
    for i=1:n
    display(self.s(1).visita(i));
    
    end
            end
            
                    
    function r2 = getGlobalx()
        
    
     
    r2(1)=contatore.setGlobalx(1,1);
    r2(2)=contatore.setGlobalx(2,2);
    r2(3)=contatore.setGlobalx(3,3);
    
    
    end
    
    
    
    
    
    
    ans =
    
         1
    
    Warning: Struct field assignment overwrites a value with class "double". See MATLAB R14SP2
    Release Notes, Assigning Nonstructure Variables As Structures Displays Warning, for details. 
    > In contatore>contatore.setGlobalx at 24
      In contatore>contatore.getGlobalx at 40 
    
    ans =
    
         0
    
    
    
    ans =
    
         2
    
    Warning: Struct field assignment overwrites a value with class "double". See MATLAB R14SP2
    Release Notes, Assigning Nonstructure Variables As Structures Displays Warning, for details. 
    > In contatore>contatore.setGlobalx at 24
      In contatore>contatore.getGlobalx at 41 
    
    ans =
    
         0
    
    
    ans =
    
         0
    
    
    ans =
    
         3
    
    
    
    
    Infatti visualizzo prima 1, inserisco 2 e viene visualizzato 0 e 2 , inserisco 3 e viene visualizzato 003

    e io voglio che i visualizzi 1 2 3
  • Re: Ereditare variabili struct su un altra function

    Ho provato a scrivere una risposta dettagliata per, ma mi sono reso conto che sarebbe stata troppo lunga e complicata.

    Ti segnalo un paio di errori presenti nello script che hai inviato ed inserisco, in calce una versione modificata della definizione della classe ed uno script con un possibile esempio di utilizzo della classe stessa:

    [*] nella definizione della classe mancano 2 "end" alla fine dello script: il primo per "chiudere" la sezione "methods", il secondo per "chiudere" la definizione stessa della classe
    [*] il nome del primo parametro della funzione "setGlobalx" deve essere cambiato affinchè non venga generato un messaggio di errore

    In generale, una funzione chiamata "get ..." dovrebbe limitarsi a ritornare il valore di una property.
    La funzione "getGlobalx" che hai definito, invece, chiama la funzione "setGlobalx" la quale, coerentemente con il suo nome, "setta" dei valori.

    Ho modificato la funzione "getGlobalx" in modo che si limiti a "ritornare" il valore di una property.
    Per settare i valori delle istanze della classe "contatore" bisogna chiamare la funzione "setGlobalx"

    Per quanto riguarda la definizione delle funzioni, ho anche aggiunto alcuni parametri di input.


    Non sono riuscito a capire il significato / la necessità della variabile globale "x" nella definizione aggiornata della classe e nello script di esempio non l'ho usata.

    Definizione aggiornata della classe "contatore"
    
    
    classdef contatore
       %UNTITLED Summary of this class goes here
       %   Detailed explanation goes here
       
       properties
    % modificata inizializazinoe del campo "visita"      
          s=struct('visita',[],'contatore',1,'capacita',0);
          conta;
       end
       methods(Static)
    % Aggiunto un parametro e modificato il nome del parametro "self"
          function r=setGlobalx(cont_class,input_1,n)
    % Eliminata (commentata) la definizione della varaibile globale
    %          global x
    % Eliminata l'assegnazione della variabile globale alla varaibile di output
    % della funzione
    %          r=x;
             cont_class.s(1).visita(n)=input_1;
    % Assegnazione del valore del campo "vista" alla varaibile di output della
    % funzione
             r=cont_class;
             
             for i=1:n
                disp('Valore di "visita settato nella funzione "setGlobalx= ')
                disp(num2str(cont_class.s(1).visita(i)));
             end
          end
          
    % Funzione modificata: ritorna solo il valore della property "visita"
    % Assegnato un paramtro di input: l'istanza della classe della quale si
    % vogliono acquisire i valori
          function r2 = getGlobalx(input_class)
             r2=input_class.s(1).visita;
          end
          
    % Primo "end" aggiunto
       end
    % Secondo "end" aggiunto      
    end
    
    Script di esempio per la creazione e l'utilizzo della classe "contatore"
    
    
    % Creazione di un'istanza della classe "contatore"
    cont_class=contatore;
    
    % Utilizzo della funzione (method "setGlobalx"): il campo (l'array)
    % "visita" dell'istanza "cont_class"
    
    for n=1:3
    % Definizione di "un valore" da assegnare al campo "visita"
       val=n*2
    % Chiamata del method "setGlobalx"   
       cont_class=cont_class.setGlobalx(cont_class,val,n);
    end
    
    % Stampa nella Command Window dei valori settati
    cont_class.s(1).visita
    
    
    % Utilizzo della funzione "getGlobalx" per "acquisire" i valori assegnati
    % alla property "visita" dell'istanza "cont_class" tramite le chiamate alla
    % funzione "setGlobalx" effettuate in precedenza
    
    var_out=cont_class.getGlobalx(cont_class)
    
    Hope this helps.
  • Re: Ereditare variabili struct su un altra function

    ask_raf ha scritto:


    Ho provato a scrivere una risposta dettagliata per, ma mi sono reso conto che sarebbe stata troppo lunga e complicata.

    Ti segnalo un paio di errori presenti nello script che hai inviato ed inserisco, in calce una versione modificata della definizione della classe ed uno script con un possibile esempio di utilizzo della classe stessa:

    [*] nella definizione della classe mancano 2 "end" alla fine dello script: il primo per "chiudere" la sezione "methods", il secondo per "chiudere" la definizione stessa della classe
    [*] il nome del primo parametro della funzione "setGlobalx" deve essere cambiato affinchè non venga generato un messaggio di errore

    In generale, una funzione chiamata "get ..." dovrebbe limitarsi a ritornare il valore di una property.
    La funzione "getGlobalx" che hai definito, invece, chiama la funzione "setGlobalx" la quale, coerentemente con il suo nome, "setta" dei valori.

    Ho modificato la funzione "getGlobalx" in modo che si limiti a "ritornare" il valore di una property.
    Per settare i valori delle istanze della classe "contatore" bisogna chiamare la funzione "setGlobalx"

    Per quanto riguarda la definizione delle funzioni, ho anche aggiunto alcuni parametri di input.


    Non sono riuscito a capire il significato / la necessità della variabile globale "x" nella definizione aggiornata della classe e nello script di esempio non l'ho usata.

    Definizione aggiornata della classe "contatore"
    
    
    classdef contatore
       %UNTITLED Summary of this class goes here
       %   Detailed explanation goes here
       
       properties
    % modificata inizializazinoe del campo "visita"      
          s=struct('visita',[],'contatore',1,'capacita',0);
          conta;
       end
       methods(Static)
    % Aggiunto un parametro e modificato il nome del parametro "self"
          function r=setGlobalx(cont_class,input_1,n)
    % Eliminata (commentata) la definizione della varaibile globale
    %          global x
    % Eliminata l'assegnazione della variabile globale alla varaibile di output
    % della funzione
    %          r=x;
             cont_class.s(1).visita(n)=input_1;
    % Assegnazione del valore del campo "vista" alla varaibile di output della
    % funzione
             r=cont_class;
             
             for i=1:n
                disp('Valore di "visita settato nella funzione "setGlobalx= ')
                disp(num2str(cont_class.s(1).visita(i)));
             end
          end
          
    % Funzione modificata: ritorna solo il valore della property "visita"
    % Assegnato un paramtro di input: l'istanza della classe della quale si
    % vogliono acquisire i valori
          function r2 = getGlobalx(input_class)
             r2=input_class.s(1).visita;
          end
          
    % Primo "end" aggiunto
       end
    % Secondo "end" aggiunto      
    end
    
    Script di esempio per la creazione e l'utilizzo della classe "contatore"
    
    
    % Creazione di un'istanza della classe "contatore"
    cont_class=contatore;
    
    % Utilizzo della funzione (method "setGlobalx"): il campo (l'array)
    % "visita" dell'istanza "cont_class"
    
    for n=1:3
    % Definizione di "un valore" da assegnare al campo "visita"
       val=n*2
    % Chiamata del method "setGlobalx"   
       cont_class=cont_class.setGlobalx(cont_class,val,n);
    end
    
    % Stampa nella Command Window dei valori settati
    cont_class.s(1).visita
    
    
    % Utilizzo della funzione "getGlobalx" per "acquisire" i valori assegnati
    % alla property "visita" dell'istanza "cont_class" tramite le chiamate alla
    % funzione "setGlobalx" effettuate in precedenza
    
    var_out=cont_class.getGlobalx(cont_class)
    
    Hope this helps.


    Valore di "visita settato nella funzione "setGlobalx=
    2
    Valore di "visita settato nella funzione "setGlobalx=
    Attempted to access cont_class.s.visita(2); index out of bounds because
    numel(cont_class.s.visita)=1.

    Error in visita_nodo.setGlobalx (line 37)
    disp(num2str(cont_class.s(1).visita(i)));

    Error in visita_nodo.prova (line 68)
    visita_nodo.setGlobalx(cont_class,val,n);

    Siccome mi dava errore durante l'esecuzione della mia function di prova ho settato nomeclasse.setglobalx

    il problema mi da il seguente errore cioè dopo il secondo ciclo for mi da errore.
  • Re: Ereditare variabili struct su un altra function

    Ho provato, per scrupolo, a copiare il codice che avevo inserito nella precedente risposta ed a seguirlo.

    Non ho ricevuto nessun messaggio di errore.

    Questo è quanto viene scritto nella Command Window durante l'eecuzione:
    
    val =
    
         2
    
    Valore di "visita settato nella funzione "setGlobalx= 
    2
    
    val =
    
         4
    
    Valore di "visita settato nella funzione "setGlobalx= 
    2
    Valore di "visita settato nella funzione "setGlobalx= 
    4
    
    val =
    
         6
    
    Valore di "visita settato nella funzione "setGlobalx= 
    2
    Valore di "visita settato nella funzione "setGlobalx= 
    4
    Valore di "visita settato nella funzione "setGlobalx= 
    6
    
    ans =
    
         2     4     6
    
    
    var_out =
    
         2     4     6
    
    Io uso MatLab R2012b

    Per caso hai fatto qualche modifica al codice?

    Hope this helps.
  • Re: Ereditare variabili struct su un altra function

    ask_raf ha scritto:


    Ho provato, per scrupolo, a copiare il codice che avevo inserito nella precedente risposta ed a seguirlo.

    Non ho ricevuto nessun messaggio di errore.

    Questo è quanto viene scritto nella Command Window durante l'eecuzione:
    
    val =
    
         2
    
    Valore di "visita settato nella funzione "setGlobalx= 
    2
    
    val =
    
         4
    
    Valore di "visita settato nella funzione "setGlobalx= 
    2
    Valore di "visita settato nella funzione "setGlobalx= 
    4
    
    val =
    
         6
    
    Valore di "visita settato nella funzione "setGlobalx= 
    2
    Valore di "visita settato nella funzione "setGlobalx= 
    4
    Valore di "visita settato nella funzione "setGlobalx= 
    6
    
    ans =
    
         2     4     6
    
    
    var_out =
    
         2     4     6
    
    Io uso MatLab R2012b

    Per caso hai fatto qualche modifica al codice?

    Hope this helps.
    Buonasera, tutto ok, ora il problema sarebbe il seguente:

    ho questa funzione


    function r=s
    etGlobalx(cont_class,input_1,n)
    % Eliminata (commentata) la definizione della varaibile globale
    %          global x
    % Eliminata l'assegnazione della variabile globale alla varaibile di output
    % della funzione
    %          r=x;
             cont_class.s6(1).id(n)=input_1;
             cont_class.s6(1).value(n)=input_1;
    % Assegnazione del valore del campo "vista" alla varaibile di output della
    % funzione
             r=cont_class;
             
             for i=1:n
                disp('Valore di "visita settato nella funzione "setGlobalx= ')
                disp(num2str(cont_class.s6(1).id(i)));
             end
          end
    
    con un ciclo for inserisco uno alla volta i valori alla struct però visualizzando la struttura mi restituisce solo l'ultimo valore inserito.

    per esempio
    
    for k=1:2
    
    if k==1
    
    input_1=1;
    
    end
    
    if k==2
    
    input_1=2;
    
    end
    classe=classe.setglobalx(classe,input_1,k);
    
    end
    
    ;

    e facendo display(classe.s6(1));

    mi restituisce solo l'ultimo valore delle seconda posizione. i valori inseriti nella prima posizione sono nulli.

    Come mai?
Devi accedere o registrarti per scrivere nel forum
8 risposte