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
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
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++);
...
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...
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
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.
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
@ 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
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
@ 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
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.
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.
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.