Array als Rückgabewert



  • hallo,
    ich bin ein C++ Neuling and habe ein paar Schwierigkeiten mit Arrays 😕 .ich möchte ein bitmap File lesen und die dimensionen (Breite,Höhe) als 2d-Array zurückgeben können.In der Funktion ReadHeader sollte man den Pfad,wo sich das Bild befindet als Argument eingeben.So sieht mein Code aus:

    [#include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <fstream>
    typedef struct
    {
    int Size; /* Size of the image /
    int res; /
    reserved zone /
    int offset; /
    address of the beginning of the image /
    int info; /
    size of the zone information /
    int width; /
    Width of the image /
    int height ; /
    Height of the image /
    int tim; /
    Size of the image in bytes /
    int Hres; /
    horizontal resolution /
    int Vres; /
    vertical resolution /
    int nbco; /
    number of colors used /
    int impco; /
    number of important colors */
    } bitmap_header;

    //ReadHeader sollte B[width][height] zurückgeben

    void ReadHeader(char *Titel, int B[][] )
    {
    FILE *bmp_file;
    bitmap_header bmp_header;
    char sign[3];

    bmp_file=fopen("Titel.bmp","r");

    fgets( sign, sizeof sign , bmp_file);
    puts(sign);

    /* read the header in only one line */
    fread( &bmp_header, sizeof bmp_header, 1, bmp_file );

    printf("width= %d, height= %d\n", bmp_header.width, bmp_header.height);

    fclose(bmp_file);

    }
    ]
    Ich kann bis jetzt nur die Dimensionen auf der Konsolen geben.Ich
    möchte aber das Bild als Array haben.Hätte Jemand eine Idee 😉 ?
    Danke



  • Aufräumen!

    #include <utility> // std::pair, std::make_pair
    #include <cstring> // std::strcmp
    #include <fstream>
    
    struct bitmap_header_t
    {
        int Size; /* Size of the image */
        int res; /* reserved zone */
        int offset; /* address of the beginning of the image */
        int info; /* size of the zone information */
        int width; /* Width of the image */
        int height ; /* Height of the image */
        int tim; /* Size of the image in bytes */
        int Hres; /* horizontal resolution */
        int Vres; /* vertical resolution */
        int nbco; /* number of colors used */
        int impco; /* number of important colors */
    };
    
    std::pair<int, int> read_header(const char* file_name, bitmap_header_t& dest)
    {
        std::ifstream file_stream(file_name, std::ios_base::binary);
    
        char sign[4] = { 0 };
        file_stream.read(sign, sizeof(char) * 3);
    
        if (std::strcmp("BMP", sign) != 0) throw std::invalid_argument("invalid format");
    
        file_stream.read(reinterpret_cast<char*>(&dest), sizeof(bitmap_header_t));
    
        return std::make_pair(dest.width, dest.height);
    }
    

    Wobei die Bitmap-Header-Struktur falsch ist!



  • Das nennt man eine prompte Antwort 😉
    warum sollte die Bitmap-Header-Struktur falsch sein? 😕

    ich muss gestehen, dass ich die folgenden Zeilen nicht versteht:

    std::ifstream file_stream(file_name, std::ios_base::binary);
    
        char sign[4] = { 0 };
        file_stream.read(sign, sizeof(char) * 3);
    
        if (std::strcmp("BMP", sign) != 0) throw std::invalid_argument("invalid format");
    
        file_stream.read(reinterpret_cast<char*>(&dest), sizeof(bitmap_header_t));
    

    Könntest Du Sie mir bitte erklären?



  • std::ifstream file_stream(file_name, std::ios_base::binary); // Datei zum binären Lesen öffnen
    
    char sign[4] = { 0 }; // einen String aufn Stack und mit 0 initialisieren. Wichtig ist, dass sign[ 3 ] = 0.
    file_stream.read(sign, sizeof(char) * 3); // Die ersten 3 Bytes nach sign lesen.
    
    if( std::strcmp( "BMP", sign ) != 0 ) // Gucken, ob die ersten 3 Bytes BMP sind.
        throw std::invalid_argument( "invalid format" ); // sonst eine exception schmeißen
    
    file_stream.read(reinterpret_cast<char*>( &dest ), sizeof( bitmap_header_t ) ); // dann den restlichen Header lesen.
    

    greetz, Swordfish



  • danke schön.jetzt verstehe ich viel besser 😋
    ich bekomme beim Kompilieren (VC++ 6.0) der folgenden Zeile:

    if( std::strcmp( "BMP", sign ) != 0 )
    

    die folgende Fehlermeldung:
    C:\VisualC\...\Test.cpp(27) : error C2039: 'strcmp' : Ist kein Element von 'std'
    beim Weglassen von 'std' habe ich noch mehr Fehler.....
    Ach ja,ich benutze WinXP und VC ++ 6.0


Anmelden zum Antworten