Feststellen der Größe einer Variablen bei Übergabe eines void pointers

Gast #4936852
Lesenswert?
• ▲
▼
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)

}
(Firma: Torrox.de) #4936856
Lesenswert?
• ▲
▼
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
Persönliche Seite #4936870
Lesenswert?
• ▲
▼
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.
Gast #4936873
Lesenswert?
• ▲
▼
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;
    }
    ..................
}
Gast #4937006
Lesenswert?
• ▲
▼
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
}
Persönliche Seite #4937012
Lesenswert?
• ▲
▼
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).
Gast #4937064
Lesenswert?
• ▲
▼
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.

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