Benutzer mit den meisten Antworten
Umwandlung von auf const - C2664: cannot convert from 'int *[2][2]' to 'const int *[][2]'

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);
}
Antworten
-
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.172. 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.htmlHTH
BTW: Ich habe es auch nicht gleich kapiert...
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Freitag, 7. Oktober 2011 13:05
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 3. November 2011 09:33
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 :)- Als Antwort markiert Thomas Schwenke Donnerstag, 6. Oktober 2011 14:24
- Tag als Antwort aufgehoben Thomas Schwenke Donnerstag, 6. Oktober 2011 14:25
-
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);
} -
-
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.172. 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.htmlHTH
BTW: Ich habe es auch nicht gleich kapiert...
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Freitag, 7. Oktober 2011 13:05
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 3. November 2011 09:33