Forum: Mikrocontroller und Digitale Elektronik Startadresse eines Arrays?


von Winnie (Gast)


Lesenswert?

ptr_to_eeprom= &Light_time_data_ee[0][0];
ptr_to_ram= &Light_time_data[0][0];
for (loop=0;loop<sizeof (Light_time_data_ee) ;loop++)
      *ptr_to_ram++=*ptr_to_eeprom++;

Also ein Array wird vom Eeprom ins RAM kopiert, funktioniert auch
richtig.
Es gibt allerdings Warnungen.
-a value of type 'eeprom unsigned int' was assigned to an entity of typ
-a value of type 'unsigned int' was assigned to an entity of typ

Gibts ne Möglichkeit, die Adresse eines
Arrays anders anzugeben? Ich habs lieber, wenn es keine Warnungen gibt 
:-)

von Daniel V. (danvet)


Lesenswert?

Winnie schrieb:
> Gibts ne Möglichkeit, die Adresse eines
> Arrays anders anzugeben? Ich habs lieber, wenn es keine Warnungen gibt
> :-)

so vielleicht?:
ptr_to_eeprom= Light_time_data_ee;
ptr_to_ram= Light_time_data;

ob das dein Problem behebt, weiß ich nicht...

von Klaus W. (mfgkw)


Lesenswert?

Winnie schrieb:
> funktioniert auch richtig.

Auf welchem Rechner?

von Karl H. (kbuchegg)


Lesenswert?

Winnie schrieb:

> Gibts ne Möglichkeit, die Adresse eines
> Arrays anders anzugeben? Ich habs lieber, wenn es keine Warnungen gibt
> :-)


Dann schau dir die Zuweisungen an

Die Zuweisung
1
  ptr_to_eeprom= &Light_time_data_ee[0][0];
hat einen Teil links vom = und einen Teil rechts vom =

Der Teil links vom = lautet
1
  ptr_to_eeprom
  Frage: welcher Datentyp verbirgt sich hinter dieser Variablen (wie ist
  sie deklariert)?

Der Teil rechts vom = lautet
1
  &Light_time_data_ee[0][0
  Und wieder die gleiche Frage: welcher Datentyp steckt in diesem
  Ausdruck.
  Der & ergänzt den Datentyp nur um eine Pointerkomponente. Der Basis-
  datentyp bleibt aber derselbe:

  wenn c vom Typ char ist    (   char c; )
  dann hat &c den Datentyp  Pointer auf char  ( char * )

  wenn d vom Typ double ist     ( double d; )
  dann hat &d den Datentyp  Pointer auf double   ( double * )

  wenn s vom Typ volatile unsigned int ist  ( volatile unsigned int s; )
  dann hat &s den Datentyp Pointer auf volatile unsigned int
                                          ( volatile unsigned int * )

  wenn t den Datentyp constante Struktur 'MyStruct' hat
                                        ( const struct MyStruct t; )
  dann hat &t den Datentyp Pointer auf constante Struktur 'MyStruct'
                                        ( const struct MyStruct * )


Also: welcher Datentyp steht links vom =, welcher Datentyp steht rechts 
vom =?
Die vergleichst du und stellst fest, wo sie nicht zusammenpassen. Dann 
entscheidest du, ob der Unterschied harmlos ist, oder ob da eine 
spezielle Aktion notwendig ist. Wenn der Unterschied harmlos ist, dann 
kannst du das dem Compiler mitteilen: Sieh mal, ich weiß das das 
eigentlich nicht zusammenpasst, aber als Programmierer sag ich dir - das 
passt schon so.
Und in C Schreibweise ist das nun mal ein Cast. Du castest den Ausdruck 
rechts vom = auf denselben Datentyp, der links vom = steht. Damit stehen 
dann aus Sicht des = links und rechts dieselben Datentypen und es gibt 
für den Compiler keinen Grund mehr, eine Warnung zu werfen.

Eigentlich ganz einfach, wenn man begriffen hat, das Variablen nicht nur 
einen Wert haben, sondern auch einen Datentyp und das der Compiler sich 
die Datentypen ansieht und die nicht einfach nur Dekoration sind.

von Winnie (Gast)


Lesenswert?

Hm, Danke, habs aber immer noch nicht geschnallt, wo das Problem ist.


int eeprom *ptr_to_eeprom;
int *ptr_to_ram;

Es sind sowohl im Eeprom als auch im Ram int-Variable.

von Winnie (Gast)


Lesenswert?

Ach so, ATMega, Compiler CodeVision.

von Daniel V. (danvet)


Lesenswert?

Winnie schrieb:
> Hm, Danke, habs aber immer noch nicht geschnallt, wo das Problem ist.
>
>
> int eeprom *ptr_to_eeprom;
> int *ptr_to_ram;
>
> Es sind sowohl im Eeprom als auch im Ram int-Variable.

und was ist "eeprom"?
poste doch mal den kompletten Code

von Mick M. (highlow)


Lesenswert?

Hmm, es wurde doch schon geschrieben.

Karl Heinz Buchegger schrieb:
> Also: welcher Datentyp steht links vom =, welcher Datentyp steht rechts
> vom =?

Deine 2d Arrays haben welchen Datentyp?

von Thomas E. (thomase)


Lesenswert?

Winnie schrieb:
> int eeprom
und den Variablentyp gibt es da?

Winnie schrieb:
> -a value of type 'eeprom unsigned int' was assigned to an entity of typ
> -a value of type 'unsigned int' was assigned to an entity of typ
Da steht, daß der Compiler dich davor warnt, daß du in eine 'eeprom 
unsigned int'-Variable in eine 'unsigned int'-Variable schreibst.

Also sage ihm, daß du das in Ordnung findest:

>ptr_to_eeprom= &Light_time_data_ee[0][0];

ptr_to_eeprom= (eeprom unsigned int*)&Light_time_data_ee[0][0];

mfg.

von Winnie (Gast)


Lesenswert?

Das ist mehr oder weniger der gesamte Code, zumindest der, der das 
Problemchen verursachst.

eeprom unsigned int Light_time_data_ee [8][4];
unsigned int Light_time_data[8][4];

void main(void)
{int eeprom *ptr_to_eeprom;
 int *ptr_to_ram;
 unsigned char loop;

 ptr_to_eeprom=& Light_time_data_ee;
 ptr_to_ram=& Light_time_data;
 for (loop=0;loop<sizeof (Light_time_data_ee) ;loop++)
      *ptr_to_ram++=(long)*ptr_to_eeprom++;

 while (1)
       {
       }

}

von Winnie (Gast)


Lesenswert?

das long wegdenken :-)

