Forum: PC-Programmierung Dem Pointer Wert einer Veriablen zuweisen


von Durchstarter (Gast)


Lesenswert?

Hallo, habe eine einfache Frage.

Ich habe eine Variable die eine Adresse als Wert hat. Jetzt möchte ich 
dem Pointer diesen Wert (Adresse) zuweisen.

z.B.

Uint16 variable = 0x0A11 <-- Adresse

Uint16 *pointer = &variable
<-- hier weise ich die Adresse der Variablen zu, aber nicht den 
benötigten Wert (0x0A11).


Danke

Gruß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du willst also, daß der Pointer auf die Adresse 0x0a11 zeigt?
1
uint16_t* pointer = (uint16_t *) 0xa11;

oder, wenn Du es wirklich für nötig hältst, vorher die Adresse in einem 
uint16_t zu halten:
1
uint16_t variable = 0xa11;
2
uint16_t* pointer = (uint16_t *) variable;

> Uint16

Gewöhn Dir sowas ab. Dafür gibt es die Standardtypen wie eben 
uint16_t.

von Rolf Magnus (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Gewöhn Dir sowas ab. Dafür gibt es die Standardtypen wie eben
> uint16_t.

Der Standardtyp, um einen Zeigerwert als Integer zu speichern, ist aber 
intptr_t und nicht uint16_t.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Der Standardtyp, um einen Zeigerwert als Integer zu speichern, ist aber
> intptr_t und nicht uint16_t.

Das mag wohl so sein, mir ging es primär um die Vermeidung der 
Verwendung selbstgebastelter Typen(-bezeichner) wie "Uint16".

von Durchstarter (Gast)


Lesenswert?

Thank you, werde es ausprobieren.

von Durchstarter (Gast)


Lesenswert?

Hallo, hab immer noch ein kleines Problemchen. Folgende Sache. Ich 
übertrage Daten immer als Hexzahlen. Möchte Daten im EEPROM unter einer 
bestimmten Adresse speichern, und später diese Adresse auslesen.
EEPROM Adressen starten bei 0x3F0002, wobei die ersten zwei Werte fest 
sind, die letzten vier variabel (0x3Fxxxx).

Problem ist, der Zeiger zeigt immer auf eine falsche Adresse, und gibt 
das Array gibt mir unbeschriebenen Speicher aus (0xFFFF)


mein Code,
1
Uint16 Read_Buffer[64];
2
Uint16 Write_Buffer[64];
3
Uint16 *Page_Pointer;
1
//received_data <- erhaltener Wert (ein Byte, hex Darstellung)
2
void read_holding_register (int received_data,unsigned char _rx_counter)
3
{
4
  Uint16 q;
5
  
6
  if(_rx_counter == 2)  //erster Teil der Adresse, 0x01
7
    REGISTER_ADDRESS = received_data;
8
  if(_rx_counter == 3)    //zweiter Teil der Adresse, 0x02,und Adresse zusammensetzen
9
  {
10
    REGISTER_ADDRESS = (REGISTER_ADDRESS<<8)|received_data;
11
    
12
REGISTER_ADDRESS = REGISTER_ADDRESS + 0x3F0002;//0x3F0002 first address of our FLASH, used as EEPROM
13
    
14
    
15
    
16
    Page_Pointer = (Uint16 *) REGISTER_ADDRESS;//Page_Pointer gets the address stored in REGISTER_ADDREsS
17
    
18
    if(*Page_Pointer!=0x3F0104)//if Abfrage mit LEDs zum testen
19
    {
20
      GpioDataRegs.GPASET.bit.GPIO12 = 1;
21
      GpioDataRegs.GPASET.bit.GPIO30 = 1;
22
      GpioDataRegs.GPASET.bit.GPIO15 = 1;
23
      
24
      for( i=0; i<100; i++)//1 sec delay
25
            delay_1mS();
26
            
27
      GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
28
      GpioDataRegs.GPACLEAR.bit.GPIO30 = 1;
29
      GpioDataRegs.GPACLEAR.bit.GPIO15 = 1;
30
            
31
    }
32
  
33
    
34
    EEPROM_Read();
35
    
36
    q = Read_Buffer[0];
37
38
    //Daten ans Terminal senden, immer Byteweise als Hex
39
    prepare_tx((q>>8)&0xFF);        
40
    prepare_tx(q&0xFF);
41
42
43
  }
44
}


lesen des EEPROM,
1
void EEPROM_Read()
2
{
3
  Uint16 i;
4
5
  // Transfer contents of Current Page to Read Buffer
6
7
  Read_Buffer[0] = *(Page_Pointer);  
8
}

von Daniel (Gast)


Lesenswert?

Durchstarter schrieb:
> Page_Pointer = (Uint16 *) REGISTER_ADDRESS;
> if(*Page_Pointer!=0x3F0104)

if(Page_Pointer!=0x3F0104)

ist was zu willst


void EEPROM_Read()
{
  Uint16 i;

  // Transfer contents of Current Page to Read Buffer

  Read_Buffer[0] = *(Page_Pointer);
}

wer schreibt denn dort was rein?
wie ich dich verstanden habe, willst du erstmal verifizieren,
dass die zusammengebaute adresse korrekt ist?

du arbeitest meinem geschmack nach zu viel über globale variablen

die deklaration von REGISTER_ADDRESS fehlt^^
in c muss man höllisch aufpassen welcher typ (signed oder unsigned)
benutzt wird, insbesondere beim left-shiften.

von Durchstarter (Gast)


Lesenswert?

Hallo,

die IF Abfrage ist einfach zum testen, ob die Adresse auf die der Zeiger 
zeigt gleich der gewünschten Adresse ist (in diesem Fall 0x3F0104), 
hatte LEDs zum leuchten gebracht.
1
Uint16 REGISTER_ADDRESS

_received_data ist signed, werd das mal ändern und sehen, ob das was 
bringt!

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Durchstarter schrieb:
> Hallo,
>
> die IF Abfrage ist einfach zum testen, ob die Adresse auf die der Zeiger
> zeigt gleich der gewünschten Adresse ist (in diesem Fall 0x3F0104),

Gerade deann willst du eben den * nicht.

Der * bedeutet: Sieh unter dieser Adresse nach.

Dich interessiert hier aber nicht der Wert der an dieser Adresse im 
Speicher steht, sondern die Adresse selber die in der Pointer Variable 
gespeichert ist. Daher ohne *

von Durchstarter (Gast)


Lesenswert?

Ahhhh, OK, mach mir immer ein bisschen schwer mit den Pointern.
Was mein Problem angeht, ich glaube es lag wirklich an den 
signed/unsigned Deklarationen. Ich kann jetzt die gewünschte Adresse 
auslesen und unter der gewünschten Adresse speichern, kamen bis jetzt 
keine Probleme auf.

Vielen Dank für die Tipps.

Adios

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.