Visualizzazione dei risultati da 1 a 5 su 5

Discussione: *char[n] in pascal

  1. #1
    Utente di HTML.it L'avatar di smt
    Registrato dal
    Jul 2002
    Messaggi
    167

    *char[n] in pascal

    devo utilizzare una libreria c per scrivere in una base dati proprietaria, da delphi, la libreria è statica in c è stata wrappata in una dll da un'altro sviluppatore(con VC++) e ricomplilata.
    ora la cosa sostanzialmente funziona bene con gli interi, cove bene o male riesco a passargli tipi di dati che occupano la stessa quantità di memoria, ma con le stringhe non riesco a capire se devo dichiarare i record in delphi con un
    mio_campo: string[n];
    oppure
    mio_campo: array[o..n] of char;

    per simulare un *char[n] richiesto dalla libreria.

    premetto che non sono esperto ne con delphi ne con c.
    grassie
    Reality is that which, when you stop believing in it, doesn't go away

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Credo che, a livello Delphi, entrambe le strutture dati che hai proposto siano compatibili ed intercambiabili.

    Una stringa di lunghezza fissa non è altro che un array di caratteri.

    Ti vengono restituiti errori dalla libreria? Errori di che tipo?

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di smt
    Registrato dal
    Jul 2002
    Messaggi
    167
    purtroppo la libreria in questione non è pensata per essere distribuita, e se ne esce con codici di errore numerici che non si riesce ad interpretare.
    credo che un array of char e una string siano differenti e non campatibili perché se cerco di assegnere un oggetto stringa ad un array of char non compila.

    oltre a questo non ho chiarezza sul terminatore \0 di stringa,
    in c se una stringa è definita come *char[10] mi pare che possa allocare 9 caratteri + il terminatore, se non erro.
    in pascal ignoro come funzioni l'array mentre mi sembra che string si arrangi a terminare la stringa senza che me ne debba preocupare io; ho capito bene?
    Reality is that which, when you stop believing in it, doesn't go away

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Purtroppo non conosco bene il C per poterti dare maggiori indicazioni a riguardo, ma posso dirti quello che so riguardo alle stringhe in Delphi...magari giungi autonomamente alla soluzione.

    In Delphi ci sono diverse tipi di stringhe; il tipo generico string corrisponde ad una AnsiString: si tratta di una struttura dati particolare (non standard) che viene gestita dal memory manager di Delphi e consente di ottimizzare l'allocazione di memoria per le stringhe.

    Poi, esiste la stringa a lunghezza fissa che viene dichiarata con string[lunghezza]: questa viene rappresentata in memoria come un array di caratteri (locazioni di byte consecutive che contengono i singoli caratteri di una stringa più una locazione iniziale aggiuntiva che contiene il numero di caratteri).

    Entrambe queste strutture dati non sono terminate da un carattere nullo come generalmente si aspettano le funzioni API di Windows, ad esempio, ma Delphi è in grado di implementare questa rappresentazione facendo un cast della propria variabile stringa al tipo PChar, il puntatore a carattere.

    Ad esempio, avendo una stringa "abc" immagazzinata in memoria, passando ad una funzione API (che si aspetta un puntatore a carattere) la forma PChar(stringa), Delphi costruisce al volo una rappresentazione della stringa terminata da un carattere nullo e ne passa il puntatore al primo carattere alla funzione.

    In definitiva, forse dovresti tentare di modificare il prototipo della funzione importata in Delphi usando il tipo PChar e, successivamente, passare la stringa memorizzata (sia di lunghezza fissa che variabile o come array di caratteri) castandola a PChar come descritto sopra.

    Prova così e vediamo cosa succede.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di smt
    Registrato dal
    Jul 2002
    Messaggi
    167
    grazie mille, sei di grande aiuto, provo e ti faccio sapere !
    Reality is that which, when you stop believing in it, doesn't go away

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.