(Zeiger auf ) Array von Zeigern

Gast #1484173
Ich habe ein Array von Strukturen:
1
struct MyStruct MyStructArray [] = {...}

Auf eine Auswahl der Elemente möchte ich über ein weiteres Array 
zugreifen können:
1
struct MyStruct * MyStructPointerArray [] = {&MyStructArray[0], ...}

Der Zugriff soll in einer Funktion geschehen:
1
MyFunction(struct Mystruct * MyStructPointer)
2
{
3
  struct MyStruct *MyStructPointer_local;
4

5
  for (MyStructPointer_local=MyStructPointer; MyStructPointer_local < sizeof MyStructPointer / sizeof (MyStructPointer[0]); MyStructPointer_local++)
6
  {
7
    AnotherFunction(MyStructPointer_local);
8
  }
9
};

Ich bekomme allerdings eine Warnung:
1
warning: passing argument 1 of 'MyFunction' from incompatible pointer type
 und mein Programm tut nicht.

Wahrscheinlich gehe ich umständlich vor, Vereinfachungen sind natürlich 
willkommen! Danke.
wo tritt der Fehler auf/wird gemeldet?

Und:
Bitte nicht irgend einen ähnlichen Quelltext mit irgendwelchen
ähnlichen Meldungen posten, sondern den exakten Text!
Copy&Paste geht doch glaube ich auch schon in Windows, wenn auch
unnötig umständlich :-)
MyStructPointerArray ist ein Feld von Zeigern auf struct MyStruct.

Wenn man ein Feld als Parameter übergibt, wird tatsächlich
nicht das Feld übergeben, sondern ein Zeiger auf sein erstes
Element.

Also wird beim Funktionsaufruf ein Zeiger auf das unterste
Element in MyStructPointerArray übergeben, also die Adresse
von MyStructPointerArray[0].

MyStructPointerArray[0] hat den Typ struct MyStruct*.
Davon wird die Adresse übergeben; diese hat den Typ
struct MyStruct**.

Also wäre der richtige Typ des Parameters nicht wie
hier struct MyStruct*, sondern struct MyStruct**.

mfgkw
Gast schrieb:
> Ah, dankeschön für die Erklärung!
> Allerdings - wie iteriere ich dann über MyStructPointerArray?

2 Möglichkeiten:
* Die Länge des Arrays der Funktion mitgeben
* Vereinbarung treffen, dass der "letzte" Pointer im Array immer
  ein NULL Pointer ist

Aber egal wie du es drehst und wendest: Die Funktion hat keine Chance, 
ohne Hilfe von außen die Länge des Arrays festzustellen. Das ist nun mal 
so in C. Lebe damit und arbeite damit.

(Was denkst du, warum wohl ist die Signatur von main in seiner 
ausführlichen Form

 int main( int argc, char * argv[] )

argc ... Anzahl Argumente
argv ... die tatsächlichen Argumente in Arrayform, wobei jeder
         Pointer im Array auf einen String für das Argument zeigt
Vielleicht solltest du erstmal klären, über was genau du in der Funktion 
iterieren willst. Immer über MyStructPointerArray, wie es dein letzter 
Post nahe legt, oder über unterschiedliche Arrays unterschiedlicher 
Länge, wie es der Sourcecode im ersten Post nahe legt.
Gast
>> Allerdings - wie iteriere ich dann über MyStructPointerArray?
> Vielleicht solltest du erstmal klären,
Stimmt, das war falsch ausgedrückt:
Ich möchte über verschiedene Listen mit ausgewählten Adressen von den 
Elementen aus MyStructArray iterieren.
Gast schrieb:

> Ich möchte über verschiedene Listen mit ausgewählten Adressen von den
> Elementen aus MyStructArray iterieren.

Dann bleibt dir nichts anderes übrig, als der Funktion die Länge des 
Arrays irgendwie mitzuteilen, direkt oder indirekt. (siehe Post von 
Karl-Heinz)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.