memcpy stürtzt immer ab

Gast #6400616
Lesenswert?

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
1
// ADDRESS_BASE = 500;
2
// GROESSE_TABELLE = 64;
3
// uint8 destination[64]
4
readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);

file 2
1
sint32 readData (uint32 addr_u32, uint32 *data_pu32)
2
{
3
    sint32 err_s32;
4

5
    err_s32 = dataInput(&addr_u32, (uint8*) data_pu32, sizeof(uint32));
6

7
    return err_s32;
8
}

file 3
1
uint8 data[2000] = {0};
2

3
sint32 dataInput(uint32 *src, uint8 *dest, uint16 bytes_u16)
4
{
5
        memcpy( dest, &data[*src], bytes_u16);
6
}
Gast #6400625
Lesenswert?

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.
Gast #6400629
Lesenswert?

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.
#6400633
Lesenswert?

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.
Gast #6400635
Lesenswert?

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
1
int32 readData(uint32 addr_u32, uint8 *data_pu8, uint16 size_u16)
2
{
3
    sint32 err_s32;
4

5
    err_s32 = dataInput(addr_u32, data_pu8, size_u16);
6

7
    return err_s32;
8
}
#6400641
Lesenswert?

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.
Gast #6400644
Lesenswert?

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
Gast #6400645
Lesenswert?

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.
#6400647
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren