sto imparando la lingua D (lo so C++ bene) ... voglio fare alcune cose specifiche di Windows così ho scritto questo solo per provare l'API:Conversione di un array di carattere temporaneo ad una stringa in D
import core.sys.windows.windows;
import std.stdio;
string name()
{
char buffer[100];
uint size = 100;
GetComputerNameA(&buffer[0], &size);
return buffer;
}
void main()
{
writeln(name());
}
ottengo nella mia dichiarazione di ritorno:
test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string
Ok, in C++ sarebbe chiamare il costruttore di fare una stringa. Dice implicito, quindi lasciamolo col cast di stile C: return (string)buffer;
.
test.d(11): Error: C style cast illegal, use cast(string)buffer
Ah ok, ricordo, sintassi diversa.
return cast(string)buffer;
Ora compila ma ottengo solo rifiuti.
Suppongo che sia perché memorizza un puntatore nella stringa nel buffer temporaneo. Non voglio farlo, voglio copiare i personaggi in una stringa, ma fastidiosamente non riesco a trovare come farlo?
quindi le domande:
Come faccio a costruire una stringa effettiva da un array di caratteri che alloca memoria correttamente? (Copia i caratteri)
Assegnare un buffer di una dimensione casuale come questa e convertirlo in una stringa sembra brutto. C'è un modo corretto per farlo in D? (Sto parlando della domanda generale, non specificamente di questa API nel caso in cui ci sia un'altra API per ottenere il nome del computer).
Se a qualcuno di questi viene risposto in un manuale dove dovrei cercare di trovare i dettagli?
Grazie per qualsiasi aiuto e consiglio.
Puoi provare a controllare il valore effettivo del 'buffer' prima che sia convertito, perché la conversione non dovrebbe fallire. – Bauss
La conversione funziona ... se la stampo nella funzione ... fallisce se restituisco una stringa, presumibilmente perché si riferisce ancora al buffer temporaneo. – jcoder
@ Bauss, no, non dovrebbe. In effetti 2.068 interrompe la compilazione con: 'Errore: richiamo del riferimento al buffer delle variabili locali'. – sigod