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ß
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.
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.
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".
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 | }
|
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.
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ß
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 *
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.