Compiler Warnung trotz richter Funktion



  • N'Abend;

    Ich habe wie im Titel beschrieben eine einfache Funktion geschrieben, welche Daten aus einer Date liesz.
    Sie funktioniert problemlos, jesich schreit der compiler, ich will ein sicherere Programmieren anstreben und bitte euch mir vlt tipps zu geben.
    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "bmp_lib.h"
    
    struct pixel
    {
        unsigned char blue;
        unsigned char green;
        unsigned char red;
    }*pFarbe;
    
    int pixelausgabe(unsigned char *pPixel,FILE *pSave)
    {
        //unsigned int farbwerte[2];
        unsigned char *pDynamic;
        unsigned int x=0;
        unsigned int y=0;
    
        x=bmp->biHeight;
        y=bmp->biWidth;
    
        pFarbe=(struct pixel*)pPixel;
        pDynamic=(struct pixel*)malloc((bmp->biHeight)*(bmp->biWidth)*sizeof(struct pixel));//warning: assignment from incopatible pointer type
        if(pDynamic==NULL)  perror("Konnte keinen Speicher reservieren\n");
        return 0;
    }
    

    was heißt das grundsätzlich???



  • Wenn Cast, dann

    pDynamic=(unsigned char*)malloc(...)
    

    Aber verzichte doch einfach auf den Cast:

    pDynamic=malloc((bmp->biHeight)*(bmp->biWidth)*sizeof(struct pixel));
    


  • vielen dank Vicious Falcon für deine schnelle antwort.
    ich brauche den cast, da ich ja um eine ganze struktur springen möchte, und nicht um einen unsigned char, das ist ja ein unterschied, oder?? 😕



  • pDynamic ist doch aber ein **unsigned char ***
    Dann kannst du pDynamic auch nur ein **unsigned char *** zuweisen.

    Logisch ist ein pDynamic als **struct pixel *** zu deklarieren.



  • ah, danke euch beiden, schönen abned noch 🙂



  • Es ist egal, du bekommst den Zeiger (immer auf 0 überprüfen) auf den neu angeforderten Speicherbereich, der die Größe des bei malloc übergebenen Wert hat.

    Warum möchtest du denn bei einer Ausgabefunktion noch einmal den kompletten Speicher anfordern?

    So wie ich das sehe, ist doch pPixel ein Zeiger auf die Daten. Du hast also die Daten, die Breite und die Höhe des Bildes und möchtest nun jeden Pixel einzeln durchgehen?

    // pseudo
    
    for(y=0; y<Höhe des Biles; ++y)
    {
      pFarbe= <Adresse der Zeile y>; // Achtung: bspw. unterscheiden Bitmaps zwischen Bottom-Up und Top-Down, eventuelles Padding (Einfügen von einigen Bytes) beachten
      for(x=0; x<Breite des Bildes; ++x)
      {
        // Ausgabe / Berechnung der Member von *pFarbe
        ++pFarbe; // Zeiger um sizeof(struct pixel) erhöhen
      }
    }
    

    Ich weiß nicht, in welcher Form die Daten vorliegen, viele Formate garantieren bspw., dass jede Rasterzeile auf 32-Bit-Grenzen liegt.
    Du bräuchtest natürlich noch zusätzlich den "Bitcount" eines Pixels.

    * liegt, nicht liegen



  • transcend schrieb:

    Ich habe wie im Titel beschrieben eine einfache Funktion geschrieben, welche Daten aus einer Date liesz.
    Sie funktioniert problemlos, jesich schreit der compiler, ich will ein sicherere Programmieren anstreben und bitte euch mir vlt tipps zu geben.

    Defizite nicht nur in der Sprache C sind zu bemerken.
    Grundsätzlich: Der Compiler hat immer Recht, nicht nur mit Fehlern sondern auch mit Warnungen.
    Da du die Compilerwarnung nicht mit aufgeführt hast (ist eigentlich auch schon ziemlich abgefahren, eine Frage zu einer Compilerwarnung zu stellen und sie dann nicht mit anzugeben), nehme ich an es handelt sich um den malloc Cast.
    Dazu ist zu bemerken, dass du in diesem Fall in die typische Anfängerfalle gelaufen bist und versuchst, C Code mit einem C++ Compiler zu übersetzen.
    malloc braucht keinen Cast in C.
    Probiere mal:

    #ifdef __cplusplus
    #error ich versuche, C Code mit C++ zu compilieren, was Unsinn ist
    #endif
    


  • In der Zeile 24 (die mit malloc) steht hinten dran ein Kommentar:

    //warning: assignment from incopatible pointer type
    

    Warning wurde angegeben, Compiler hatte recht, Problem war schon gelöst.



  • Glaube, Wutz wollte nochmal kurz die Rechtschreibsau rauslassen - das war auch berechtigt, wenn nicht sogar bitter nötig 🤡


Anmelden zum Antworten