Pointer die 111

OP #2555125
Lesenswert?

Moin moin

ich möchte ein Pointer auf eine Zeitstrucktur erzeugen und gleichzeitig 
die Variable erzeugen.

In einer Funktion könnte ich

struct tm *pRtcc = new tm;

schreiben.

Nun müsste ich eine Struktur vom Typ tm haben (ohne var namen) und einen 
Zeiger darauf.

Kann ich das ganze auch in der Deklaration erledigen ?

Also außerhalb einer Funktion.

struct tm rtcc;
struct tm *pRtcc = &rtcc;

Sollte so machbar sein oder ?

Und wenn ich jetzt den Namen rtcc nicht haben will ? Ja ist dämlich, 
interessiert mich aber :-)


Grüße Hajo
OP #2555153
Lesenswert?

Ich stehe ein wenig auf dem sclauch.

Die struktur ist schon in time.h definiert. Kann ich also nicht mit 
typedef definieren. Oder muß ich den Pointer als typedef definieren ?

struct tm {
  int  tm_sec;
  int  tm_min;
  int  tm_hour;
  int  tm_mday;
  int  tm_mon;
  int  tm_year;
  int  tm_wday;
  int  tm_yday;
  int  tm_isdst;
};

Vielen Dank
OP #2555311
Lesenswert?

Es geht zum Teil um die Lesbarkeit und die Eindeutigkeit des Zugriffs.

Ideal wäre struct tm *ptm = new(tm); als deklaration. Das Geht leider 
nur im Funktionsblock.

Es soll aber eindeutig nur über den Pointer auf die Datenstrucktur 
zugegriffen werden.

Es ist ein Teil einer library und ich finde es echt blöd wenn man erst 
studieren muß bis man begreift was da einer zusammen gestöpselt hat.

Als Beispiel tauchen hier zwei Funktionen auf die BYTE BtoD(BYTE a) und 
BYTE DtoB(BYTE a) auf. In den DocZeilen heist es byte to decimal und 
decimal to byte.

Ich muste mir den Code anschauen um zu Begreifen das der Programmierer 
eine BCD <-> Byte(decimal) Umwandlung meint.

Aber mit struct tm time_arr[1]; weiß ich nicht ob das besser ist :-)


Trotzdem Dank an alle.
Gast #2555327
Lesenswert?

Hajo Harms schrieb:
> Es geht zum Teil um die Lesbarkeit und die Eindeutigkeit des Zugriffs.
>
> ...
>
> Es soll aber eindeutig nur über den Pointer auf die Datenstrucktur
> zugegriffen werden.

Für die Lesbarkeit ist es ganz schlecht, irgendwo versteckt Speicher zu 
allokieren. Die Variante mit  new  oder * malloc() * in einer 
vorhandenen Init-Funktion ist sauberer.

Um den Zugriff einzuschränken, wird die Variable global im Modul * 
static * deklariert. Ausserhalb des Moduls ist sie dann nicht sichtbar.

Wie bereits geschrieben, möchte ich über die Sinnhaftgkeit garnicht 
diskutieren. Ich habe einen anderen Programmierstil.
Gast #2555388
Lesenswert?

Hajo Harms schrieb:
> Aber egal ich bin wieder etwas schlauer

Sorry, aber das glaube ich nicht:
Der Zeiger belegt nur Speicherplatz für eine Zieladresse, auf die er 
zeigt. Der Wert kann verändert werden und der Zeiger referenziert eine 
andere Speicherzelle.
Die Struktur oder eine andere Variable belegen Speicherplatz für die 
Werte. Eine Änderung ergibt andere Werte.
Die Typangabe beim Zeiger dient der Interpretation beim Refernzieren.
Das ist konsequent, transparent, ...

Ich empfehle ein gutes C/C++ Buch vor dem Schalfen. ;-)
Persönliche Seite #2555391
Lesenswert?

Hajo Harms schrieb:
> Aber ist es nicht irgendwie Inkonsequent das man für eine Zeiger
> Variable zwei Anweisungen braucht ?

Eine "Zeiger Variable"* wirst Du in Deinem Programm gar nicht brauchen, 
da überall da, wo die "Zeiger Variable" verwendet wird, Du auch den 
Adressoperator & verwenden kannst - außer bei einer direkten Zuweisung, 
dann aber müsste die "Zeiger Variable" nicht vorher irgendwohinzeigen.


*) Diese schreck liche Art der Über Setzung kenne ich nur aus der 
deutsch sprachigen aus Gabe der ersten aus Gabe des Buches 
"Programmieren in C" von Kernighan & Ritchie, die wegen genau dieser Art 
der über Setzung prak Tisch völlig un les bar war, aber die be schrieb 
auch nur das stein alte "K&R-C" von vor C-89, was wirk lich schreck 
lich war.
Und glücklicherweise durch C89 bzw. "ANSI-C" ersetzt wurde, was mit der 
deutlich besseren zweiten Ausgabe des "K&R" einherging, der jetzt auch 
in der deutschen Übersetzung lesbar war.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren