Forum: Mikrocontroller und Digitale Elektronik Pointer auf array


von unregistered (Gast)


Lesenswert?

Ich komme gerade nicht wirklich zurecht und leider wüsste ich auch nciht 
unter welchem Stichwort google die Antwort weiß...

In einem 2d-Array merke ich mir Koordinaten
1
uint16_t coord[][2] = { {x0,y0},{x1,y1},... };

jetzt möchte ich einen Pointer haben, der auf ein Wertepaar zeigt, also 
ein uint16_t[2].
Ich dachte das ginge so, ergibt aber ein 'initilization from 
incompatible pointer type'.
1
uint16_t (*pcoord)[2] = coord[0];
2
3
4
*pcoord[0] ----> x0
5
6
*(pccord+1)[0] ----> x1

Wie geht das?

von Karl H. (kbuchegg)


Lesenswert?

unregistered schrieb:

> Wie geht das?

Am besten geht das, wenn du dein Repertoir an Datenstrukturen noch um 
Strukturen erweiterst.

Eine Zusammenfassung von 2 uint16_t (also 2 Koordinaten-Werten), nennst 
du einen 'Punkt'.
1
struct Punkt_
2
{
3
  uint16_t x;
4
  uint16_t y;
5
};
noch ein typedef dazu, um die struct ohne viel Tippaufwand verwenden zu 
können
1
typedef struct Punkt_ Punkt;
und du kannst ein Array von Punkten(!) erstellen
1
Punkt coord[] = {
2
  { 10, 12 },
3
  {  8,  4 },
4
  { 45, 68 },
5
  ..
6
};
Ein Pointer auf einen bestimmten Punkt ist dann ganz einfach ein
1
 Punkt* somePoint = &coord[5];


Nicht alles wird vernünftig als Array modelliert. Wenn zwischen Dingen 
ein starker Zusammenhalt besteht, wie zb zwischen Vorname und Nachnahme, 
oder Tag/Monat/Jahr oder Stunde/Minute/Sekunde oder .... oder eben auch 
der X und Y Koordinate einer Position dann modelliert man diesen 
Zusammenhalt besser als Struktur und erzeugt dann erst davon ein Array.

Das hat dann auch den Vorteil, dass man in eine Funktion zb direkt einen 
Punkt reingeben kann (oder einen Pointer darauf) und somit mit 
projektbezogenen Begriffen und Datentypen operiert.
1
Punkt add( Punkt* a, Punkt* b )
2
{
3
  Punkt result;
4
  result.x = a->x + b->x;
5
  result.y = a->y + b->y;
6
}
7
8
Punkt sub( Punkt* a, Punkt* b )
9
{
10
  Punkt result;
11
  result.x = a->x + b->x;
12
  result.y = a->y + b->y;
13
}
14
15
double distance( Punkt* start, Punkt* end )
16
{
17
  Punkt diff = sub( end, start );
18
  return sqrt( diff->x * diff->x + diff->y * diff->y );
19
}
20
21
void draw( Punkt* start, Punkt* end )
22
{
23
  DrawLine( start->x, start->, end->x, end->y );
24
}
25
26
int main()
27
{
28
  Punkt Diff = sub( &coord[4], &coord[8] );  // Berechne die Differenzz vom Punkt 4 zum Punkt 8
29
  double distance( &coord[2], &coord[1] );   // Berechne die Distanz vom Punkt 2 zum Punkt 1
30
31
  draw( &coord[3], &coord[4] ); // zeichne eine Linie von Punkt 3 zum Punkt 4
32
}

von (prx) A. K. (prx)


Lesenswert?

uint16_t (*pcoord)[2] = &coord[0];

von unregistered (Gast)


Lesenswert?

Da hast du natürlich Recht.

Und für meinen Seelenfrieden - wie würde denn das originale Problem 
notiert werden? int (*p)[2] ist doch ein Pointer auf einen Vektor, oder? 
-sollte- das nicht funktionieren?

Ich habe mich da sicher etwas verzettelt und danke dir für die Antwort, 
aber wurmt mich jetzt schon.

von unregistered (Gast)


Lesenswert?

ok gerade gelesen, danke an Karl Heinz und A.K.

Und Schande über mich -.-

&coord[0] hatte ich tatsächlich versucht mit Fehler. Schleuerweise hatte 
ich das obige Array const notiert.

Ich bin aber froh über eure Ratschläge und irgendwie auch, daß ich nicht 
völlig daneben lag.

von Karl H. (kbuchegg)


Lesenswert?

unregistered schrieb:
> Da hast du natürlich Recht.
>
> Und für meinen Seelenfrieden - wie würde denn das originale Problem
> notiert werden? int (*p)[2] ist doch ein Pointer auf einen Vektor, oder?

Das passt schon.

Von innen nach aussen gelesen

      p        p ist
     *p        p ist ein Pointer
    (*p)[      p ist ein Pointer auf ein Array
    (*p)[2]    p ist ein Pointer auf ein Array der Länge 2
int (*p)[2]    p ist ein Pointer auf ein Array der Länge 2 von int


> -sollte- das nicht funktionieren?

Dein Problem ist die rechte Seite der Initilisierung.


ABer du solltest wirklich die Sichtweise des 'Im Notfall kann ich immer 
ein mehrdimensionales Array benutzen' zugunsten von Strukturen aufgeben. 
Da beginnt das Modellieren eines Problems.

von unregistered (Gast)


Lesenswert?

Nehme ich mir zu Herzen. Danke

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.