Hallo liebe Forumnutzer,
ich benötige dringend eure Hilfe und hoffe dass jemand unter euc ist der
sich erbarmt und dem einäugigen zur besseren Sicht verhift.
Das Problem ist, dass mein 8051er C Compiler immer an diesem Fehler
stehenbleibt und ich schlicht nicht weiß wie ich das ausbügeln oder
umgehen kann. Die Funktion soll ein paar Bytes an eine SD-Karte schicken
um den Lese/Schreibvorgang zu initialisieren. Und so sieht das aus:
Fehlermeldung lautet : pointer: const to non-const assignment
die lösung steht doch im Betreff:
mcrex schrieb:> pointer: const to non-const assignmentmcrex schrieb:> const BYTE *buff, /* Data to be written */
deine funktion bekommt einen const Pointer und die gerufene Funktion
erwearetet einen Non-Const-Pointer:
mcrex schrieb:> unsigned char SD_writeSingleBlock(unsigned char *buff, unsigned long
startBlock);
-------------------------------------------------^
> unsigned char SD_writeMultipleBlock(unsigned char *buff, unsigned long
startBlock, unsigned long totalBlocks);
-------------------------------------------------^
dies wiederum scheint auf eine nachlässigkeit des Programmierers der
SD-Routinen zurückzuführen zu sein, da normalerwesie in Ausgaberoutinen
der Zu schriebende Puffer nicht verändert wird, könnte man ihn auch als
solchen, nämlich const, kennzeichnen.
Entferne (testweise) das const aus disk_write(....) und natürlich auch
in der funktion disk_write..
Du versuchst einen const pointer an eine funktion im RW - Modus zu
übergeben... Da meckert der Compliler zu Recht....
Gruß
F.
FPGASchubser schrieb:> Entferne (testweise) das const aus disk_write(....) und natürlich auch> in der funktion disk_write..
sauberer wäre es wohl den Fehler an der Wurzel zu bereinigen. sonst
gibts das selbe Problem eine Ebene höher eventuell wieder.
fazit: änder den Pointer im Prototyp und der zugehörigen Implmenetierung
der SD_write... auf const unsigned char *buff
mcrex schrieb:> @@@@@an dieser stelle@@@ if(!SD_writeSingleBlock(buff, sector)) count = 0;
Hallo
bekommst du das mit einem
---
if(!SD_writeSingleBlock((unsigned char *)buff, sector)) count = 0;
---
in den Griff? Casten (so nennt man das) ist aber meistens unschön.
Du musst dir aber überlegen wozu die const-Geschickte gedacht ist. Warum
verlangt eine Funktion SD_writeSingleBlock nach einem nicht-const buff?
Wird dieser durch die Funktions geändert?
Gruß Klaus
Ein herzliches danke schön an Alle die sich die Mühe gemacht haben mir
zu helfen. Ich werde zunächst die Lösung vom Klaus Kloos nehmen,
zumindest findet sie der Copiler schon mal gut.
By the way.
Mein blöder Ride7 sagt jetzt dass ich die 8kB erreicht bzw überschritten
habe und verweigert das kompilieren. Hat jemand eine Empfehlung für eine
ToolCHain ohne diese Beschränkung.
>Ich werde zunächst die Lösung vom Klaus Kloos nehmen,>zumindest findet sie der Copiler schon mal gut.
Damit gräbste dir schön dein eignes Codegrab. Mach's doch gescheid!
gruß jb
werden.
Dann muss in der Implementierung das ebenfalls entsprechend geändert
werden. Und es ist wahrscheinlich, das das noch weitere Kreise ziehen
wird.
Das const macht die Zusicherung: "Lieber Aufrufer, ich werde deine Daten
nicht verändern". Für eine Schreibfunktion ist das auch vernünftig, denn
eine Schreibfunktion hat die Daten nicht zu verändern, die ich ihr gebe.
Nur muss das dann aber auch komplett durchgezogen werden.
Mit einem Cast versteckst du das alles. So nach dem Muster:
Die Funktion disk_write macht zwar diese Zusicherung, kümmert sich
allerdings einen Sch...Dreck darum, ob die Funktionen die es dazu
benutzt, dann auch wirklich einhalten.
Const hat seinen Sinn, es einfach wegzucasten ist nicht die feine
englische Art. Manchmal kann man das nicht anders machen, weil man den
Source Code nicht hat und daher auch nicht ändern kann. Wenn man den
Code allerdings zur Verfügung hat, dann zieht man das einmal durch und
hat Ruhe.
Und natürlich: Der COmpiler kann das tun, was er im Rahmen seiner
Möglichkeit am besten kann: Überwachen ob der Programmierer keinen
Sch... baut.
an: Karl Heinz Buchegger
Nun, hierfür bedanke ich mich natürlich nochmals. Ich habe dies jetzt so
geändert und natürlich akzeptiert der Kompiler das so. Dass die
Schreibfunktion in dem Fall besser nicht unvorhergesehenerweise
überschrieben werden können darf ist sehr wichtig, vermute ich.
Merci @ all