Forum: Mikrocontroller und Digitale Elektronik Seltsames Warning


von Johannes H. (Gast)


Lesenswert?

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
int main()
2
{
3
    int array[9];
4
    const int (*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

von Nop (Gast)


Lesenswert?

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

von Theor (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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

von Olaf (Gast)


Lesenswert?

> 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

von M. K. (sylaina)


Lesenswert?

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.

von micha (Gast)


Lesenswert?

sollte es eventl.
1
int main()
2
{
3
    int array[9];
4
    const int (*p2)= &(array[9]);
5
}

sein, wobei
1
array[9]
 aber auch nicht definiert ist...

von Nop (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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.

von Johnny B. (johnnyb)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mikro 7. (mikro77)


Lesenswert?

Johnny B. schrieb:
> 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.

Merkwürdig dass gleicher Code bei Stackoverflow vor zwei Jahren gepostet 
wurde:

https://stackoverflow.com/questions/34488559/pointer-to-array-with-const-qualifier-in-c-c#34488782

von M. K. (sylaina)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Thema Sinn oder Unsinn der Bewertungsfunktion wurde bereits anderswo 
ad nauseam diskutiert. Haltet das aus diesem Thread 'raus.

von René H. (Gast)


Lesenswert?

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é

von Stefan F. (Gast)


Lesenswert?

> 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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.