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
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
1 | struct tm *timevar_p; |
2 | struct tm timevar_s; |
3 | |
4 | ...
|
5 | timevar_p = &timevar_s; |
6 | ...
|
Ich glaube das ging an der Frage vorbei. Den code habe ich oben schon aufgeführt.
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.
@Hajo Deine Ausgangsfrage ist beantwortet, aber du hast etwas ganz anderes im Hinterkopf. Beschreibe bitte einmal, was du machen willst.
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.
Damit ist das struct tm aber nicht erzeugt worden. Der Pointer hängt in der Luft.
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.
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.
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 | ...
|
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.
Joachim Drechsel schrieb: > Mannonmann ... > > struct tm *pRtcc, blabla; > > im Programm: > > pRtcc = &blabla; Sorry eben nicht im Program die Zuweisung :-) OhMann
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.
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.
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.
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 :-)
Das macht keinen Sinn und ist extrem fehleranfällig. Zeig mal das Programm. Ich kannmirnicht vorstellen, daß so etwas notwendig ist.
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. ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.