none
Inizializzazione struct in ciclo for RRS feed

  • Domanda

  • Ho questa struttura:

            struct Point {
                public Int32 x, y;
            }


    Nel main ho invece:

            Point p;
            for (Int32 i = 0; i < 10; i++) {
               p.x = p.y = i;
            }

    Nel ciclo for riesco ad inizializzare i membri della struct, mentre se provo ad aggiungere dopo:

            Int32 aa = p.x;

    Mi si avverte che l'utilizzo del campo 'x' probabilmente non è assegnato.
    Se invece aggiungo in precedenza:

        p.x = p.y = 1;
        Int32 aa = p.x;

    'aa' contiene correttamente 1.
    Perché all'interno della for non si riesce ad inizializzare i membri di modo tale che possano essere utilizzati anche al di fuori?
    ciao
    • Modificato cosmopsis sabato 29 settembre 2012 21:31
    sabato 29 settembre 2012 21:30

Risposte

  • Ciao cosmopsis,

    Ho questa struttura:

            struct Point {
                public Int32 x, y;
            }


    Nel main ho invece:

            Point p;
            for (Int32 i = 0; i < 10; i++) {
               p.x = p.y = i;
            }

    Nel ciclo for riesco ad inizializzare i membri della struct, mentre se provo ad aggiungere dopo:

            Int32 aa = p.x;

    Mi si avverte che l'utilizzo del campo 'x' probabilmente non è assegnato.
    Se invece aggiungo in precedenza:

        p.x = p.y = 1;
        Int32 aa = p.x;

    'aa' contiene correttamente 1.
    Perché all'interno della for non si riesce ad inizializzare i membri di modo tale che possano essere utilizzati anche al di fuori?
    ciao

    Va inizializzata la struttura p con New , per meglio spiegare vedi esempio seguente.

    using System;
    
    namespace ConsoleApplication1
    {
        struct MiaStruct
        {
            public Int32 x, y;
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var p = new MiaStruct();
    
                for (var i = 0; i < 10; i++)
                {
                    p.x = p.y = i;
                    Console.WriteLine(String.Concat("Valore p.X = ", p.x, "Valore p.Y = ", p.y));
                }
    
                var aa = p.x;
                Console.WriteLine(aa);
                Console.ReadLine();
            }
        }
    }
    

    Altro suggerimento , se puoi dichiara un nome differente per la struct , e meglio evitare di dare nomi corrispondenti alle parole riservate tipo point ed altre.

    Ciao.


    domenica 30 settembre 2012 07:35

Tutte le risposte

  • Ciao cosmopsis,

    Ho questa struttura:

            struct Point {
                public Int32 x, y;
            }


    Nel main ho invece:

            Point p;
            for (Int32 i = 0; i < 10; i++) {
               p.x = p.y = i;
            }

    Nel ciclo for riesco ad inizializzare i membri della struct, mentre se provo ad aggiungere dopo:

            Int32 aa = p.x;

    Mi si avverte che l'utilizzo del campo 'x' probabilmente non è assegnato.
    Se invece aggiungo in precedenza:

        p.x = p.y = 1;
        Int32 aa = p.x;

    'aa' contiene correttamente 1.
    Perché all'interno della for non si riesce ad inizializzare i membri di modo tale che possano essere utilizzati anche al di fuori?
    ciao

    Va inizializzata la struttura p con New , per meglio spiegare vedi esempio seguente.

    using System;
    
    namespace ConsoleApplication1
    {
        struct MiaStruct
        {
            public Int32 x, y;
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var p = new MiaStruct();
    
                for (var i = 0; i < 10; i++)
                {
                    p.x = p.y = i;
                    Console.WriteLine(String.Concat("Valore p.X = ", p.x, "Valore p.Y = ", p.y));
                }
    
                var aa = p.x;
                Console.WriteLine(aa);
                Console.ReadLine();
            }
        }
    }
    

    Altro suggerimento , se puoi dichiara un nome differente per la struct , e meglio evitare di dare nomi corrispondenti alle parole riservate tipo point ed altre.

    Ciao.


    domenica 30 settembre 2012 07:35
  • Grazie per la risposta

    La creazione della 'p' era volutamente incompleta.

    In pratica ho dimenticato il rapporto che esiste tra lo Stack e Heap memory.

    Per cui si allocando 'p' senza alcun riferimento, non è possibile assegnare nessun valore ad una variabile locale.

    Errore banale.

    ciao

    domenica 30 settembre 2012 22:19