Invalid conversion by malloc

hallo leute,
ich bekomme in fast jede aufruf der funktion malloc einen invalid conversion fehler.

hier einen besipiel:

unsigned short *trend_wert;
if((trend_wert = malloc(buffer_size = (sizeof(SHORT) * 256000))) !=NULL)
{

}

fehler:invalid conversion from void* to unsigned short*

Hinweis: ich arbeite unter linux mit KDevelop und unter windows zeigt der visual studio kaine Fehler bei den selben code

was mache ich falsch ?
youssef

Probier mal den Pointer explizit zu casten:

trend\_wert = (usigned short\*)malloc( ... )

Schöne Grüße, Robert

Hallo youssef,

was mache ich falsch ?

Ein void* hat ja bekanntlich keinen definierten Datentyp.

Bei den alten C-Compilern wurde kein expliziter Check auf Datenverträglichkeit gemacht, bzw. der Compiler konvertierte das Zeugs einfach wie er es für richtig hielt. Dadurch war es möglich void* einfach irgendeinem Pointer zuzuweisen.
Dieses verhalten führte aber zu bösen Programmfehlern z.B.:

int a;
long b;
a = b;

Kann dann zu „lustigen“ Fehlern führen, wenn der Wert von b grösser ist als MAX-INT.
Mit einem cast:

a = (int)b;

wird das Problem zwar nicht beseitigt, aber der Compiler weiss jetzt, dass du das mit Absicht (Tja oder aus Dummheit) so machen willst und du erhälst keine Fehlermeldung mehr. Zudem ist jetzt das Ganze auch im Source-Code „dokumentiert“ und fällt bei der Fehlersuche eher auf.

Man hat dann ein Zusatzprogramm Namens „Lint“ (Staub) entwickelt, welche solche Fehler, zumindest als Warnung anzeigte.
Mittlerweile ist das alte „Lint“ fest in den Compiler eingebaut, und liefert dir diese Warnung oder Fehler, weil da etwas nicht ganz sauber ist.

MfG Peter(TOO)

Probier mal den Pointer explizit zu casten:

trend_wert =
(usigned short*)malloc( … )

Schöne Grüße, Robert

das funktioniert beim explizite casting .
gibt es keine andere schönere lösung beim projekteinstellung oder … weil sonst muss ich in hunderte stellen casting einbauen.

youssef

gibt es keine andere schönere lösung beim projekteinstellung
oder

Sorry da ist mir nichts bekannt. Aber vom Programmieren her ist der Cast sicher die „schönere Lösung“. :smile:

Grüße, Robert

danke
danke

hallo leute,
ich bekomme in fast jede aufruf der funktion malloc einen
invalid conversion fehler.

hier einen besipiel:

unsigned short *trend_wert;
if((trend_wert = malloc(buffer_size = (sizeof(SHORT) *
256000))) !=NULL)
{

}

fehler:invalid conversion from void* to unsigned short*

Hinweis: ich arbeite unter linux mit KDevelop und unter
windows zeigt der visual studio kaine Fehler bei den selben
code

was mache ich falsch ?

Zuerst einmal verwendest du die C-Funktion malloc, diese liefert dir nur einen void* zurück. Den kannst du C-Like via (unsigned short*) casten, wenn du allerdings C++ programmierst solltest du reinterpret_cast( …) verwenden.

In einem C++ Programm bietet es sich ohnehin an, Speicher über den operator new anzufordern. „new unsigned int[250000]“ liefert dir typsicher den gewünschten Speicher, ein cast ist nicht notwending. Per „delete[] my_mem“ gibst du den Speicher wieder frei. Beachten new[]delete[] und newdelete

Gruß Markus