was ist der unterschied zwischen
_Str.c_str()
und
_Str.GetStrData()
?
nutze es bei einer funktion als parameterübergabe, und es spukt bei beidem keine fehler aus, muss ja trotzdem ein unterschied sein.
Mahlzeit,
die Prototypen der Operationen lauten:
const char* DGStr::c_str()const;
char* DGStr::GetStrData(unsigned int size=256);
Das sollte deine Frage beantworten.
Gruß,
minor
Der c_str liefert einen const char*, der GetStrData liefert einen char* auf ein Feld mit einer Mindestlänge von "size" bytes.
Den Unterschied zwischen char* und const char* findest Du hier:
http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5 (http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5)
naja mir gings um die decl zu gbas geschichte.
weil dort überall _Str.GetStrData()
eingesetzt wurde, ich aber vorher überall _Str.c_str()
genutzt habe!
Spielt das in diesem Zusammenhang überhaupt eine Rolle?
Wenn da strings übergeben werden, was wäre sinnvoller zu nutzen?
beispiel:
//! xSetEffectMatrixArray
// \param ent -
// \param name$ -
// \param bmat -
// \param num -
FUNCTION Xo_SetEffectMatrixArray: ent,name$,bmat,num
INLINE
name_Str.Alloc(512);
xSetEffectMatrixArray(ent,name_Str.GetStrData(),bmat,num);
ENDINLINE
ENDFUNCTION
was bedeutet da noch: _Str.Alloc(512);
hab ich ja vorher nie verwendet.
Na, ich weiß ja bei den GlitzWrappern nicht, ob hier ein char* oder ein const char* gebraucht wird. Also gehe ich auf Nummer Sicher und übergebe einen char*, den ich vorher mit 512 alloziiere.
bei Blitz sind normal immer Str.c_str()...
bin ich immer gut mit gefahren ;)
also mach ich am besten beim DECLARE_ALIAS ein const char* rein, und in der funktion immer Str.c_str().
und müsste also so passen?
Normal ja !
Ausser z.B. bei Kernel32.dll / GetTempPath usw.
Da scheppert's gewaltig, wenn man nicht GetStrData() verwendet.
Da schon...
Also man kann immer GetStrData() verwenden?
Mei, ist halt das Problem, dass er bei kürzeren String dann erstmal 512 bytes neu allozieert und dann übergibt. Sicherer ist's auf alle Fälle.
OH! Ganz vergessen! Nach dem GetStrData() muss man nochmal ein "myStr.CalculateLen()" machen, weil er dann sucht wo der '\0' ist und intern die Länge einträgt. Sonst geht's bei GetTempPath() auch net. Ich aktualisier mal den Wrapper.
wo muss das "myStr.CalculateLen()" genau hin, poste mal ein beispiel, weil ich hab schon gewrappt und angepasst, nochmal wollt ich das nicht tun, so füge ich das von hand ein.
Nach dem Funktionsafruf. Du musst warten, bis der Wrapper alles automatisch richtig macht. Mit Hand hat das keinen Sinn. Besonder nicht, wenn man sich net auskennt.
kann ich nicht trotzdem einfach im declare : const char* nehmen und in der funktion : Str.c_str() ?
wenns damit keine probleme geben würde, würd ich das nämlich so nehmen, weil das mit dem converter im allg. noch net so funktioniert, und so würde ich das der einfachheit einfach austauschen.
oder könnte es da probleme geben?
und wenn ja, welcher art, weil dann könnte ich ja die betreffenden funktionen seperat aus einer convertierten decl übernehmen, und den rest beim alten lassen.
oder ich schick dir, wenn fertig einfach mal mein projekt per mail und du schaust mal rein, wär das okay?
Quote from: Kitty Hello on 2008-Jul-31
... keinen Sinn. Besonder nicht, wenn man sich net auskennt.
Mach's mit dem Wrapper. Geht's ist's OK, geht's nicht, sag mir warum nicht. Ich hab keine Lust auf ein Gespräch, wo die andere Seite nur Bahnhof versteht. Wenn Du das Gespräch willst, dann lern C++, lern was der Unterschied von char* und const char* ist, dann können wir reden.
naja ich weiß, dass es ein nicht konstanter pointer auf einen konstanten string ist.
wollte nur dich fragen, bevor ich mich belese, da du ja eh in der materie steckst.
mehr nicht.
das was nicht funktioniert momentan hat denke ich mal nichts damit zu tun.
egal, ich schreib die beiden wrapper erstmal von hand, sende dir dann die gbas und dazugehörige decl, damit solltest du schlussfolgerungen ziehen können.
ich wollt nur wissen, ob es da nen unterschied gibt zwischen konstant und nicht konstant innerhalb einer funktion, mehr nicht.
Korrekt. C++ ist auch nicht so wild zu lernen und wenn man kein bock auf OGL in verbindung mit supereinfacher syntax und superleichten befehlen hat dann nimmt man halt c++ ansonsten ist man zufrieden mit dem was man da bekommt und ende. Ich mach auch viel mit c++ aber mecker nicht an GLB rum. Da glb voll spaß macht und nicht auf iso standard programmier techniken besteht nehm ich für kleine schnelle sachen glb ansonsten c++. oder c++ um was f+r glb zu machen.
Erst wenn man wirklich ahnung hat dann darf man meckern vorher würd ich sagen einfach mal das nehmen was man bekommt.
Genau. Also Heiko, kauf dir bitte ein Buch über C++. Da stehen die Antworten auf all deine Frage drin.
Cheers
ich habe lediglich eine frage gestellt, was bitte war daran falsch zu verstehen?
War auch nicht so gemeint. :) Gernot hat ja wenig Zeit. Vielleicht nicht so viel Fragen und Wünsche auf einmal. Eins nach dem anderen. Sonst läuft uns der noch weg. =D
Cheers
wollt nur wissen ob das getstr usw. und len etc notwendig ist, oder ob ich bei meinem
FUNCTION Xo_LoadMesh: path$, parent = 0
INLINE
if(xLoadMesh)
return xLoadMesh(path_Str.c_str(),parent);
ENDINLINE
ENDFUNCTION
bei allen strings bleiben kann, mehr nicht.
Ich kenne Deine Funktionen nicht alle. Und warum willst Du das jetzt immernoch mit der Hand wrappen, wo doch der decl Wrapper da ist?
:help:
siehe Wrapper-thread ...
habs auch erfolgreich gewrappt... geht aber leider nicht.... (hatte ich aber mit meinen Wrapper auch Gernot. schlimm wars bei Pointern... :( )