1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Mehrdimensional Felder an Unterprogramme übergeben

  • noobie
  • 17. Mai 2008 um 19:11
  • Unerledigt
  • noobie
    4
    noobie
    Mitglied
    Punkte
    130
    Beiträge
    18
    • 17. Mai 2008 um 19:11
    • #1

    Hi,
    ich hab' folgendes Problem:

    Bei der Übergabe von mehrdimensionalen Feldern an Unterprogramme, schreibt er mir immer folgende Fehlermeldung: "cannot convert int * to int (*)[10]

    Code
    # include <time.h>
    # include <stdlib.h>
    # include <stdio.h>              
    # include <conio.h>              
    # include <ctype.h>              
    # include <string.h>             
     
    # define MAX 10    // MAXIMAL 10
     
    int wiederholen();
    void erstelle_matrix(int matrix[][MAX], int n);
    void transponiere_matrix(int matrix[][MAX], int n);
     
    void main()
    {// Variablendefinition
      int matrix[MAX][MAX], n;
      long sek;
     
      time(&sek);
      srand(sek);
     
      do
        {
     
          clrscr();
          printf ("Matrix transponieren\n\n");
          printf ("Seitenl%cnge quadratischen Matrix eingeben: ", -124);
          scanf ("%d", &n);
     
          while (n<2 || n>10)
          {
            printf("Seitenl%cnge mind. 2 und max. 10!\n");
            scanf ("%d", &n);
          }
     
          erstelle_matrix(matrix[MAX], n);
     
          for (int i=0; i<n; i++)
          {
            printf ("\n");
            for (int j=0; j<n; j++)
              printf ("%4d", matrix[i][j]);
          }
     
          transponiere_matrix(matrix[MAX], n);
     
          printf ("\n\nGespiegelte Matrix: \n");
          for (int i=0; i<n; i++)
          {
            printf ("\n");
            for (int j=0; j<n; j++)
              printf ("%4d", matrix[i][j]);
          }
     
        }
      while (wiederholen()==1);
     
    }
    int wiederholen ()
    {
      char c;
      int wh;
      do
        {
          gotoxy(60, 24);
          printf ("Weiter? (J/N) ");
          fflush (stdin);
          c=getch();
          c=toupper(c);
        }
      while (c!='J' && c!='N');
      if (c=='J')
        wh=1;
      else
        wh=0;
      return wh;
    }
     
    void erstelle_matrix(int matrix[][MAX], int n)
    {
      for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
          matrix[i][j]=rand()%20+1;
    }
     
    void transponiere_matrix(int matrix[][MAX], int n)
    {
      int help, z=1, sp=0;
      for (; z<=n-1 && sp<=n-2; z++, sp=0)
        for (int i=0; i<z; i++, sp++)
        {
          help=matrix[z][sp];
          matrix[z][sp]=matrix[sp][z];
          matrix[sp][z]=help;
        }
    }
    Alles anzeigen




    Bitte helft mir

    MfG

  • Schakal
    9
    Schakal
    Mitglied
    Reaktionen
    5
    Punkte
    780
    Beiträge
    152
    • 17. Mai 2008 um 21:09
    • #2

    Problem: warum machst du matrix[][MAX] bei erstelle Matrix warum nicht einfach matrix[][]? Bei Transponiere genauso. Ich denk mal du wolltest das ein Feld mit Zeilen/Spalten bestimmter Größe übergeben werden. So geht das leider nicht in C++. Du kannst die größe von arrays/Feldern... in C++ nicht bestimmen (außer wenn sie am Stack liegen). Deswegen passieren ja auch mal schnell Bufferoverflows etc., wenn man nicht aufpasst.

    mfg Schakal

    Einmal editiert, zuletzt von Schakal (17. Mai 2008 um 21:15)

  • MickeyM
    3
    MickeyM
    Mitglied
    Reaktionen
    4
    Punkte
    89
    Beiträge
    15
    • 17. Mai 2008 um 21:53
    • #3
    Zitat von noobie

    Hi,
    ich hab' folgendes Problem:

    ...

    Bitte helft mir

    MfG

    Alles anzeigen



    Hallo,

    den Aufruf brauchst du einfach nur so zu machen:

    Code
    erstelle_matrix(matrix, n);
    ...
    transponiere_matrix(matrix, n);



    Du willst ja schließlich das ganze, zweidimensionale Array übergeben, und nicht nur das eindimensionale Teil-Array an der Stelle MAX, das es ohnehin nicht gibt (nur 0 bis MAX-1).

    Und möglicherweise könntest du bei der Eingabeüberprüfung noch

    Code
    while (n<2 || n>MAX)



    schreiben, das hält die Sache dynamischer. :)

    hf

    In theory there is no difference between theory and practice. In practice there is.

  • noobie
    4
    noobie
    Mitglied
    Punkte
    130
    Beiträge
    18
    • 18. Mai 2008 um 10:06
    • #4

    Big THX es funzt

    MFG

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 18. Mai 2008 um 11:16
    • #5
    Zitat von noobie
    Code
    printf ("Seitenl%cnge quadratischen Matrix eingeben: ", -124);
    [...]
            printf("Seitenl%cnge mind. 2 und max. 10!\n");


    Wow. Aus welchem von einem Deutschen verfassten "Ich lerne C unter DOS 5.0"-Buch sind diese abscheulichen Codestücke entfleucht? Wenn du ä meinst, schreib ä. Wenn dein System aus irgendwelchen Gründen kein ä mag, schreib ae :)

    Jedenfalls richtet sich dieser tolle Trick im Vergleich dieser zwei Codezeilen von selbst.

    Zitat von Schakal

    Ich denk mal du wolltest das ein Feld mit Zeilen/Spalten bestimmter Größe übergeben werden. So geht das leider nicht in C++.


    Doch, fast (genau wie in C). Eine Funktionsdeklaration der Form

    Code
    t1 foo(t2 arr[dim1][dim2]...[dimn])


    wird behandelt als

    Code
    t1 foo(t2 (*arr)[dim2]...[dimn])


    Die Dimension ganz links wird weggeschmissen, die anderen bleiben über und werden streng überprüft.

    *plantsch*

    Einmal editiert, zuletzt von Plantschkuh! (18. Mai 2008 um 13:16) aus folgendem Grund: ein Paar Klammern vergessen

  • Schakal
    9
    Schakal
    Mitglied
    Reaktionen
    5
    Punkte
    780
    Beiträge
    152
    • 18. Mai 2008 um 12:29
    • #6

    Sicher gehts, aber bei Heap weiß er die Größe nicht (wenns nicht mit konstanten intialisiert wird) (In dem Fall liegts ja am Stack). Also im allgemeinen Fall muss nicht funktioneren (z.b. wenn die Größe eingelesen wurde). Oder irre ich mich da.

    mfg Schakal

    Einmal editiert, zuletzt von Schakal (18. Mai 2008 um 12:33)

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 18. Mai 2008 um 13:12
    • #7

    Ein Pointer ist kein Array, und ein Pointer auf ein Array ist kein Pointer auf einen Pointer. Ja, einen Pointer auf einen Pointer kann man nicht an eine Funktion übergeben, deren Parameter als Pointer auf ein Array deklariert worden ist. Wenn das für dich der "allgemeine Fall" ist, dann stimmts schon, der Typechecker wird sich beschweren. Es gibt aber eben auch die Möglichkeit, den Typechecker zu veranlassen, alle Dimensionen außer der ersten strikt zu überprüfen.

    Man kann übrigens alle Dimensionen prüfen lassen, wenn man ein struct verwendet.

    *plantsch*

  • noobie
    4
    noobie
    Mitglied
    Punkte
    130
    Beiträge
    18
    • 18. Mai 2008 um 15:28
    • #8

    Die Codestücke sind von mir:D muss für den Programmiertest üben. Das Problem bei den Umlauten ist, dass meine Entwicklungsumgebung für die Umlaute einen anderen ASCII-Code einsetzt und dann gibt er mir für diesen Code ein anderes Zeichen aus.

    Aber nochmals danke


    MfG

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 18. Mai 2008 um 16:04
    • #9
    Zitat von noobie

    Das Problem bei den Umlauten ist, dass meine Entwicklungsumgebung für die Umlaute einen anderen ASCII-Code einsetzt

    ASCII enthält die Umlaute gar nicht, insofern kann das nicht stimmen.
    Generell darf in C-Sources nur ASCII verwendet werden, also darfst du da sowieso keine Umlaute drinnen haben. Manche Compiler akzeptieren es aber trotzdem aus irgendeinem Grund.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 18. Mai 2008 um 16:36
    • #10
    Zitat von hal

    Generell darf in C-Sources nur ASCII verwendet werden


    Hmm. Die vom C-Standard verlangten Zeichen sind eine kleine Teilmenge von ASCII, strenggenommen "darf" nur jener Zeichensatz verwendet werden. Solang der Compiler aber nichts dagegen hat, spricht nichts dagegen, ganz ASCII, ganz ISO 8859-1, ganz Unicode oder weiß der Teufel was zu verwenden.

    Stimmt schon, irgendein Uraltcompiler für ein Uraltmainframe wird den String "반기문" vielleicht nicht korrekt behandeln. Aber ein Uraltcompiler für ein Uraltmainframe muß noch nichtmal das Zeichen { kennen. Der kleinste gemeinsame Nenner ist für die Praxis viel zu klein, von dem her spricht meiner Meinung nach auch nicht viel gegen 'ä'. Da ist die Verwendung von <conio.h> um Größenordnungen weniger portabel und auch noch sinnloser Schnickschnack.

    (Und auch wenn man wirklich keine seltsamen Zeichen in seinem Source will, gibts ein paar etwas bessere Methoden als die aus dem ersten Post.)

    *plantsch*

    Einmal editiert, zuletzt von Plantschkuh! (18. Mai 2008 um 16:39)

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 18. Mai 2008 um 19:44
    • #11
    Zitat von Plantschkuh!

    Hmm. Die vom C-Standard verlangten Zeichen sind eine kleine Teilmenge von ASCII, strenggenommen "darf" nur jener Zeichensatz verwendet werden. Solang der Compiler aber nichts dagegen hat, spricht nichts dagegen, ganz ASCII, ganz ISO 8859-1, ganz Unicode oder weiß der Teufel was zu verwenden.

    Probleme bekommst du erst, wenn du dann Compiler wechseln willst (zB visual studio auf gcc)...

    Zitat

    Stimmt schon, irgendein Uraltcompiler für ein Uraltmainframe wird den String "반기문" vielleicht nicht korrekt behandeln. Aber ein Uraltcompiler für ein Uraltmainframe muß noch nichtmal das Zeichen { kennen.

    Naja, ohne { funktioniert C nicht wirklich.

    Zitat

    (Und auch wenn man wirklich keine seltsamen Zeichen in seinem Source will, gibts ein paar etwas bessere Methoden als die aus dem ersten Post.)

    Ja, die einzig korrekte Methode ist, im Source nur keys abzuspeichern, und die Strings aus einem Textfile (oder einer Datenbank) zu holen, das dann auch in Unicode abgelegt werden kann.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 18. Mai 2008 um 19:49
    • #12
    Zitat von hal

    Naja, ohne { funktioniert C nicht wirklich.

    Sicher, mit trigraphs. Es ist nur halt nicht sonderlich leserlich.

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 18. Mai 2008 um 19:55
    • #13
    Zitat von Ringding

    Sicher, mit trigraphs. Es ist nur halt nicht sonderlich leserlich.


    Der da wäre ??< für { und ??> für }

    C bzw. C-Artiges ist ja generell schon unleserlich (im Vergleich etwa mit Pascal), damit wirds wirklich nicht besser...

    Dipper dipper dii dipper dii dipper dii duuu

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung