www.mikrocontroller.net

Forum: PC-Programmierung Zeigerstellung Bestimmen


Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axo . danke für die antworten und die tips. Werd es bei gelegenheit 
testen

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus noch ne frage zu volatile.

Gild das auch für pointer Vektoren etc. (alle Werte die varibel sind??)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nur über "Zeiger" auf "Vektor" zugreifst, dann ist es nicht 
erforderlich, "Vektor" als volatile zu deklarieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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??

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.