mikrocontroller.net

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


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Array von Strukturen:
struct MyStruct MyStructArray [] = {...}

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

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

  for (MyStructPointer_local=MyStructPointer; MyStructPointer_local < sizeof MyStructPointer / sizeof (MyStructPointer[0]); MyStructPointer_local++)
  {
    AnotherFunction(MyStructPointer_local);
  }
};

Ich bekomme allerdings eine Warnung:
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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, der Aufruf:
MyFunction(MyStructPointerArray);

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.