Hallo,
ich habe ein Problem, dass meine memcpy-funktion unter windows10 immer
abstürzt
Das hier momentan eh noch null raus kommt ist mir klar. Das array wird
an einer anderen stelle beschrieben. Aber ob 0 oder andere Werte, das
Problem bleibt, dass es abstürzt.
Auch komme ich nicht außerhalb des arrays. 500+64=564, array ist aber
2000 lang.
file 1
Marcel schrieb:> readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);Marcel schrieb:> sint32 readData (uint32 addr_u32, uint32 *data_pu32)
Da passt was nicht zusammen. readData nimmt 2 Parameter, aber du
übergibst 3?
Warum debuggst das Programm nicht einfach mal? Setze einen Breakpoint
auf das memcpy und überprüfe die Parameter.
Programmierer schrieb:> Da passt was nicht zusammen. readData nimmt 2 Parameter, aber du> übergibst 3?
PS: Und der 2. Parameter ist uint32 *, aber du übergibst uint8_t*. Das
darf so gar nicht kompilieren. Was sind sint32 und uint32 eigentlich für
komische Typen? Die gibt's in C und C++ gar nicht.
Nick M. schrieb:> K.A. was dabei rauskommt, wenn man die Adresse eines Parameters haben> will.
Die Adresse des Werts auf dem Stack. Das funktioniert schon. Wobei man
sich schon fragt, warum das überhaupt als Pointer an dataInput übergeben
wird.
Mit den Codefragmenten und den fehlenden Definitionen ist das arg schwer
nachvollziehbar. Und es ist vermutlich auch nicht der Code, den du in
deinem Programm probiert hast, denn du übergibst beim Aufruf von
readData() drei Argumente, aber die Funktion hat nur zwei Parameter.
Programmierer schrieb:> Marcel schrieb:>> readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);>> Marcel schrieb:>> sint32 readData (uint32 addr_u32, uint32 *data_pu32)>> Da passt was nicht zusammen. readData nimmt 2 Parameter, aber du> übergibst 3?
Ja, da ist wohl was durcheinander gekommen
file 2.c
Programmierer schrieb:> Nick M. schrieb:>> K.A. was dabei rauskommt, wenn man die Adresse eines Parameters haben>> will.>> Die Adresse des Werts auf dem Stack. Das funktioniert schon. Wobei man> sich schon fragt, warum das überhaupt als Pointer an dataInput übergeben> wird.
Ja, da wird erst der Wert übergeben, dann die Adresse des Parameters
genommen, an eine weitere Funktion übergeben, die ihn dann wieder
dereferenziert. Auch die Wahl der Datentypen wirkt etwas konfus. Da ist
z.B. destination ein Array aus uint8, wird aber per Zeiger auf uint32
übergeben, nur um dann in der Funktion wieder auf uint8* gecastet und
als solcher weitergegeben zu werden.
Marcel schrieb:> err_s32 = dataInput(addr_u32, data_pu8, size_u16);
Das funktioniert nicht. dataInput will einen Pointer als 1. Parameter.
Einzelne Code-Fragmente copy-pasten oder gar abschreiben bringt nichts.
Reduziere dein tatsächliches Programm auf das minimale Programm, welches
exakt das Problem hat, und zeige exakt das gesamte Programm, welches
wir dann selbst ausprobieren und prüfen können. Sonst ist das hier nur
Rätselraten.
https://stackoverflow.com/help/minimal-reproducible-example
Was du mit dem ADDRESS_BASE machst ist komplett wirr.
Es ist keine Adresse, sonder ein Index. Und von dem Index nimmst du die
Adresse (die auf den Stack zeigt) und dort kopierst du hin. Also auf den
Stack. Das muss abstürzen.
Marcel schrieb:> // ADDRESS_BASE = 500;> // GROESSE_TABELLE = 64;> // uint8 destination[64]> readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);
Wie wird die "ADDRESS_BASE" verwaltet? Du kannst nicht einfach Speicher
an beliebigen Stellen belegen, sondern musst ihn vorher mit malloc (C)
oder mit new (C++) anfordern. Diese Funktionen geben Dir dann eine
Adresse zurück und da darfst Du dann reinschreiben.
Stimmt, in dem neuen Codefragment ist plötzlich alles anders.
Also, bitte ein minimales, aber vollständiges Beispiel, das genau so
den von dir beobachteten Absturz zeigt, posten. Mit den jetzigen Angaben
kann man einfach nichts anfangen.