Einzelnen Beitrag anzeigen
Alt 13.10.2005, 18:08   #4 (permalink)
kerri
Die Kerrimaus
 
Benutzerbild von kerri
 

Registriert seit: 17.11.2003
Beiträge: 2.987

kerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz seinkerri kann auf vieles stolz sein

Standard AW: Array an main() senden in C

Zitat:
Zitat von smoek
[...]
Vor der main() kommt nix, also kannst du auch nichts "an die main() übergeben".[...]
Um, natuerlich kann man der Main was uebergeben, wenn auch nicht in dem Sinne, in dem es hier vonnoeten waere Jedoch kann man der Main nur Kommandozeilenargumente direkt beim Start uebergeben. Aber das ist fuer das Problem hier voellig unerheblich, ich versuch mal, nen moeglichen Loesungsweg zu erklaeren.

Die Herangehensweise ist verkehrtrum, dreht man die um, klappts auch Das meine ich so: Nicht die Funktion etwas an main() zurueckgeben lassen, aber die main() der Funktion ein leeres Array uebergeben, die dann damit allerhand anstellen kann, z.B. auch Werte da hineinlegen.

Bei Arrays ist die Uebergabe aber leider nicht ganz so einfach, da muss man leider einen Ausflug zu Pointern machen. Ein Array zeichnet sich durch drei grundlegende Eigenschaften aus: der Datentyp (int, float,...) der Elemente, die Adresse des ersten Elements (array[0]) und die Laenge des Arrays. So kann jedes Element des Arrays gefunden werden.

Was Du nun willst, ist, in der main() ein Array der benoetigten Laenge zu erzeugen, und der Unterfunktion sagen, das sie die Werte genau dahin speichern soll. Um das zu Bewerkstelligen, brauchst Du die Speicherposition (=Adresse) des Arrays. Fragen kannst du das erste Element, wo es gespeichert ist, mit & vor dem namen, also etwa &alle_meine_Entchen[0] liefert die Speicheradresse des ersten Elements zurueck. Diese Speicheradressen duerften in etwa so aussehen: 0x89cbd30.

Damit kannst Du natuerlich nicht viel Anfangen, aber die Unterfunktion koennte es. Dazu muss sie aber wissen, das sie eine Adresse beim Aufruf uebergeben bekommt, und keine einfache Zahl. Variablen, in denen Adressen gespeichert werden, initialisiert man daher mit einem vorgestellten Sternchen. Zum Beispiel int *gelbes_entchen; kann eine Adresse speichern, an der eine Integer Zahl liegt. gelbes_entchen ist dann einer dieser ominoesen Pointer - er 'zeigt' auf eine Zahl.

Die Unterfunktion muesstest du also so bauen, das sie einen Pointer uebernimmt, und die Main so, das sie der Unterfunktion eine Adresse uebergibt. Kleines Beispiel zur Veranschaulichung:

Code:
int main ()
{
  int i; 
  int MeinArray[42];

  printf("Unbearbeitet:  ");  // das unbearbeitete Array ausgeben
  for (i=0;i<42;i++)
  {
     printf("%d  ",MeinArray[i]);
  }
  printf("\n");

  meinefunktion(&MeinArray[0]);  // Funktion aufrufen und Adresse des ersten Elements uebergeben

  printf("Bearbeitet:    "); // das bearbeitete Array ausgeben
  for (i=0;i<42;i++)
  {
     printf("%d  ",MeinArray[i]);
  }
  printf("\n");

  return 0;
}

void meinefunktion(int *pMeinArray) // Adresse des ersten Arrayelements entgegennehmen
{
  int i;
 
  for (i=0;i<42;i++)
  {
     pMeinArray[i] = 42 * 23;  // das Array belegen
  }
}

Was passiert hier: in main() wird ein Array erzeugt, der Funktion meinefunktion() wird gesagt, sie soll da hineinschreiben, und das Array, was eigentlich main() 'gehoert' veraendern. Noch was zur Namensgebung, Du kannst natuerlich einen pointer (nach C Namenskonvention) beliebig benamsen, als der im Beispiel muesste nicht unbedingt pMeinArray heissen, er koennte z.B. auch hintertupfingen heissen - ist aber nicht wirklich praktisch, denn so fehlt jede Zuordnung zum Zweck des Pointers. Pointer mit pName zu benamsen ist recht weit verbreitet.

So, eine Kleinigkeit gibts aber noch zu sagen, bei Arrays gibts noch was ganz praktisches, der Name des Arrays liefert gleichzeitig die Adresse des ersten Elements, also es gilt: MeinArray == &MeinArray[0] Ist natuerlich nun maximal verwirrend, mal mit & und mal ohne, aber das ist einfach nur ne Gewoehnungs/Faulheitsfrage.


Gruesse, kerri

PS.; Ich hoffe, das zusammengeschusterte Proggie oben tut, was es soll, getestet hab ichs nicht
kerri ist offline   Mit Zitat antworten