Hallo liebe Forenmitglieder,
wie schon im Betreff beschrieben, erhalte ich ein Warning, welches ich
mir nicht erklären kann und hoffe, dass mir da jemand weiterhelfen kann.
Und zwar ein Beispiel:
1
intmain()
2
{
3
intarray[9];
4
constint(*p2)[9]=&array;
5
}
erhalte ich als Warnung (vorausgesetzt gcc -std=c99 -pedantic ist
gesetzt):
"pointers to arrays with different qualifiers are incompatible in ISO C
[-Wpedantic]"
Ich hoffe, ihr könnt mir da weiterhelfen.
Lg
Johannes H. schrieb:> Ich hoffe, ihr könnt mir da weiterhelfen.
int und const int sind nicht kompatibel. Die Warnung sagt das doch
schon, der unterschiedliche qualifier hier ist "const".
Hm. Aber was ist an der Warnung für Dich seltsam oder unverständlich?
Mal ganz lakonisch gesagt, ist sie für Menschen, die C können und
Englisch, recht gut verständlich. Wenn ich voraussetze, dass Du beides
kannst und nur ein Detail problematisch ist, würde ich mir wünschen
dieses Detail auch genannt zu bekommen. Andernfalls solltest Du eben C
und Englisch lernen. Das kann man Dir hier nicht abnehmen.
> Aber was ist an der Warnung für Dich seltsam oder unverständlich?
Auch ich finde selbst nach Jahren noch die Warnungen des C Compilers
teilweise sehr Kryptisch formuliert. Allerdings findet man Erklärungen
meist leicht mit Google, wenn man Namen und Zeilennummern weg lässt.
> Auch ich finde selbst nach Jahren noch die Warnungen des C Compilers> teilweise sehr Kryptisch formuliert.
Jain. Wenn man C BottomUp gelernt hat, also erst mal Assembler und auch
eine Vorstellung davon hat was ein Compiler aus dem Source fuer einen
Coder erzeugt dann sind die Fehlermeldungen eigentlich verstaendlich.
Lernt man es TopDown, also ohne Ahnung mit dem C-Buch in der Hand und
wohlmoeglich noch aus der behueteten PC-Umgebung heraus dann ist manches
sicher nicht sofort verstaendlich.
Da merkt man halt die Geschichte. :-)
Olaf
Der Code macht eigentlich auch keinen Sinn, nicht nur wegen dem
int/const int. Mir scheint dem TE ist nicht klar, dass ein Zeiger eine
Adresse einer Adresse ist, ein array aber nur eine Adresse. Warum
erstellt man ein Zeiger-Array und übergibt diesem...ja, was eigentlich?
Die Adresse der Adresse des ersten Elements? Irgendwie siehts für mich
mehr als komisch aus.
micha schrieb:> sein, wobeiarray[9] aber auch nicht definiert ist...
&(array[9]) ist ein Zeiger unmittelbar hinter das Ende des Arrays, und
der ist definiert. Nur dereferenzieren darf man ihn nicht.
Nop schrieb:> Nur dereferenzieren darf man ihn nicht.
Natürlich darf man das.
Niemand kann einem das verbieten. (zumindest C tut das nicht)
Das ist ein voll funktionsfähiger Pointer!
Auch, wenn es nur selten Sinn machen wird.
Denn er zeigt in die Wiese.
Übrigens, Sinn:
Mir verbirgt sich der Sinn, hinter dem Codefetzen da oben.
Arduino F. schrieb:> Nop schrieb:>> Nur dereferenzieren darf man ihn nicht.>> Natürlich darf man das.
Ist undefiniertes Verhalten und kann zum Segfault führen, denn wie Du
schon sagst, zeigt der dann in den Wald. Nützlich ist er aber trotzdem.
Arduino F. schrieb:> Mir verbirgt sich der Sinn, hinter dem Codefetzen da oben.
Der TO hat alles richtig gemacht. Seinen Code soweit reduziert, bis
genau nur noch der Umstand eintritt, zu dem er eine Frage hat und denn
dann hier im Forum gepostet.
Johnny B. schrieb:> Der TO hat alles richtig gemacht.
Nicht wirklich, denn die wesentliche Information, was er damit erreichen
will, die hat er weggelassen.
Und die ist zu einer ihm weiterhelfenden Erklärung schon nötig, denn
sein Problem liegt ziemlich sicher nicht nur beim Verstehen der Warnung.
Arduino F. schrieb:> Übrigens, Sinn:> Mir verbirgt sich der Sinn, hinter dem Codefetzen da oben.
Mir auch, aber das muss ja nix heißen. Ich fände es nur schön, dass
diejenigen, die uns ne -1 verpassen, lieber mal erklären würden, was das
bringen soll, statt uns ne -1 zu verpassen. So werden wir sicher nicht
schlauer ;)
M. K. schrieb:> die uns ne -1 verpassen,
Naja...
Meine Ansicht zu Bewertungen:
Um jemanden, oder dessen Aussagen, "gerecht" zu bewerten, müssen
folgende Bedingungen erfüllt sein:
1. Der Bewerter sollte mehr Ahnung von dem Thema haben, als der
Bewertete
2. Der Bewerter sollte neutral sein
Beides scheint mir, in diesem Forum, längst nicht immer gegeben zu sein.
Und im Übrigen:
Eine Weltanschauung auf einen +/- Klick reduziert.
Eine reine Schwarz/Weiß Welt.
Recht Aussage los, das ganze.
Stefan U. schrieb:>> Aber was ist an der Warnung für Dich seltsam oder unverständlich?>> Auch ich finde selbst nach Jahren noch die Warnungen des C Compilers> teilweise sehr Kryptisch formuliert. Allerdings findet man Erklärungen> meist leicht mit Google, wenn man Namen und Zeilennummern weg lässt.
Hast Du schon mal clang versucht? Dort sind die Meldungen wesentlich
ausführlicher.
Grüsse,
René
> Hast Du schon mal clang versucht?
Ich compiliere C++ Programme mit dem gcc in unterschiedlichen Varianten.
Keine Ahnung, was clang ist. Kann man das mit gcc verwenden?
Stefan U. schrieb:> Keine Ahnung, was clang ist.
Das ist ein Frontend für LLVM und bildet mit dem zusammen einen
moderneren C-/C++-Compiler, der als Ersatz für gcc gedacht (und
geeignet) ist.
https://en.wikipedia.org/wiki/Clang
Es ist auch möglich, clang zur statischen Codeanalyse (à la lint o.ä.)
zu verwenden.
Danke für die Erklärung. Im Moment bin ich froh, für alle meine
Mikrocontroller einen halbwegs aktuellen gcc gefunden zu haben, wo auch
make mit drin ist.
Aber ich werde mir das trotzdem mal anschauen, denn klarere
Fehlermeldungen (wie ich von Java gewohnt bin) wären schon eine feine
Sache.