none
Umwandlung von auf const - C2664: cannot convert from 'int *[2][2]' to 'const int *[][2]' RRS feed

  • Frage

  • Folgendes Programm versucht, ein Array an eine Funktion zu übergeben, die ein const-Array erwartet. Dabei wird in der Funktionsdeklaration vom Compiler der erste Index "unterschlagen". Folge ist eine Fehlermeldung, die eigentlich nicht sein dürfte. Ich habe keine Ahnung, warum das so ist und ob sich das irgendwie abstellen lässt.

    error C2664: 'test' : cannot convert parameter 1 from 'int *[2][2]' to 'const int *[][2]'

    void test(const int  *a[2][2]);

    void main()
    {
      int *a[2][2];

      test(a);
    }


    error C2664: 'test' : cannot convert parameter 1 from 'int *[2][2]' to 'const int *[][2]'

    void test(const int  *a[2][2]);

    void main()
    {
      int *a[2][2];

      test(a);
    }

     

    void test(const int  *a[2][2]);

    void main()
    {
      int *a[2][2];

      test(a);
    }

    Donnerstag, 6. Oktober 2011 13:33

Antworten

Alle Antworten

  • ... ein Array an eine Funktion zu übergeben, die ein const-Array erwartet.


    Die Funktion erwartete aber einen Array mit austauschbaren Pointern, die auf "const int"-Werte zeigt. Das der Index fehlt ist egal, da diese Dimension für das Übergeben irrelevant ist. Aber der Datentyp der pointer ist zu sehr verändert, als dass ein Cast noch möglich wäre. Wenn du die Werte der Pointer innerhalb des Arrays konstant halten wolltest (Also ein const-array), dann wäre das hier für die test-Funktion besser:

    void test(int * const a[2][2] );
    

    Dann klappt's auch :)

    Donnerstag, 6. Oktober 2011 14:08
  • Die Idee ist, dass die Funktion die int-Werte nicht verändern darf. Sofern es nur ein const int* ist, gehts ja auch und dann ist eine Veränderung der Variablen nicht möglich.

    Daher hilft es nicht, die Pointer als const zu deklarieren, sondern die Inhalte. Und der implizite cast auf const <Datentyp> sollte doch immer möglich sein?

    void test(const int  *a)
    {
        *a = 42; --> Compile-Fehler, da const int
    }

    main()
    {
    int *b;
    test(b);
    }

     

    Donnerstag, 6. Oktober 2011 14:30
  • Willst Du wirklich einen array von int Zeigern.
    Ein const int *a[2][2]; ist ein array von Zeiger die auf einen const int verweisen.

    Du kannst IMHO nicht den inneren Typ umdeklarieren.
    Aber ich bin nicht der Compiler Guru...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 7. Oktober 2011 06:38
    Moderator
  • Also ich habe mich mal schlau gemacht:

    1. Lies mal den nachfolgenden Artikel warum ein X ** nicht nach const X ** umgewandelt werden kann:
    http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17

    2. void Test(const int *a[2][2])
    wird zu void Test(const int *(*a)[2])
    Arrays der ersten Ebene werden immer auf Zeiger umgewandelt.

    Das sind eigentlich C Regeln und nicht neu in C++

    Siehe auch:
    http://c-faq.com/ansi/constmismatch.html
    http://c-faq.com/aryptr/aryptrparam.html

    HTH

    BTW: Ich habe es auch nicht gleich kapiert...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 7. Oktober 2011 09:19
    Moderator
  • Hallo Thomas Schwenke,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Donnerstag, 3. November 2011 09:33
    Moderator