Forum: Mikrocontroller und Digitale Elektronik Pointerfrage (wiedermal)


von MiesePointer (Gast)


Lesenswert?

Hi,

ich steh gerade etwas aufm schaluch bzw sehe den Wald vor lauter Wäldern 
nicht mehr.

Ich möchte den Inhalt einer Variablen in ein anderes Modul haben, ihn 
dort Verädern und dann wieder zurück ins Modul haben. Dabei würde ich 
gern mit Pointern arbeiten. Aber irgendwie steh ich gerade neben mir.
1
int* VariableLesen (void)
2
{ 
3
  return &Variable;              // Addresse in den Pointer
4
}
5
6
void VariableSchreiben (int* NewValue )
7
{
8
  Variable = *NewValue;          // Dereferenzierten Pointer wieder übernehmen
9
}
in dem Anderen Modul:
1
int* temp = VariableLesen();
2
temp++;
3
VariableSchreiben( temp );

Geht aber nicht, der Variableninhalt wird nicht verändert, sicher nur ne 
Kleinigkeit, aber ich seh sie gerade nicht...


Danke

von pointR (Gast)


Lesenswert?

probiers mal mit *temp++ ;-)

von Peter II (Gast)


Lesenswert?

MiesePointer schrieb:
(*temp)++;


aber was soll das hier?

> int* VariableLesen (void)
> {
>   return &Variable;              // Addresse in den Pointer
> }

was für ein Type ist Variable? Ein zeiger oder ein Wert?

von MiesePointer (Gast)


Lesenswert?

Ein Wert

von Karl H. (kbuchegg)


Lesenswert?

MiesePointer schrieb:

> Ich möchte den Inhalt einer Variablen in ein anderes Modul haben, ihn
> dort Verädern und dann wieder zurück ins Modul haben. Dabei würde ich
> gern mit Pointern arbeiten.

Warum?
Man arbeitet nicht mit Pointern, wenn man nicht muss oder zumindest 
einen extrem guten Grund hat.


> int* temp = VariableLesen();
> temp++;

Hier erhöhst du den Pointer und nicht das worauf er zeigt.

> Geht aber nicht, der Variableninhalt wird nicht verändert, sicher nur ne
> Kleinigkeit,

Eigentlich keine Kleinigkeit.
Denn dein ganzer Ansatz zeigt, dass du Pointer nicht verstanden hast.


Entweder: komplett ohne Pointer
1
int Wert = 5;
2
3
int get()
4
{
5
  return Wert;
6
}
7
8
void set( int newVal )
9
{
10
  Wert = newVal;
11
}
12
13
int main()
14
{
15
  int i = get();   // den bisherigen Wert holen
16
  i++;
17
  set( i );        // und den veränderten Wert setzen lassen
18
}

... und das ist die bevorzugte Variante!


oder eben, in dem das Modul einen Pointer rausrückt und so dem Aufrufer 
ermöglicht direkt, ohne Umweg, sich an der Variablen zu schaffen zu 
machen. Und weil das verwendende Modul sich direkt an der Variablen 
(über den Pointer) zu schaffen macht, braucht man auch keine 
Set-Funktion mehr. Und genau da liegt der Grund, warum man diesen Weg 
eigentlich nicht machen will: Eine Set Funktion hätte immer noch die 
Möglichkeit, den neu zu setzenden Wert zu überprüfen (zb auf 
Sinnhaftigkeit, auf Bereichsgrenzen etc.). Durch Herausgabe des Pointers 
hat sich das Modul ganz dem Aufrufer ausgeliefert, dass der keinen 
Fehler macht. Der kann jeden beliebigen Wert in die Modul-Variablen 
schreiben, ob die Sinn machen oder nicht.
1
int Wert;
2
3
int* get()
4
{
5
  return &Wert;
6
}
7
8
9
int main()
10
{
11
  int* ptrToVariable = get();
12
13
  // An dieser Stelle hat main die Adresse von 'Wert', auch wenn
14
  // es nicht weiß, wie die Variable heißt.
15
  // Jegliche Manipulation über *ptrToVariable manipuliert bereits
16
  // direkt die Variable "Wert"
17
18
  (*ptrToVariable)++;
19
}

von reviewing (Gast)


Lesenswert?

@Karl Heinz

Danke für diese ausführliche und verständliche Erklärung!

von MiesePointer (Gast)


Lesenswert?

Wiedereinmal hast du Recht gehabt Karl Heinz,

ich wollte es so schnell wie möglich machen, aber auf die "normale" 
Weise gehts natürlich auch!


Danke

von Karl H. (kbuchegg)


Lesenswert?

MiesePointer schrieb:
> Wiedereinmal hast du Recht gehabt Karl Heinz,
>
> ich wollte es so schnell wie möglich machen

Das ist ja auch sinnvoll, wenn das Modul etwas liefert, was etwas 
umfangreicher wie ein int ist. Eine Struktur aus einer Datenbank oder 
ein Bild zum Bleistift. Dann ist es schon ok, wenn das Modul einen 
Pointer liefert. Entweder als const Pointer, damit der Aufrufer das 
Signal kriegt: "Hier hast du einen Pointer, aber bitte lass die Daten in 
Ruhe"
oder eben absichtlich und gezielt (und mit Zähneknirschen) einen 
Pointer, damit der Aufrufer die Daten manipulieren kann ohne jedesmal 
durch 25 Softwareschichten und 78 Funktionsaufrufe zu müssen.

von Bronco (Gast)


Lesenswert?

MiesePointer schrieb:
> Ich möchte den Inhalt einer Variablen in ein anderes Modul haben, ihn
> dort Verädern und dann wieder zurück ins Modul haben.

Man könnte auch eine globale Variable verwenden.

von MiesePointer (Gast)


Lesenswert?

Bronco schrieb:
> Man könnte auch eine globale Variable verwenden.
Klar, aber das ist immer blöde wenn das Projekt größer wird, dann blickt 
keine Sau mehr durch wer wo an welchen Daten hebelt, daher versuche ich 
es alles zu kapseln...

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.