I D Sprache lerne (Ich weiß, C++ gut) ... Ich mag einige Windows-spezifische Dinge zu tun, so schrieb ich dies nur die API auszuprobieren:einen temporären Zeichen-Array in einen String in D Konvertieren
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());
}
ich in meiner return-Anweisung:
test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string
Ok, in C++, es würde den Konstruktor aufrufen, um einen String zu machen. Es sagt implizit aus, dass wir es mit einem C-Style-Cast umsetzen können: return (string)buffer;
.
test.d(11): Error: C style cast illegal, use cast(string)buffer
Ah ok, ich erinnere mich, andere Syntax.
return cast(string)buffer;
Jetzt kompiliert es, aber ich bekomme nur Müll.
Ich nehme an, dass ist, weil es einen Zeiger in der Zeichenfolge in den temporären Puffer speichert. Ich möchte das nicht machen, ich möchte die Charaktere in eine Zeichenfolge kopieren, aber ärgerlich finde ich nicht, wie ich das machen soll?
So Fragen:
Wie kann ich eine tatsächliche Zeichenfolge aus einem char-Array erstellen, die Speicher richtig zuordnet? (Kopiert die Zeichen)
Das Zuweisen eines Puffers mit einer zufälligen Größe wie dieser und Konvertieren in eine Zeichenfolge scheint hässlich zu sein. Gibt es einen geeigneten Weg, dies in D zu tun? (Ich spreche über die allgemeine Frage, nicht speziell diese API nur für den Fall, dass es eine andere API gibt, um den Computernamen zu erhalten).
Wenn eine dieser Fragen in einem Handbuch beantwortet wird, wo sollte ich nach Details suchen?
Vielen Dank für jede Hilfe und Beratung.
können Sie versuchen, den tatsächlichen Wert von 'buffer' zu überprüfen, bevor es umgesetzt ist, weil Die Konvertierung sollte nicht fehlschlagen. – Bauss
Die Umwandlung funktioniert ... wenn ich es in der Funktion ... drucke, scheitert es, wenn ich einen String zurückgebe, vermutlich weil es sich immer noch auf den temporären Puffer bezieht. – jcoder
@Bauss, nein, sollte es nicht. Tatsächlich bricht 2.068 die Kompilierung mit folgendem Fehler ab: "Fehler: Verweis auf lokalen Variablenpuffer". – sigod