von Klaus W. (mfgkw)


Lesenswert?

Winnie schrieb:
> mehr oder weniger

Mit mehr oder weniger Info kannst du beim Pater deines Vertrauens 
Lebenshilfe bekommen.

Sollen hier alle rumraten, oder was wird das?

von Klaus W. (mfgkw)


Lesenswert?

Winnie schrieb:
> das long wegdenken :-)

Nein, ich denke mir nichts weg und nichts dazu.
Liefere konkrete Info, dann bekommst du auch genau darauf Antworten.

von Winnie (Gast)


Lesenswert?

Natürlich ist das Programm ein wenig länger, es ist aber niemanden damit 
gedient, 1400 Zeilen einzustellen...

Also habe ich es auf das gekürzt, was wesentlich ist und die Warnung 
schmeisst. Es wird beim kopieren noch mit 60 multipliziert (daher das 
long), im EEprom stehen minuten, im RAM-Array will ich dann die Sekunden 
haben (das sind long-Variablen). Aber das ist auch sekundär. Ich finde - 
je weniger, desto besser.

eeprom unsigned int Light_time_data_ee [8][4];
unsigned int Light_time_data[8][4];

void main(void)
{int eeprom *ptr_to_eeprom;
 int *ptr_to_ram;
 unsigned char loop;

 ptr_to_eeprom=& Light_time_data_ee;
 ptr_to_ram=& Light_time_data;
 for (loop=0;loop<sizeof (Light_time_data_ee) ;loop++)
      *ptr_to_ram++=*ptr_to_eeprom++;

 while (1)
       {
       }

}

von Klaus W. (mfgkw)


Lesenswert?

Es geht schon mit deinem eeprom los.

Winnie schrieb:
> Ich finde -
> je weniger, desto besser.

Ja.
Deshalb meine Antwort:

von Winnie (Gast)


Lesenswert?

Ich danke dir für deine Mühe.

von Daniel V. (danvet)


Lesenswert?

Winnie schrieb:
> Natürlich ist das Programm ein wenig länger, es ist aber niemanden damit
> gedient, 1400 Zeilen einzustellen...

das kannst du ja dem überlassen, der gerne antworten möchte

von Karl H. (kbuchegg)


Lesenswert?

> for (loop=0;loop<sizeof (Light_time_data_ee) ;loop++)

das wird nicht das tun, was du dir davon erwartest. sizeof liefert die 
Größe in Bytes. Und es ist ziemlich unwahrscheinlich, dass ein unsigned 
int auf deinem System eine sizeof von 1 hat :-)

von Winnie (Gast)


Lesenswert?

Tja, sonst heisst es immer:
-es ist unhöflich, Riesenprogramme einzustellen
-selbst eingrenzen und den Teil posten, der nachvollziehbar das Problem 
verursacht.

Ok, ist dann auch wieder nicht recht :-(

Ich sollte mir wohl mal ein C-Buch kaufen, der Tip fehlt auch noch...

Ich mach einfach meinen Frieden mit den Warnungen
@Thomas Eckmann:
ptr_to_eeprom=(eeprom unsigned int*) & Light_time_data_ee[0][0];
ändert nichts.

Falls dennoch jemand eine Idee hat, würde ich mich freuen.

von Karl H. (kbuchegg)


Lesenswert?

Das hier:
1
eeprom unsigned int Light_time_data_ee [8][4];
2
unsigned int Light_time_data[8][4];
3
4
...
5
6
 int eeprom *ptr_to_eeprom;
7
 int *ptr_to_ram;
8
9
 ...
10
11
 ptr_to_eeprom=& Light_time_data_ee;

ist keine gute Idee.
Wenn LIght_time_data_ee ein Array von unsigned int ist, dann ist ein 
Element aus dem Array logischerweise ein unsigned int.
Ein Pointer darauf sollte daher ein Pointer auf unsigned int sein, und 
nicht ein Pointer auf int.
Seinen Compiler anzulügen ist meistens keine gute Idee. Manchmal merkt 
der das sogar und beschwert sich mit einer Warning :-)

von Karl H. (kbuchegg)


Lesenswert?

Winnie schrieb:

> Ich mach einfach meinen Frieden mit den Warnungen
> @Thomas Eckmann:
> ptr_to_eeprom=(eeprom unsigned int*) & Light_time_data_ee[0][0];
> ändert nichts.
>
> Falls dennoch jemand eine Idee hat, würde ich mich freuen.


Ja, nimm meinen Tip von oben ernst!
Deshalb hab ich ihn dir gegeben.


Welcher Datentyp steht links vom =, welcher Datentyp steht rechts davon.

Das ist das um und auf um mit Datentypen, mit Problemen bei der 
Auswertung von Ausdrücken und mit seltsamen Fehlern umzugehen.
Lern es und mach es! Jetzt!


(PS: in deinem Fall ist der Cast keine gute Idee. Denn du hast vorher 
schon deinen Compiler angelogen. Frag dich doch einfach mal, warum 
eigentlich ptr_to_eeprom ein Pointer auf einen int ist, während das 
Array vom Type unsigned int ist.)

von Winnie (Gast)


Lesenswert?

unsigned int eeprom *ptr_to_eeprom;
unsigned int *ptr_to_ram;
Das wars :-), wie blöd von mir. Ich dachte, es reicht, wenn der pointer 
weiss, wie gross die Variablen sind.

mit sizeof hast du natürlich auch recht, bei mir steht die magic 32 drin 
:-)


1000 Dank!

von Karl H. (kbuchegg)


Lesenswert?

Winnie schrieb:

> mit sizeof hast du natürlich auch recht, bei mir steht die magic 32 drin
> :-)

Noch schlechter.
Machs wenigstens so
1
#define LIGHT_ROWS   8
2
#define LIGHT_COLS   4
3
4
eeprom unsigned int Light_time_data_ee [LIGHT_ROWS][LIGHT_COLS];
5
unsigned int Light_time_data[LIGHT_ROWS][LIGHT_COLS];
6
7
...
8
9
   for( loop = 0; loop < LIGHT_ROWS * LIGHT_COLS; loop++ )

kostet dich nichts und du hast die Gewähr, dass
* die beiden Arrays immer gleich gross sind
* die Schleifensteuerung korrekt gross ist
* du bei einer Änderung nichts übersehen kannst.
  Du brauchst mehr Spalten? Kein Problem, mach LIGHT_COLS größer
  und um den Rest kümmert sich der Compiler.

Lass den Compiler für dich arbeiten!

von TOOOHMAAATOOOH (Gast)


Lesenswert?

mal ne zwischenfrage, muss man sich extra pointer machen um auf die 
arrays zu zeigen fürs rumkopieren? was spricht dagegen die arrays direkt 
dafür zu verwenden? also:

eeprom unsigned int Light_time_data_ee [8][4];
unsigned int Light_time_data[8][4];

void main(void)
{unsigned char loop;

 for (loop=0;loop<sizeof (Light_time_data_ee) ;loop++)
      **(Light_time_data++)=**(Light_time_data_ee++);

 while (1)
       {
       }

}

so ungefähr.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

TOOOHMAAATOOOH schrieb:
> was spricht dagegen die arrays direkt
> dafür zu verwenden?

Daß es nicht geht.

Was passiert wohl hier?
1
unsigned int Light_time_data[8][4];
2
3
Light_time_data++;

Das übersetzt Dir kein Compiler. Und das ist der Punkt, an dem der 
essentielle Unterschied von Array und Pointer zutagetritt.

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.