Pointer auf array

Gast #2793741
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.