Forum: Mikrocontroller und Digitale Elektronik Pointer die 111


von Hajo H. (sharki)


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

von ptr (Gast)


Lesenswert?

Das Schlüsselwort heißt *"typedef"*

von Hajo H. (sharki)


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

von ptr (Gast)


Lesenswert?

1
struct tm *timevar_p;
2
struct tm timevar_s;
3
4
...
5
  timevar_p = &timevar_s;
6
...

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Und time.h auch includen.

von Hajo H. (sharki)


Lesenswert?

Ich glaube das ging an der Frage vorbei.

Den code habe ich oben schon aufgeführt.

von ptr (Gast)


Lesenswert?

Hajo Harms schrieb:
> 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  ?

Hajo Harms schrieb:
> Ich glaube das ging an der Frage vorbei.
>
> Den code habe ich oben schon aufgeführt.

von ptr (Gast)


Lesenswert?

@Hajo
Deine Ausgangsfrage ist beantwortet, aber du hast etwas ganz anderes im 
Hinterkopf. Beschreibe bitte einmal, was du machen willst.

von Hajo H. (sharki)


Lesenswert?

Im Prinzip dies :

struct tm *pRtcc = &tm; // Geht ja nicht

Ich hoffe ich bring das rüber :-)

Einen Zeiger auf eine Struktur die dabei erzeugt wird aber keinen namen 
hat.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Hajo Harms schrieb:
> struct tm *pRtcc = &tm; // Geht ja nicht


struct tm *pRtcc;

von Hajo H. (sharki)


Lesenswert?

Damit ist das struct tm aber nicht erzeugt worden.
Der Pointer hängt in der Luft.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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.

von Hajo H. (sharki)


Lesenswert?

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.

von ptr (Gast)


Lesenswert?

Hajo Harms schrieb:
> Einen Zeiger auf eine Struktur die dabei erzeugt wird aber keinen namen
> hat.

Dann schreib das doch gleich!
1
struct tm time_arr[1];
2
3
...
4
   a = *time_arr.tm_sec;
5
   b = time_arr[0].tm_min;
6
...

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Mannonmann ...

struct tm *pRtcc, blabla;

im Programm:

pRtcc = &blabla;

von Hajo H. (sharki)


Lesenswert?

Ich dachte das hätte ich :-)

struct tm time_arr[1];

Sieht seltsam aus, ist aber wohl das was ich gesucht habe.


a = time_arr->tm_sec;

Sollte damit auch gehen.

Dann Danke ich recht herzlich.

von Hajo H. (sharki)


Lesenswert?

Joachim Drechsel schrieb:
> Mannonmann ...
>
> struct tm *pRtcc, blabla;
>
> im Programm:
>
> pRtcc = &blabla;

Sorry eben nicht im Program die Zuweisung :-) OhMann

von ptr (Gast)


Lesenswert?

Hajo Harms schrieb:
> ist aber wohl das was ich gesucht habe

Schön!

Ich möchte die Frage nach der Sinnhaftigkeit gar nicht stellen. Aber du 
darfst den Zeiger nie verbiegen, sonst kommst du an den Speicher der 
stuct nicht mehr dran.

von Hajo H. (sharki)


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.

von ptr (Gast)


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.

von Hajo H. (sharki)


Lesenswert?

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 :-)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Das macht keinen Sinn und ist extrem fehleranfällig.
Zeig mal das Programm. Ich kannmirnicht vorstellen, daß
so etwas notwendig  ist.

von ptr (Gast)


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. ;-)

von Rufus Τ. F. (rufus) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.