Forum: Mikrocontroller und Digitale Elektronik array über pointer auslesen


von Bernd S. (mms)


Lesenswert?

Hallo,

gibt es eine Möglichkeit, ein Array über einen Pointer komplett 
auszulesen?
1
unsigned int Array[3] = {0x00, 0x01, 0x34}; 
2
unsigned int *ptr; 
3
4
ptr = Array; 
5
6
printf("0x%x, %x, %x, %x\n", Array[0], Array[1], Array[2], Array[3]); 
7
// das geht
8
9
printf("0x%x\n", ptr); 
10
// hier kommt leider nichts raus

Oder muss man stets die einzelnen elmente des Arrays auslesen (Array[0] 
etc.)?

Gibt es eine Alternative, wenn man das Array als String speichert? Kann 
man dann auch Bytes aus einem Speicherbereich als String konvertieren 
und somit dadurch die Werte des Arrays ersetzen?

Bernd

von Sebastian M. (izaseba)


Lesenswert?

printf("0x%x\n", *ptr);

Dann klappt auch Dein Pointer;-)

von Bernd S. (mms)


Lesenswert?

oh shit - so simple...

aber gibt es auch eine Möglichkeit (außer dem String), dass man mit 
einem *ptr das komplette Array und nicht nur ein Element des Arrays 
auslesen kann?
1
printf("0x%x\n", *ptr);

Also, dass ich hier das komplette Array angezeigt bekomme?

Bernd

von Sebastian M. (izaseba)


Lesenswert?

Klar geht das, schonmal was von Pointerarithmetik gehört ?

Z.B eine Schleife
...

while (ptr <= (Array+(sizeof(Array)/sizeof(int))))
   printf("0x%x\n", *ptr++);
...

von Jorge (Gast)


Lesenswert?

Es geht auch so:

printf("0x%x, %x, %x, %x\n", ptr[0], ptr[1], ptr[2], ptr[3]);

und so auch:

printf("0x%x, %x, %x, %x\n", *ptr, *(ptr+1), *(ptr+2), *(ptr+3));

Schön finde ich auch anonyme Klassen in C++ und auch den Kommaoperator:

int i=(1,2,3); //was kommt raus, wer hats erfunden.

damit schreibst du:

for ((i=0,j=0,k=0);i*j*k<100;(i++,j++,k++)) {
  //do nothing else
}

supergut aufpassen bei:

if (a() && b() && c()) {

// ob b und c aufgerufen wird hängt nur von a() ab.

}

auch toll wenn man schreiben kann:

myfunz(2)=3;

geht nämlich wenn:

int &myfunz(int iv) {
  return *new int(iv);
}

aber Vorsicht, der Pointer hängt...


tja, c und vor allem c++ bedeutet totale Freiheit und Kreativität...

von Sebastian M. (izaseba)


Lesenswert?

Edit:

So ist es besser

while (ptr < (Array+(sizeof(Array)/sizeof(int))))

Gruß Sebastian

von Matthias Kölling (Gast)


Lesenswert?

Hallo,

geht das auch, wenn das Array selbst nicht im file bekannt ist?

Ich habe folgendes Problem:
Im file display.c habe ich

static uint16_t DisplayBuffer_mau16[24][8];

declariert. Im gleichen file rufe ich eine Funktion auf, der der Pointer 
der Anfangsadresse des Arrays übergeben wird.

Redraw_Page_STV5730_fv(DisplayBuffer_mau16,vscroll_offset);

im file osd.c ist diese Funktion definiert:

void Redraw_Page_STV5730_fv(uint16_t *DisplayBufferPointer_pu16,uint8_t 
vscroll_offset_u8)
{
   .
   .
   send2_stv_fv(DisplayBufferPointer_pu16[colum_counter_u8]
                                         [row_counter_u8]);
   .
   .
}
Jetzt bringt der GCC eine Fehlermeldung:

../osd.c:224: error: subscripted value is neither array nor pointer

Was mache ich falsch oder wie kann ich das Problem lösen?

Eine abenteuerliche Idee wäre, das Array einzeln in eine Struktur zu 
packen und als Typ zu definieren. Wenn der Pointer dann von diesem Typ 
ist, müsste der Compiler doch verstehen, dass ich auf ein 
zweidimensionales Array zugreifen will.

Gruß Matthias

von Karl H. (kbuchegg)


Lesenswert?

Matthias Kölling wrote:
> Hallo,
>
> geht das auch, wenn das Array selbst nicht im file bekannt ist?

Wenn es sich um ein 1-dimensionales Array handelt, spricht nichts
dagegen.

>
> Ich habe folgendes Problem:
> Im file display.c habe ich
>
> static uint16_t DisplayBuffer_mau16[24][8];

ALso ein 2-dimensionales Array

> declariert. Im gleichen file rufe ich eine Funktion auf, der der Pointer
> der Anfangsadresse des Arrays übergeben wird.
>
> Redraw_Page_STV5730_fv(DisplayBuffer_mau16,vscroll_offset);
>
> im file osd.c ist diese Funktion definiert:
>
> void Redraw_Page_STV5730_fv(uint16_t *DisplayBufferPointer_pu16,uint8_t
> vscroll_offset_u8)
> {
>    .
>    .
>    send2_stv_fv(DisplayBufferPointer_pu16[colum_counter_u8]
>                                          [row_counter_u8]);
>    .
>    .
> }
> Jetzt bringt der GCC eine Fehlermeldung:
>
> ../osd.c:224: error: subscripted value is neither array nor pointer

