Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » ansi-c(h) ein bisschen daneben...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.09.2002, 14:45 Uhr
~0xdeadbeef
Gast


Dieses Programm soll den String "OTTO" umdrehen. Leider funktioniert es nicht...siehst du, warum?

C++:
#include <stdio.h>

int main(int argc, char *argv[]){
  char a[] = "OTTO", b[] = "abcd\0";
  char *d = &b[3];

  while(*a) *d-- = *a++;

  printf("%s\n", b);
  
  return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.09.2002, 15:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.09.2002, 16:08 Uhr
~0xdeadbeef
Gast


Hmmm...ich kann jetzt leider nicht beurteilen, ob deine Antwort richtig ist...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.09.2002, 16:31 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich behaupte mal, dass sich das Programm garnicht compilieren lassen dürfte (hoffentlich blamiere ich mich jetz nicht ): a ist kein Pointer, sondern ein Array. Folglich kann a nicht inkrementiert werden. Würde man a als ein char* deklarieren, würde es vermutlich funktionieren.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.09.2002, 16:36 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Nicht ganz ;-) Arrays sind auch nur Pointer auf den ersten Index... und *a ist das gleiche wie a[0], zumindest bis zum ersten a++. In C++ nicht unbedingt möglich, aber in C kann man noch so schön im Speicher rumfuchteln ;-)
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.09.2002, 16:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja schon, aber wenn a als ein Array deklariert ist, also als

C++:
char a[] = "OTTO";


so kann das a ohne index oder weiteren Operator nur als rvalue verwendet werden, nicht jedoch als lvalue. Das bedeutet, dass man a keinen neuen Wert zuweisen kann, wie es etwa der ++op tut. In meinen Augen ist Pointer!=Array. Man kann ein Array implizit konvertieren und dann so verwenden wie du sagst. Jedoch sollte man sich im Klaren sein, dass dies eine Implizite konvertierung ist.

Hier mal ein kleines Demo zu dem Thema. Wenn ich daheim bin, schau ich mal im Standard nach:

C++:
/* Demo für die falsche Annahme, dass Pointer == Array sei */
#include <stdio.h>

int main()
{
    /* Zunächst mal machen wir nix böses: wir machen ein
       Array mit 5 chars:
    */

    char s[] = "Leif";

    /* Wenn die landlaeufige Meinung, ein Array sein im
       Wesentlichen ein Pointer zutreffen würde, dann
         ware ein Pointer auf s vom Typ char**.
                Aus gutem Grund meckern hier aber gut Compiler
                bereits, weil diese Annahme falsch ist: */

    char** ps = &s; /* Gute Compiler melden: Incompatible types */

    /* Da wir ja keine Warmduscher sind, sind wir schlauer
       als der Compiler: Wir ignorieren die Warnung und
                dereferenzieren ps wieder. *ps muesste ja ein
       char* sein. Dieses geben wir aus. Eigenlich muesste
                dann ja der Text "Leif" erscheinen. Aber... */

    printf("%s\n",*ps);
}


Bei mir macht das einen coredump...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.09.2002, 17:02 Uhr
Bruder Leif
dances with systems
(Operator)


Argh!

Stimmt, hast Recht... an lvalue und rvalue denk ich mal wieder nicht, typisch...

Wenn a also mit


C++:
char *a="OTTO";


deklariert wird, klappts!
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 25.09.2002 um 17:03 Uhr von Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.09.2002, 17:49 Uhr
~0xdeadbeef
Gast


Das Programm kompiliert natürlich nicht. (Hör ich da ein erleichtertes Seufzen? ) Arrays sind konstant und weisen auch sonst einige Unterschiede zu pointern auf (wie in deinem Beispiel). Das liegt an der unterschiedlichen Speicherverwaltung von arrays und pointern; arrays werden direkt auf dem Stack angelegt, während pointer auf Daten irgendwo anders zeigen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.09.2002, 10:55 Uhr
FDellas



Hallo.

Das Programm kann nicht kompiliert werden, weil der Compiler aus char a[] ein const char * macht, wenn man drauf zeigt.

Mit einer kleinen Hilfsvariable kannst du dieses Problem beheben:


C++:
#include <iostream>

using namespace std;


int main()
{
    char *a = "OTTO", b[] = "abcd\0";
    char *d = &b[3], *c = a;

    while (*c)
        *d-- = *c++;

    cout << a << endl;
    cout << b << endl;

    return 0;
};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: