Forum: Compiler & IDEs const struct variablen im flash die sich gegenseitig mit pointern referenzieren, wie?


von ShadowX.H. (Gast)


Lesenswert?

Wie kriege ich Strukturen ins flash die sich bieliebig gegenseitig 
anpointen?
Ich kann ja nicht vor-deklarieren und dann inizialisieren, muss ja const 
sein fürs PROGMEM
1
// PC-Programm
2
3
#include <stdio.h>
4
#include <stdlib.h>
5
6
typedef struct something {
7
   int    x;
8
   int    y;
9
   const struct something *p;
10
}something;
11
12
// a,b,etc. sollen mal Konstanten im flash vom avr sein (mit PROGMEM)
13
const something a={1,2,&b}; // <-- geht nicht, weil b ja noch nicht deklariert wurde
14
const something b={3,4,&a};
15
16
int main()
17
{
18
    printf("a hat: (%i,%i) und b hat: (%i,%i)\n",a.x,a.y,b.x,b.y);
19
20
    printf("y von a ueber b ist: %i",b.p->y);
21
    printf("x von b ueber a ist: %i",a.p->x);
22
23
    return 0;
24
}

von A. H. (ah8)


Lesenswert?

Versuch's mal mit:
1
extern const something a;
2
extern const something b;
3
4
const something a={1,2,&b};
5
const something b={3,4,&a};

Ich hab's nicht probiert, wäre aber mein nächster Versuch. extern 
führt den Namen ein, die Adresszuweisung erfolgt dann eh erst durch den 
Linker.

von Falk B. (falk)


Lesenswert?

@ ShadowX.H. (Gast)

>Wie kriege ich Strukturen ins flash die sich bieliebig gegenseitig
>anpointen?

So wie du es vorgeschlagen hast.

>Ich kann ja nicht vor-deklarieren und dann inizialisieren, muss ja const
>sein fürs PROGMEM

Das kommnt erst beim DEFINIEREN! Die DEKLARATION hat kein PROGMEM.

Hast du es einfach mal ausprobiert?

von Falk B. (falk)


Lesenswert?

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <avr/io.h>
4
#include <avr/pgmspace.h>
5
6
typedef struct something {
7
   int    x;
8
   int    y;
9
   const struct something *p;
10
}something;
11
12
extern const something a;
13
extern const something b;
14
15
const something a PROGMEM ={1,2,&b};
16
const something b PROGMEM ={3,4,&a};
17
18
int main()
19
{
20
    printf("a hat: (%i,%i) und b hat: (%i,%i)\n",pgm_read_word(&a.x), pgm_read_word(&a.y),
21
                                                 pgm_read_word(&b.x), pgm_read_word(&b.y));
22
23
    printf("y von a ueber b ist: %i",pgm_read_word(&b.p->y));
24
    printf("x von b ueber a ist: %i",pgm_read_word(&a.p->x));
25
26
    return 0;
27
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

..und aufgehübscht dann so:
1
#include <stdio.h>
2
3
typedef struct something {
4
   int x;
5
   int y;
6
   const __flash struct something *p;
7
} something;
8
9
extern const __flash something a;
10
extern const __flash something b;
11
12
const __flash something a = { 1, 2, &b };
13
const __flash something b = { 3, 4, &a };
14
15
int main()
16
{
17
    printf ("a hat: (%i,%i) und b hat: (%i,%i)\n", a.x, a.y, b.x, b.y);
18
    printf ("y von a ueber b ist: %i", b.p->y);
19
    printf ("x von b ueber a ist: %i", a.p->x);
20
21
    return 0;
22
}

Wobei in diesem Beispiel im Genensatz zu pgm_read überhaupt nicht mehr 
aus dem Flash gelesen wird / werden muß, weil der Compiler bereits alle 
Werte kennt.

Bekommt man das auch so hin, daß a und b static sind?

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.