array über pointer auslesen

#705864
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
#705875
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
Gast #705900
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...
Gast #763624
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
#763768
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.
Gast #763817
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
Gast #763863
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
#763921
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
#763982
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.
#763984
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.
#764003
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren