Forum: Compiler & IDEs (Zeiger auf ) Array von Zeigern


von Gast (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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 :-)

von Gast (Gast)


Lesenswert?

Ach so, der Aufruf:
MyFunction(MyStructPointerArray);

von Klaus W. (mfgkw)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Davon abgesehen, du hast in der Funktion keine Chance über den Pointer 
und sizeof an die Größe des Arrays zu kommen.

von Gast (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

>> 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.

von Stefan E. (sternst)


Lesenswert?

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)

von Klaus W. (mfgkw)


Lesenswert?

und willst du auch mit derselben Funktion über MyStructArray
iterieren? Dann müsste die auch umfrisiert werden, weil
die einen anderen Typ hat wie die anderen Felder.

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.