Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    2

    [C/C++] Scorrere un array di struct di cui non si conosce la dimensione

    Salve a tutti, ho il seguente problema: ho una funzione che mi restituisce una array di struct, io non so quanti sono gli elementi che compongono il vettore ma ho la necessità di convertire ogni elemento dell'array in stringa.

    [CODE]
    struct Struttura {
    char campo1[17];
    char campo2[3];
    char campo3[10];
    }

    char* convert(Struttura* s) {

    while(*s) {
    //effettua conversione
    *s++;
    }

    }
    [\CODE]

    il mio problema e che l'istruzione while(*s) non viene compilata mi dà l'errore: "Cannot convert *s to bool". Sono proprio disperato in quanto per scorrere gli array di tipi base ho sempre fatto allo stesso modo e ha sempre funzionato.

    Spero che qualcuno possa aiutarmi ad uscire dalla disperazione (internet non riesce a darmi nessuna risposta), ringrazio tutti anticipatamente.

  2. #2
    Non puoi scorrere un array senza saperne le dimensioni o senza una convenzione particolare sull'ultimo elemento. Il while(*s) che citi normalmente funziona perché consideri che l'array che stai scorrendo abbia 0 come ultimo valore, ma è giustappunto una convenzione, non c'è un modo preciso per sapere il numero di elementi che effettivamente contiene. Cambia la definizione della funzione in modo da avere un valore che ti indichi il numero di elementi, oppure stabilisci una convenzione per cui, ad esempio, al termine dell'array ci sia una struttura con tutte stringhe nulle.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    2
    ok, ti ringrazio

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Se sei sicuro che il blocco sia allocato sull'heap, puoi usare _msize per conoscerne la dimensione in bytes.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Occhio però che _msize non è standard, è supportato solo da Visual C++; inoltre funziona solo se:
    • il blocco allocato è stato interamente utilizzato per la struttura in questione; la questione non è così ovvia, visto che malloc può restituire blocchi più grandi del richiesto:
      The malloc function allocates a memory block of at least size bytes. The block may be larger than size bytes because of space required for alignment and maintenance information.
      ;
    • il blocco è stato allocato con l'allocator della stessa CRT di cui richiami _msize. Di conseguenza non funzionerà se per allocare il blocco è stata usata una API di allocazione della memoria come GlobalAlloc, HeapAlloc, LocalAlloc o altre API di gestione della memoria (ad esempio MapViewOfFile); inoltre non è garantito che funzioni se è stata allocata con new (anche se di solito new usa internamente malloc), né funzionerà se il codice che ha allocato il blocco usa una CRT differente, come una CRT di una versione diversa di Visual C++ o di un altro compilatore, un'altra versione della stessa CRT (ad esempio, CRT di debug vs CRT di release, CRT a linking dinamico vs CRT a linking statico, eccetera), cosa piuttosto frequente se il tuo codice o il codice che ha allocato il blocco è in una libreria.

    In sostanza, ti sconsiglio di utilizzarlo, mi pare una feature utile solo in casi estremamente rari (ad esempio nella creazione di garbage collector, bounds checker, leaks detector o altro codice di gestione e controllo della memoria).
    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.