Forum: Mikrocontroller und Digitale Elektronik Feststellen der Größe einer Variablen bei Übergabe eines void pointers


von Sam (Gast)


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)

}

von Peter II (Gast)


Lesenswert?

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.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


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

von Thorsten (Gast)


Lesenswert?

Nein.

von Niklas G. (erlkoenig) Benutzerseite


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.

von Sam (Gast)


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;
    }
    ..................
}

von Nico W. (nico_w)


Lesenswert?

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.

von Sam (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

Du kannst ja ein Makro schreiben.

Etwa
1
#define TEST(g_val1)  test((void*)&g_val1, sizeof (g_val1))

von Nico W. (nico_w)


Lesenswert?

Dann übergebe doch eine Funktion die dir die größe Ausgibt?

von Der Andere (Gast)


Lesenswert?

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?

von Dirk B. (dirkb2)


Lesenswert?

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.

von nicht"Gast" (Gast)


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
}

von Niklas G. (erlkoenig) Benutzerseite


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).

von A. S. (Gast)


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.

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
Noch kein Account? Hier anmelden.