Pointer auf array

Gast #2793741
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?
#2793760
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
}
Gast #2793769
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.
Gast #2793773
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.
#2793778
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.

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