dynamische mehrdymensionale Array an Funktion übergeben (C)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
grub
Beiträge: 130
Registriert: 19.07.2004 08:31:05
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Winterthur (Schweiz)
Kontaktdaten:

dynamische mehrdymensionale Array an Funktion übergeben (C)

Beitrag von grub » 28.07.2005 15:02:27

Moin

Ich habe jetzt mal (wieder) angefangen C zu lernen. Bin nun bei den mehrdymensionalen Arrays angelangt und habe dazu eine kleine Übung geschrieben. Es funktioniert alles bis auf ein kleines aber wichtiges Detail...

Das Ziel des Programmes ist es ein mehrdymensionales Array auszulesen und je nach Wert im Array ein anderes Symbol auszugeben. Nun habe ich eine kleine Funktion geschrieben, welche das gesamte ausliest und zeichnet. Nur will die Funktion, das ich ihr die Grösse einer Dimension des Arrays mitgebe. Nun war aber mein Ziel, dass das Programm keinerlei Angaben benötigt sondern die Grösse selber ausrechnet.

Ist es möglich entweder die in main() ausgerechnete Grösse global bekannt zu machen oder der Funktion erlauben auch ohne feste Grösse zu funktionieren?


Mein Quellcode:

Code: Alles auswählen

// Grundfunktionen wie printf()
#include <stdio.h>
// Für die Wurzelberechnung
#include <math.h>

// Gegen das ewig lange schreiben von unsigned..... nur noch lint :)
typedef unsigned short int lint;

// Funktionskopf zum Zeichnen der Felder
void zeichne_feld(lint (*feld)[], lint anzahl);

int main(int argc, char *argv[])
{
  // Zwei Dimensionales Array (Insgesamt 9 Felder)
  lint karte[3][3] = {{1,0,1},{0,1,0},{1,0,1}};
  // Anzahl der Felder der Dimensionen im Array bestimmen (--> Hier wird die Grösse ausgerechnet <--)
  lint anzahl_felder = sqrt(sizeof(karte) / sizeof(lint));
  // Zeiger für Array mit der bestimmten Grösse erstellen
  lint (*zgr)[anzahl_felder];
  // Zeiger dem Array zuweisen
  zgr=karte;
  // Funktion aufrufen
  zeichne_feld(zgr, anzahl_felder);
  return 0;
}

void zeichne_feld(lint (*feld)[3](--> Hier muss ich einen festen Wert eingeben<--), lint anzahl) {
  // Die zwei Variablen auf 0 setzen
  lint x=0,y=0;
  // Solange nicht alle Linien gezeichnet wurden
  for(x;x<anzahl;x++) {
    // Solange nicht alle Felder einer Linie gezeichnet wurden
    for(y;y<anzahl;y++) {
      // Welches Symbol soll gezeichnet werden
      switch(feld[x][y]) {
        case 0:
          printf("O");
          break;
        case 1:
          printf("X");
          break;
        default:
          printf("\?");
          break;
      }
    }
    // Nach einer Linie y (Feld) wieder auf 0 setzen
    y=0;
    // Und eine Linie runter gehen
    printf("\n");
  }
}

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Re: dynamische mehrdymensionale Array an Funktion übergeben

Beitrag von Joghurt » 28.07.2005 16:20:40

grub hat geschrieben:Ist es möglich entweder die in main() ausgerechnete Grösse global bekannt zu machen oder der Funktion erlauben auch ohne feste Grösse zu funktionieren?
Globale Variablen sind böse... Es ist eigentlich immer besser, die größe des Arrays der Funktion mit zu übergeben. Wenn du unbedingt eine globale Variable willst, kannst du den folgenden Code entsprechend anpassen...

Code: Alles auswählen

void foo(int **bar, int dim1, int dim2)
{
  //dim1 kannst du für Überlaufschecks nutzen, ist aber nicht unbedingt notwendig
   #define ARRELEM(x,y) (bar[(x)*dim2 + (y)])
   printf("Element [1,2] = %i\n", ARRELEM(1,2));
  #undef ARRELEM
}
PS: Wenn es nicht unbedingt C sein muss, nimm lieber C++, da hast du mit vector dynamische Arrays, die du beliebig verschachteln kannst, ohne dich um die Details kümmern zu müssen

Benutzeravatar
grub
Beiträge: 130
Registriert: 19.07.2004 08:31:05
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Winterthur (Schweiz)
Kontaktdaten:

Beitrag von grub » 28.07.2005 16:34:57

C wäre schon schön :)

Will sobald die grundlagen mal richtig sitzen auf mikroprozessor programmieren. und da ist c meines wissens besser geeignet

Antworten