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

Gast #4936852
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
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
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
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;
    }
    ..................
}
#4936877
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.
Gast #4936880
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.
Gast #4937006
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.