Hallo, ich habe ein probl. bei der Bestimmung meines Zeigers. Ich will in meinem Quellcode wissen bzw. in einer if-Abfrage wissen ob der zeiger auf das Erste Element eines Vektors (eindemensional) zeigt. Hab mir das so gedacht: in der main Zeigt der pointer auf den Vektor. (pointer == Vektor) in einer Interruptroutine will ich wissen ob pointer der zum füllen dieses Vektors bestimmt ist bereits angefangen hat den Vektor zu füllen oder nicht. void xy (void) // interrupt { if (pointer != Vektor) { xxy; } else { y; } } Ich kann den code leider momentan nicht testen, ich glaube das es so Nicht funzen kann. Den so frage ich doch nur den Wert ab, und nicht die Zeigerstellung??? gibt es noch eine Andere möglichkeit?? danke
Warum sollte das nicht gehen. Wichtig ist halt wie du vorher pointer und vektor deklariert hast. Du kannst auch ein struct machen wo du z.B. ein Lese- und Schreibpointer drin hast. So wirds meist bei einem FiFo gemacht.
> in einer Interruptroutine will ich wissen ob pointer der zum füllen > dieses Vektors bestimmt ist bereits angefangen hat den Vektor zu füllen > oder nicht. Das ist soweit legitim. Bedenke aber, daß Du Variablen, die Du sowohl innerhalb als auch außerhalb von Interruptroutinen verwenden möchtest, als volatile deklarieren musst. > Den so frage ich doch nur den Wert ab, und nicht die > Zeigerstellung??? Nein, "den Wert" fragst Du nicht ab, denn Du dereferenzierst den Pointer nicht.
Axo . danke für die antworten und die tips. Werd es bei gelegenheit testen
Rufus noch ne frage zu volatile. Gild das auch für pointer Vektoren etc. (alle Werte die varibel sind??)
Alibaba schrieb: > Rufus noch ne frage zu volatile. > > Gild das auch für pointer Vektoren etc. (alle Werte die varibel sind??) Klar. volatile kannst du auf alles mögliche anwenden, genauso wie const Nur muss man bei Pointer immer darauf achten: Wer ist denn eigentlich volatile (oder const)? Der Pointer selbst, oder das worauf der Pointer zeigt? Je nachdem steht das volatile (const) in der Definition an einer anderen Stelle. Die Regeln sind aber recht einfach: volatile wirkt immer auf alles was links von ihm steht int * volatile Ptr; links vom volatile steht der Pointer-* Hier ist also der Pointer selbst volatile, nicht aber das worauf der Pointer zeigt. (In Langform ausgesprochen: Ptr ist ein volatile Pointer auf einen int) int volatile * Ptr; Langform: Ptr ist ein Pointer auf einen volatile int (Hier ist also der int auf den der Pointer zeigt volatile, nicht jedoch der Pointer selber) int volatile * volatile Ptr; Langform: Ptr ist ein volatile Pointer auf einen volatile int (Sowohl der Pointer als auch das worauf er zeigt ist volatile) volatile int * Ptr; Huch, hier steht nichts links vom volatile. In dem Fall wirkt volatile ausnahmsweise nach rechts. Das ist also dasselbe wie int volatile * Ptr;
Ok, jetzt mal auf mein code übertragen. ich habe einen Vektor : unsigned char Vektor[70] ; und einen Zeiger: unsigned char *Zeiger; main() { Zeiger = Vektor; // Zeiger zeigt auf erstes Element while(1) { // an dieser Stelle wird der Wert des Zeigerelemts abgefragt // der Wert des Zeigerelements und des Vektors kann auf Arten verändert //werden. 1.durch eine Interruptroutine 2.wenn nicht durch eine interruproutine dann ständig in der while- Schleife (nach jedem durchlauf) Zum beschreiben und abfragen des Wertes benutze ich sowol in der Interrupt routine immer den gleichen globalen Zeiger/Vektor. } } Ist es nun sinvoll den Vektor/Zeiger so zu deklarieren?? unsigned char volitail Vektor[70]; unsigned char volatile * volatile Zeiger;
Wenn Du nur über "Zeiger" auf "Vektor" zugreifst, dann ist es nicht erforderlich, "Vektor" als volatile zu deklarieren.
Alibaba schrieb: > Ist es nun sinvoll den Vektor/Zeiger so zu deklarieren?? Die Frage lässt sich noch nicht sauber beantworten. Das hängt jetzt konkret von der tatsächlichen Verwendung ab und die hast du nicht gezeigt. Aber ehe du jetzt Code erfindest: Wenn sich deine Bearbeitung des Feldes verändert (andere Zugriffe dazukommen oder wegfallen), kann es sein, dass sich die Sinnhaftigkeit von volatile auch ändert. > unsigned char volitail Vektor[70]; > unsigned char volatile * volatile Zeiger; Auf der absolut sicheren Seite (aber auch auf der langsamsten) bist du natürlich mit deinem Vorschlag. Denn da muss jeder Zugriff tatsächlich so wie von dir im Code geschrieben ausgeführt werden. Aber wie gesagt: Das ist dann die langsamst mögliche Variante und geht dann eigentlich am Konzept des "Ich schreib den Code so wie er für mich am klarsten ist und der Optimizer holt den Speed heraus" völlig vorbei. Im Grunde verbietest du damit dem Optimizer jegliches Optimierungspotential auszuschöpfen. Das heist es wird sinnvoll sein, sich darüber Gedanken zu machen, was notwendig ist. Aber sich auch Gedanken darüber zu machen, was nicht notwendig ist. Nicht notwendig bei einem Flug über die Sahara sind Schwimmwesten, auch wenn sie im Allgemeinen sinnvoll sind. WEnn mich der damit zusammenhängende Penalty (mehr Gewicht) nicht stört, brauch ich auf einem Saharaflug nichts unternehmen. Wenn ich aber mit Gewicht geizen muss, wäre es sinnvoll, die SW nicht mitzunehmen.
der sinn des Vektors/zeigers ist der. ich verwende einen uC(c167) der a: alle eingehenden Zeichen die vom PC kommen in einen Vektor schreibt. Dazu verwende ich einen interrupt und einen Zeiger. Durch eine zweite serielle schnittstelle die am uC angschlossen ist, werden die Daten, nach einer Bearbeitung in while(1) rausgeschickt. Wenn keine eingabe durch eine Tastertur ansteht, werden andere Daten regelmäßig verschickt. Der Verwendete Pointer/Vektor ist dabei immer der gleiche. Was ich eigentlich wissen wollte ist, wie man erkennen kann an welcher stelle der pointer steht um ihn dan zurücksetzen zu können. ob jetzt volatile in diesen fall sinvoll ist?? ka. wirrr was würdest du den tun??
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.