Logo: Du möchtest DisplayBufferPointer_pu16 wie ein 2-dimensionales
Array benutzen. Das kann aber so nicht gehen. Der Compiler
benötigt die Größe der ersten Dimension um die Zugriffsarithmetik
machen zu können. Von einem mehrdimensionalen Array müssen
also die Größen aller Dimensionen bekannt sein. Lediglich die
letzte Dimension darf in der Größe unbekannt sein.

>
> Was mache ich falsch oder wie kann ich das Problem lösen?

Übergib als 2-dimensionales Array und alles wird gut.
1
void Redraw_Page_STV5730_fv( uint16_t DisplayBufferPointer_pu16[24][],
2
                             uint8_t vscroll_offset_u8 )

Das ist einer der wenigen Fälle, in denen ich tatsächlich zu
deiser besch.... [] Syntax rate.

von Matthias Kölling (Gast)


Lesenswert?

Hallo Karl Heinz,

dann übergebe ich aber das komplette Array über den Stack. Prinzipiell 
ist mir das Wurscht, wenn mir nicht der RAM ausgehen würde. Kann das mit 
der Struktur funktionieren?

Gruß Matthias

von Falk B. (falk)


Lesenswert?

@ Matthias Kölling (Gast)

>dann übergebe ich aber das komplette Array über den Stack. Prinzipiell

Das macht man auch nicht. Man übergibt Pointer, nicht die Arrays selbst.
3 Lektion Grundlagen C.

MFg
Falk

von Matthias Kölling (Gast)


Lesenswert?

Hallo Falk,

es kann schon sein, dass ich nach 10 Jahren Berufserfahrung in der 
Automobilindustrie immer noch ein Volldepp bin. Das stand hier aber 
nicht zur Diskussion.
Die Frage war: Wie übergebe ich einen Pointer auf ein zweidimensionales 
Array?

Gruß Matthias

von Falk B. (falk)


Lesenswert?

@ Matthias Kölling (Gast)

>Die Frage war: Wie übergebe ich einen Pointer auf ein zweidimensionales
>Array?

Ganz einfach.
1
static uint16_t DisplayBuffer_mau16[24][8];
2
3
void Redraw_Page_STV5730_fv(uint16_t DisplayBufferPointer_pu16[][8],uint8_t
4
vscroll_offset_u8)

MFG
Falk

von Falk B. (falk)


Lesenswert?

@ Karl heinz Buchegger (kbuchegg) (Moderator)

>void Redraw_Page_STV5730_fv( uint16_t DisplayBufferPointer_pu16[24][],
>                             uint8_t vscroll_offset_u8 )

Kann es ein, dass du die Indizes vertauscht hast?

MFG
Falk

von Matthias Kölling (Gast)


Lesenswert?

Hallo Falk,

Deine Variante scheint das Problem, zumindest was den Compiler 
anbelangt, zu lösen.

Besten Dank!!!

Gruß Matthias

von Karl H. (kbuchegg)


Lesenswert?

Falk Brunner wrote:
> @ Karl heinz Buchegger (kbuchegg) (Moderator)
>
>>void Redraw_Page_STV5730_fv( uint16_t DisplayBufferPointer_pu16[24][],
>>                             uint8_t vscroll_offset_u8 )
>
> Kann es ein, dass du die Indizes vertauscht hast?

Kann sein.
Ich kann mir immer nie merken, welche Klammer leer bleiben
darf :-)

Macht aber nichts. Der Compiler weiss das.

von Karl H. (kbuchegg)


Lesenswert?

Matthias Kölling wrote:
> Hallo Karl Heinz,
>
> dann übergebe ich aber das komplette Array über den Stack.

Du übergibst nie ein Array.
Arrays werden immer übergeben, indem die Startadresse des Arrays
übergeben wird. Lediglich der empfangende Pointer muss vom
richtigen Typ sein.

von Falk B. (falk)


Lesenswert?

@  Karl heinz Buchegger (kbuchegg) (Moderator)

>Macht aber nichts. Der Compiler weiss das.

???
Das gibt dann ne Fehlermeldung, oder?

MFg
Falk

von Karl H. (kbuchegg)


Lesenswert?

Falk Brunner wrote:
> @  Karl heinz Buchegger (kbuchegg) (Moderator)
>
>>Macht aber nichts. Der Compiler weiss das.
>
> ???
> Das gibt dann ne Fehlermeldung, oder?

Ja. Der mault dann irgendwas von einer fehlenden Arraydimensionierung.
Dann nehm ich einfach die andere Klammer und gut ists. (*)
Obwohl: Im Moment kann ich mich gar nicht daran erinnern, wann ich
das letzte mal ein 2D Array explizit übergeben habe. Hmmm.


(*) dazu muss man wissen, dass ich oft mit Fehlermeldungen
arbeite. Zb. mach ich mir keinen Kopf von wegen Variablen-
dimensionierungen. Ich schreib den Code vor mich hin und benutz
nachher den Compiler und rauszufinden welche Variablen ich nicht
definiert habe. Ich finde das geht so viel schneller als wie wenn
ich den Code durchgehe und das händisch mache.

Also: Keine Angst vor Fehlermeldungen. Man kann die auch wunderbar
ausnutzen.

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.