Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Array di strutture aiutooo

    Salve sono nuova ed inizio da una domandona...... GIGANTE!

    Ho fatto una funzione in questa web service che come valore di ritorno (Return) mi deve dare i dati estratti dal DB strutturati come la Public Structure chiamata SERVS1Result (l'ho inserita più giù) e questo me lo fa ma siccome istanziavo la public structure una volta sola il ciclo while mi valorizzava sempre la stessa e come risultato ottenevo solo l'ultima estrazione!
    Ho tentato di mettere un Array di strutture (il codice con il segno <----//) ma mi da errore:

    System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto.
    in SERVS1ClassAccess.SERVS1(String ist)

    Vi incollo il codice deve essere un problema di dichiarazione non so.... Aiutatemiiiii!

    Public Com() As Object '<----------------------------------------///

    [.....altro codice che non serve....]

    If Not risolvi = "" Then
    objConn.Open()


    Dim pc As String
    Dim i As Integer = 0
    Dim x As Integer = 0
    Dim c As Integer
    Dim objCmd2 As New OleDbCommand("Stringa di connessione", objConn)
    Dim objReader2 As OleDbDataReader
    objReader2 = objCmd2.ExecuteReader

    While objReader2.Read
    pc = (objReader2.GetString(9))
    If pc = "Y" Then
    i = i + 1

    Com(i) = New SERVS1Result '<-----------------------------------///

    Com(i).Comm.Nome = objReader2.GetString(2) 'Sede
    Com(i).Comm.Indirizzo = objReader2.GetString(4) 'indirizzo
    Com(i).Comm.telefono = objReader2.GetString(5) 'telefono
    Com(i).Comm.Email = objReader2.GetString(8) 'email
    Com(i).Comm.Cap = CapCom
    Com(i).Comm.Comune = Comune
    Com(i).Comm.SiglaProvincia = Provincia


    End If

    End While

    objConn.Close()
    objConn.Dispose()

    Com(i).NumeroComm = i '<------------------------------------------///


    For c = 0 To Com.Length '<-------------------------------///
    Return Com(c) '<-----------------------------///
    Next


    End If


    End Function


    La struttura inizia qui ed è così:

    Public Structure SERVS1Result
    Public NumeroComm As Integer
    Public Comm As SComm

    Public Structure SComm
    Public Nome As String
    Public Indirizzo As String
    Public Cap As String
    Public Comune As String
    Public SiglaProvincia As String
    Public Email As String
    Public telefono As String
    End Structure
    End Structure

  2. #2
    Dove si verifica l'errore? Perché non usi un array a tipizzazione più stretta?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Grazie per la risposta

    Magari tipo?

    Comunque per me una soluzione vale l'altra, nel senso che se avete idee migliori e le riesco a far funzionare sul mio codice ben venga,

  4. #4
    Originariamente inviato da Kamineko
    Magari tipo?
    Tipo usare un array "Public Com() As SERVS1Result"; tra l'altro accedendo a strutture, siccome sono tipi ByVal, non si può verificare l'eccezione NullReferenceException, per il semplice fatto che di references non ce ne sono.

    Ti ho fatto una domanda ben precisa:
    Originariamente inviato da MItaly
    Dove si verifica l'errore?
    Senza saperlo non posso darti indicazioni più precise.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Ti ringrazio per la risposta, ho trovato è:

    dim com as Nome Struttura

    Redim preserve com(i)

    For c = 0 to com.length
    Return Com
    next

  6. #6
    Redim preserve com(i)
    Mai - e dico mai - usare il redim preserve a meno che non sia strettamente necessario: ogni volta che ridimensioni l'array il runtime deve allocare nuova memoria, copiarci il contenuto dell'array precedente e deallocare la memoria a cui puntava precedentemente l'array; piuttosto se devi aggiungere e togliere elementi usa una lista o una collection (sempre a tipizzazione stretta).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Io ho individuato due errori:
    1- Off By One alla riga:
    codice:
    For c = 0 To Com.Length '<-------------------------------///
      Return Com(c) 
    Next
    Perchè così facendo esegui l'iterazione Come.Length+1 volte e in questo modo avviene il riferimento a un oggetto che non esiste, essendo appena fuori dall'array. Per correggere devi usare una di queste due sintassi:
    codice:
    For c = 0 To Com.Length - 1
      Return Com(c) 
    Next
    oppure
    codice:
    For c = 1 To Com.Length
      Return Com(c) 
    Next
    2- Alla riga:
    codice:
    For c = 0 To Com.Length - 1
      Return Com(c)  '<-------------------------///
    Next
    Oltre a restituire un valore, return termina anche la funzione e quindi otterresti sempre il primo elemento dell'array. Devi dare alla funzione un tipo SERVS1Result() e restituire Com:
    codice:
    Return Com
    Poi, una cosa la chiedo io: cosa fa Preserve dopo ReDim?

  8. #8
    Utente di HTML.it L'avatar di Sypher
    Registrato dal
    Jun 2003
    Messaggi
    1,994
    Originariamente inviato da Il Totem
    Io ho individuato due errori:
    1- Off By One alla riga:
    codice:
    For c = 0 To Com.Length '<-------------------------------///
      Return Com(c) 
    Next
    Perchè così facendo esegui l'iterazione Come.Length+1 volte e in questo modo avviene il riferimento a un oggetto che non esiste, essendo appena fuori dall'array. Per correggere devi usare una di queste due sintassi:
    codice:
    For c = 0 To Com.Length - 1
      Return Com(c) 
    Next
    oppure
    codice:
    For c = 1 To Com.Length
      Return Com(c) 
    Next
    2- Alla riga:
    codice:
    For c = 0 To Com.Length - 1
      Return Com(c)  '<-------------------------///
    Next
    Oltre a restituire un valore, return termina anche la funzione e quindi otterresti sempre il primo elemento dell'array. Devi dare alla funzione un tipo SERVS1Result() e restituire Com:
    codice:
    Return Com
    Poi, una cosa la chiedo io: cosa fa Preserve dopo ReDim?
    il preserve mantiene i dati della array che si sta dimensionando...se nn usi il preserve con la semplice redim ottieni un array dimensionato ma senza valori
    La passera non dura perchè Sypher la cattura!

    "No one like us we don't care, we are millwall, super millwall, we are millwall from the DEN"

  9. #9
    Utente di HTML.it L'avatar di Sypher
    Registrato dal
    Jun 2003
    Messaggi
    1,994
    Originariamente inviato da MItaly
    Mai - e dico mai - usare il redim preserve a meno che non sia strettamente necessario: ogni volta che ridimensioni l'array il runtime deve allocare nuova memoria, copiarci il contenuto dell'array precedente e deallocare la memoria a cui puntava precedentemente l'array; piuttosto se devi aggiungere e togliere elementi usa una lista o una collection (sempre a tipizzazione stretta).
    che intendi per "tipizzazione stretta"?
    La passera non dura perchè Sypher la cattura!

    "No one like us we don't care, we are millwall, super millwall, we are millwall from the DEN"

  10. #10
    Originariamente inviato da Il Totem
    Io ho individuato due errori:
    1- Off By One alla riga:
    codice:
    For c = 0 To Com.Length '<-------------------------------///
      Return Com(c) 
    Next
    Perchè così facendo esegui l'iterazione Come.Length+1 volte e in questo modo avviene il riferimento a un oggetto che non esiste, essendo appena fuori dall'array. Per correggere devi usare una di queste due sintassi:
    codice:
    For c = 0 To Com.Length - 1
      Return Com(c) 
    Next
    oppure
    codice:
    For c = 1 To Com.Length
      Return Com(c) 
    Next
    2- Alla riga:
    codice:
    For c = 0 To Com.Length - 1
      Return Com(c)  '<-------------------------///
    Next
    Oltre a restituire un valore, return termina anche la funzione e quindi otterresti sempre il primo elemento dell'array. Devi dare alla funzione un tipo SERVS1Result() e restituire Com:
    codice:
    Return Com
    Tutte cose giustissime, non avevo osservato con attenzione il codice.
    Poi, una cosa la chiedo io: cosa fa Preserve dopo ReDim?
    Mantiene in memoria gli elementi già presenti nell'array; di seguito uno schemino C/VB per chiarirci:
    codice:
    VB                                   C
    
    Dim x(100) As Integer ===========>+- int * x;
                                      +- x=malloc(100*sizeof(int);
    '...                                 /*...*/
    ReDim x(200) ====================>+- int * temp;
                                      |  temp=x;
                                      |  x=malloc(200*sizeof(int));
                                      +- free(temp);
    '...                                 /*...*/
    ReDim Preserve x(210) ===========>+- int * temp2;
                                      |  temp2=x;
                                      |  x=malloc(210*sizeof(int));
                                      |  memcpy(x, temp2, 200*sizeof(int)); /*ecco il preserve in azione*/
                                      +- free(temp2);
    Come si può immaginare il memcpy porta via un bel po' di tempo...
    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.