mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik array über pointer auslesen


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gibt es eine Möglichkeit, ein Array über einen Pointer komplett 
auszulesen?
unsigned int Array[3] = {0x00, 0x01, 0x34}; 
unsigned int *ptr; 

ptr = Array; 

printf("0x%x, %x, %x, %x\n", Array[0], Array[1], Array[2], Array[3]); 
// das geht

printf("0x%x\n", ptr); 
// 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

Autor: Sebastian Mazur (izaseba)
Datum:

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

Dann klappt auch Dein Pointer;-)

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht 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?
printf("0x%x\n", *ptr);

Also, dass ich hier das komplette Array angezeigt bekomme?

Bernd

Autor: Sebastian Mazur (izaseba)
Datum:

Bewertung
0 lesenswert
nicht 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++);
...

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sebastian Mazur (izaseba)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edit:

So ist es besser

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

Gruß Sebastian

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
void Redraw_Page_STV5730_fv( uint16_t DisplayBufferPointer_pu16[24][],
                             uint8_t vscroll_offset_u8 )

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

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Matthias Kölling (Gast)

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

Ganz einfach.
static uint16_t DisplayBuffer_mau16[24][8];

void Redraw_Page_STV5730_fv(uint16_t DisplayBufferPointer_pu16[][8],uint8_t
vscroll_offset_u8)

MFG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,

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

Besten Dank!!!

Gruß Matthias

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger (kbuchegg) (Moderator)

>Macht aber nichts. Der Compiler weiss das.

???
Das gibt dann ne Fehlermeldung, oder?

MFg
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.