Jedi
PROGrAMmER
|
wenn du den ASM code herzeigst, mach bitte ein Foto von der "Tussn"
Bearbeitet von Jedi am 26.11.2003, 17:39
|
mat
AdministratorLegends never die
|
char* s1 = "wasweisich"
wtf?! sagt was..
|
FMFlash
tranceCoder
|
Von dir oder abgeschrieben?
Schaut irgendwie aus, als käme es aus der MS CRT. richtig erkannt, ist aus dem strlen.asm von vs6 ![:)](/images/smilies/smile.gif) char* s1 = "wasweisich"
wtf?! sagt was..
ich denke es wird allgemein angenommen das diese zeile nur pseudocode darstellt (ansonsten ... unbedingt ändern!) char s1[] = "wasweisich\0"
würde schon genügen, wenn ein statisches char-array ausreicht.
Bearbeitet von FMFlash am 26.11.2003, 18:45
|
Ringding
Pilot
|
richtig erkannt, ist aus dem strlen.asm von vs6 Funktioniert natürlich nur, wenn sie auf Intel Maschinen arbeiten und ist daher nicht wirklich empfehlenswert ![:)](/images/smilies/smile.gif) Aber es ist wenigstens nicht Windows-abhängig.
Bearbeitet von Ringding am 26.11.2003, 18:48
|
Ringding
Pilot
|
@mat & FMFlash:
Wo soll das Problem sein? Das ist eine absolut korrekte Schreibweise.
|
manalishi
tl;dr
|
Funktioniert natürlich nur, wenn sie auf Intel Maschinen arbeiten und ist daher nicht wirklich empfehlenswert ![:)](/images/smilies/smile.gif) Aber es ist wenigstens nicht Windows-abhängig. warum denn nicht? das soll der user beim compilieren einstellen. für motorola gehts etwa gleich einfach, so lange irgendein register incrementieren bis das gefetchte byte 0 also equal ist.. eine der schnellsten schleifen überhaupt
|
Ringding
Pilot
|
Nur wenn du's so in Assembler schreibst, dann kannst es gleich in C schreiben. Genau das wird der Compiler nämlich ausspucken. Die gepostete Version ist doch recht gut geschwindigkeitsoptimiert, weil sie pro Iteration gleich 4 Bytes überprüft.
|
mat
AdministratorLegends never die
|
wann hat sich das eingeschlichen? is ja furchtbar.. ich mein, es ist einfach inkonsistent. weil logischerweise weise ich so einem pointer eine adresse zu, ned den inhalt. na ja, c++ halt. ich bin da eher der oldschooltyp. ich liebe zwar oop, aber ich hasse string sowie cin und cout und etliche andere fehlgeburten
|
FMFlash
tranceCoder
|
@mat & FMFlash:
Wo soll das Problem sein? Das ist eine absolut korrekte Schreibweise. stimmt, kommt im endeffekt auf das gleiche wie die [] variante (allerdings fehlt der null-terminator?). ich persönlich verwende pointer für "strings" nur wenn es dynamisch sein soll, also immer in verbindung mit malloc/calloc/realloc/free - deshalb kam es mir auf den ersten blick falsch vor
|
Ringding
Pilot
|
Der \0 Terminator wird automatisch erzeugt, wenn du doppelte Anführungszeichen verwendest.
@mat: Es wird ja eh die Adresse zugewiesen, nämlich die Adresse vom statisch allokierten String.
|
mat
AdministratorLegends never die
|
das is IMO auch das problem! wenn ich einen kleinen lokalen buffer brauche dann verwende ich char szBuffer[255], wenn ich einen globale string brauche, dann nehm ich einen char *. die char* szFoo = "arg" methode ist extrem fehleranfällig, weil folgendes einen fehler ergibt: void
foo(char *szBla)
{
szBla = "idiot";
}
main:
char *szBla = "cool";
foo(szBla);
sicher is das idiotisch, aber das wäre ein typischer einsteigerfehler bzw. auch eine umsteigerfalle. zB in php wär das vollkommen korrekt. ich würde sagen man sollte sich so und so eine eigene string klasse coden, verstrickt mit einer klasse die auf memory leaks achtet. damit verabschiedet man jegliche leaks in der "problematischen" richtung. edit: shit, ich meinte das: void
foo(char **szBla)
{
*szBla = "idiot";
}
..das problem is: das geht! nur warum? "idiot" dürfte nur lokal alloziert werden.
|
Ringding
Pilot
|
Strings werden immer statisch alloziert.
Richtig, das geht. Sollte es auch.
|
mat
AdministratorLegends never die
|
aber denk mal nach: eigentlich ist das ned die beste methode. bei jedem string der so zugewiesen wird, erstellt der compiler einen statisch, globalen bereich. ich würde eher auf lokal plädieren, weil wenn ich einen globalen adressbereich haben will, dann sollte ich selber einen allozieren müssen, und zwar mit bedacht. is nur so ein kleiner gedanke
|
Ringding
Pilot
|
Magst jetzt das 30 Jahre alte C umkrempeln?
|
Ringding
Pilot
|
Ich versteh außerdem nicht ganz, was du meinst. Die eine Möglichkeit, "lokal" zu verstehen, heißt, dass es einfach im Object File keinen Namen kriegt, also das, was mit static Funktionen und Variablen passiert. Die liegen auch "global" im Datensegment, sind aber namenlos, daher von außen nicht zugreifbar (außer man reicht einen Pointer raus). Die andere Möglichkeit wäre, dass man es als "am Stack liegend" auffasst. Das ist aber ziemlich sinnlos. Wie soll es denn dort hinkommen? Es müsste bei jedem Eintritt in die Funktion auf den Stack kopiert werden. Und damit's überhaupt kopiert werden kann, muss es erst recht wieder im Datensegment herumliegen. Also ein lose-lose
|