Hallo,
ist es auf irgendeine Art und Weise möglich innerhalb der Funktion
test()
festzustellen welche Größe der übergebene Parameter g_val1 hat? Oder wie
kann man diese Problematik anders lösen?
Gruß
Sam
unsigned long g_val1;
void test(void* par1)
{
//.............
}
main()
{
test((void*)&g_val1)
}
Sam schrieb: > welche Größe der übergebene Parameter g_val1 hat? nein > Oder wie kann man diese Problematik anders lösen? in den man die größe mitgibt.
Sam schrieb: > Hallo, > ist es auf irgendeine Art und Weise möglich innerhalb der Funktion > test() > festzustellen welche Größe der übergebene Parameter g_val1 hat? nein >Oder wie > kann man diese Problematik anders lösen? auf void pointer verzichten, oder die Größe explizit als zusätzliche Parameter übergeben. Oder wie immer: Was ist das eigentliche Problem, dass Du lösen möchtest? mfg Torsten
Direkt geht das nicht, du musst die Größe mit übergeben:
1 | unsigned long g_val1; |
2 | |
3 | void test(void* par1, size_t size) |
4 | {
|
5 | //.............
|
6 | |
7 | }
|
8 | |
9 | int main() { |
10 | test((void*)&g_val1, sizeof (g_val1)); |
11 | }
|
Allerdings ist das lästig und man kann leicht versehentlich etwas falsches übergeben. Wenn du mit C++ kompilierst kannst du dir so behelfen:
1 | unsigned long g_val1; |
2 | |
3 | void test(void* par1, size_t size) |
4 | {
|
5 | //.............
|
6 | |
7 | }
|
8 | |
9 | template <typename T> |
10 | void test (T& par1) { |
11 | test (static_cast<void*> (&par1), sizeof (T)); |
12 | }
|
13 | |
14 | int main() { |
15 | test(g_val1); |
16 | }
|
Das template bestimmt automatisch die korrekte Größe.
Mein problem ist eigentlich folgendes.
die Funktion test() liest unterschiednliche Daten (deslab void*) von
einem EEPROM aus und schreibt diese auf Variablen/Felder mit
unterschiedlicher Größe.
Ich möchte in der Funktion test() aber zuvor prüfen, ob der
Zieldatenspeicher von der größe her ausreicht
int test(void* data_destination, data_size_in_EEPROM)
{
// Dies funktioniert leider so nicht
if(sizeof(data_destination) < data_size_in_EEPROM)
{
return error;
}
..................
}
Wenn du etwas aus dem EEPROM ausließt musst du doch schon vorher wissen was du auslesen willst. Von daher stellt sich die Frage ja eigentlich gar nicht. Das EEPROM weiß ja gar nicht, was für einen Datentyp es hat. Das weißt nur du.
richtig, deshalb übergebe ich ja auch die Größe mit data_size_in_EEPROM and die Funktion. Aber ich möchte überprüfen, ob der Zielspeicher ausreicht.
Du kannst ja ein Makro schreiben. Etwa
1 | #define TEST(g_val1) test((void*)&g_val1, sizeof (g_val1))
|
Dann übergebe doch eine Funktion die dir die größe Ausgibt?
Sam schrieb: > Aber ich möchte überprüfen, ob der Zielspeicher > ausreicht. Dann übergebe der Funktion auch die Größe des Zielspeichers. Wo ist jetzt eigentlich das Problem?
Der Andere schrieb: > Dann übergebe der Funktion auch die Größe des Zielspeichers. Das sollte man in C eigentlich immer machen, wenn sich die Größe nicht anderweitg herleiten läßt.
Niklas G. schrieb: > template <typename T> > void test (T& par1) { > test (static_cast<void*> (&par1), sizeof (T)); > } Aua Wenn schon C++ dann bitte auch keinen Cast nach void, sondern das Template benutzen. Dann kann man sich auch die separate Übergabe der Größe sparen.
1 | template<class T> |
2 | void test(T par1){ |
3 | //wasauchimmer
|
4 | }
|
nicht"Gast" schrieb: > Wenn schon C++ dann bitte auch keinen Cast nach void, sondern das > Template benutzen. An sich natürlich richtig, ich wollte dem TO nicht zu viel auf einmal um die Ohren hauen... Da er die Daten aber vermutlich mit bytes von einem Bus beschreibt, muss wohl onehin gecastet werden, aber eher zu einem char Typ. 2 Funktions-Overloads wie gezeigt sind etwas flexibler und u.U. Platz-effizienter (Type-Erasure).
Es ist unnötig, in der aufgerufenen Funktion zu testen, ob der Aufrufer genug Speicherplatz zur Verfügung stellt, da er explizit angibt, wieviel er möchte. Wenn der Aufrufer das falsch macht, dann ist keine Annahme über seine Absicht mehr sinnvoll. Ganz im Gegenteil: Vermutlich übergibt er einen Pointer auf einen unsigned char, weil dass sein General purpose Memory Konstrukt ist.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.