Es gibt keine Antworten darauf im Internet, die ich finden konnte, und ich habe in den letzten 4 Monaten zweimal nachgesehen.
In MPLab v8.88 mit dem Hi-Tech ANSI C Compiler habe ich diese Codezeile:
const uint8 SUM_THRESHOLD_MIN = 15; /* comment edited out */
und ich bekomme die Warnung:
Warning [364] C:\*directory edited out* \ *filename_edited_out*.c; 273.35 attempt to modify object qualifed const
(Entschuldigen Sie die Änderungen, aber ich hatte das Gefühl, ich sollte persönliche, aber überflüssige Details herausschneiden).
Es ist nicht mein Code, und ich würde einfach ein verwenden #define
, aber andere möchten ein verwenden const
(für diejenigen, die es nicht wissen: Die Verwendung von const
garantiert eine korrekte Typumwandlung eines Werts und kann Sie vor einigen seltsamen Problemen im Zusammenhang mit der Typumwandlung bewahren und Datentypen; es ist nicht meine Lieblingsmethode, aber es ist auch keine schlechte Idee).
Es finden mehrere const
Initialisierungen im selben Codeblock statt, und alle geben mir diese Warnung. Sie befinden sich in einer .c-Datei in einer void-Funktion. Ich habe andere Dateien mit void-Funktionen, in denen ich const uint8 initialisiere, und es gibt keine Warnungen in diesen Dateien. Ich habe global gesucht und keine andere Instanz der Variablen gefunden, außer dort, wo sie in der void-Funktion verwendet wird (es gibt also keine Probleme mit der Neudefinition oder ähnlichem). Um es klar zu sagen, diese Konstanten sind nicht Teil einer Struktur oder etwas Seltsamem, sie werden nur in der void-Funktion in der .c-Datei deklariert.
Ich habe uint8 richtig typedef'd und nicht #define'd (siehe Kommentare).
Kann mir jemand helfen, diese Warnung loszuwerden?
BEARBEITEN: Wenn ich einen der const uint8 in eine andere .c-Datei direkt nach einem const uint16 einfüge, der den Fehler nicht auslöst, wie folgt:
const uint16 rate_bias_time_constant[NUM_RATE_CHANNELS][RATE_BIAS_STEP_MAX] =
{30,120,480,960, 300,120,180,240, 300,120,180,240 }; // comment edited out
const uint8 SUM_THRESHOLD_MIN = 15; /* comment edited out */
Ich erhalte die Warnung 364 in dieser Datei für diese Konstante uint8, aber nicht für die Konstante uint16. Wenn ich SUM_THRESHOLD_MIN von uint8 in uint16 ändere, erhalte ich immer noch die Warnung. Der Vollständigkeit halber, wenn ich es von Großbuchstaben in Kleinbuchstaben ändere, erhalte ich immer noch die Warnung. Ändere ich die Zeile z.
const uint8 SUM_THRESHOLD_MIN[2] = {15,2}; /* comment edited out */
Es gibt keine Warnung.
Ich habe es verstanden und vielen Dank für die Hilfe aller!
Die Deklarationen, die keine Warnungen auslösen, sind entweder Arrays oder sie werden als statische const uint8/16 deklariert. Aus irgendeinem Grund ist der Hi-Tech-C-Compiler in Ordnung mit const int/char, const uint8/16, die Arrays sind, aber nicht mit const uint8/16, es sei denn, sie werden als statische const uint8/16 deklariert.
Sie sollten wissen, dass aufgrund der ungewöhnlichen Architektur des PIC16/18 ein „const“-Qualifizierer eine Anweisung ist, diese Variable im Flash statt im RAM zu platzieren, und keine Anweisung, dem Compiler mitzuteilen, dass sie nicht geändert werden darf.
Wenn Sie versuchen, den Wert einer Auto-Variablen zu initialisieren, die lokal für eine Funktion ist, versuchen Sie, ihn zur Laufzeit zu ändern, da versucht wird, diesen Initialisierungswert in die Variable zu schreiben (die in Flash gespeichert ist und ist daher nicht (einfach) beschreibbar) jedes Mal, wenn die Funktion ausgeführt wird. Der Grund, warum es funktioniert, wenn die Variable als statisch deklariert wird, liegt darin, dass statische Variablen, die lokal für Funktionen sind, immer nur einmal initialisiert werden, sodass es keine logische Inkonsistenz gibt, über die der Compiler jammern könnte. Meine Vermutung ist, dass die konstanten Arrays auf die gleiche Weise behandelt werden.
Ich denke, das Hauptproblem ist Ihre Erwartung, wie CONST mit diesem Compiler auf diesem Prozessor funktioniert. Diese Dinge sind keine Variablen, wie Sie von Ihrer Beschreibung zu erwarten scheinen. Sie sind sehr wahrscheinlich als Konstanten im Programmspeicher implementiert, der im Wesentlichen schreibgeschützt ist. Diese Dinge können zur Laufzeit nicht geändert werden. Der Fehler, den Sie erhalten, hängt wahrscheinlich mit dem Laufzeitcode zusammen, der versucht, in die CONST zu schreiben, nicht in die Definition der CONST.
David Tweed
uint8
ein richtigestypedef
oder nur ein#define
?Bob
m.Alin
Joe Hass
Bob
Bob
Benutzer28910
m.Alin
David Tweed
#pragma
s) eingebettet, die diese spezielle Warnung ausschalten?Bob
Bob
Bob
David Tweed
Bob
David Tweed
Bob
Bob
Benutzer28910
David Tweed
woliveirajr
Bob