Pointer die 111

OP #2555125
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
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
(Firma: JDCC) #2555258
tm ist doch schon die Definition der Struktur, wenn Du so willst,
der "Datentyp".

also ergibt

  struct tm *pRtcc;

einen Zeiger auf so eine Struktur. Sie hat zwar noch keinen
Speicherplatz, aber der Pointer ist schon mal da. Den Namen
kannst DU natürlich frei wählen.
OP #2555264
Und genau darum geht es bei der Ausgangsfrage. Das ganze ohne Namen der 
Variablen vom Typ tm. Eine Erzeugung der Struktur tm (ohne Variablen 
Namen) mit einem Pointer darauf. Und das ganze im Deklarationsbereich. 
Außerhalb eines Funktionsblocks.
OP #2555311
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
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.
OP #2555368
Ja so sollte es ja auch sein :-)

static struct tm RFrtc;
struct tm *RFTime = &RFrtc;

Aber ist es nicht irgendwie Inkonsequent das man für eine Zeiger 
Variable zwei Anweisungen braucht ?

Aber egal ich bin wieder etwas schlauer :-)
Gast #2555388
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.