Mehrdimensional Felder an Unterprogramme übergeben

  • 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]




    Bitte helft mir

    MfG

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



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

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

    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

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

  • 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*

  • 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

  • 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!

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

  • 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!

  • 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

Jetzt mitmachen!

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