ifndef und conio.h



  • vielen dank akari für deine bestätigung!

    ich habe diesen vorschlag heute bereits ausprobiert, aber ich komme mit der einbindung von diversen headerdateien nicht zurecht.

    hier habe ich dazu ein beispiel:
    main.cpp:

    #include <iostream>
    #include "Function.h"
    
    int main()
    { 
    	int i;
    
    	BMP Bild;
    
    	i = MyFunction();
    
    	return 0;
    }
    

    Function.h (äusserst kurz :)):

    int MyFunction ();
    

    Function.cpp:

    #include "Function.h"
    
    int MyFunction ()
    {
    	BMP Bild;
    	return 0;
    }
    

    das problem: wo schreibe ich jetzt

    #include <EasyBMP.h>
    

    hin, damit der compiler nicht mehr folgende fehler bringt:

    error C2146: syntax error : missing ';' before identifier 'Image'
    error C2065: 'Image' : undeclared identifier
    error C2065: 'BILD' : undeclared identifier

    DANKE.
    STICK.

    P.S.: die 36 fehlermeldungen kommen auch, wenn ich #include <EasyBMP.h> in main.cpp UND Function.cpp einfüge!



  • Normalerweise gehört das zu den anderen #include's in der main.cpp UND Function.cpp (oder notfalls an den Anfang der Function.h)

    (PS: Stammen die Fehlermeldungen wirklich von DIESEM Quelltext? Die angegebenen Namen passen nicht zum Programm)



  • Hallo

    Sowohl in dermain.cpp als auch in der Function.h benutzt du den Typ BMP.
    Da ist es am einfachsten, in Function.h den Include auf EasyBMP.h zu machen.

    Wenn du das nicht willst, must du in jeder cpp den Include machen.

    /Edit : zu lansgam

    bis bald
    akari



  • CStoll schrieb:

    PS: Stammen die Fehlermeldungen wirklich von DIESEM Quelltext? Die angegebenen Namen passen nicht zum Programm

    ups. was ist den hier passiert? eigentlich sollten die fehlermeldungen aus DIESEM quelltext stammen. irgendwie ist das aber was vertauscht. eigentlich solls so aussehen:

    error C2146: syntax error : missing ';' before identifier 'Bild'
    error C2065: 'BMP' : undeclared identifier
    error C2065: 'Bild' : undeclared identifier

    akari schrieb:

    Da ist es am einfachsten, in Function.h den Include auf EasyBMP.h zu machen.

    ja, so leider ist es leider nicht 😞 habe ich natürlich auch schon probiert. aber wenn ich euren vorschlägen folge, gibt es 67 fehlermeldungen, wenn ich #include <EasyBMP.h> in die Function.h setze. hier ein ausschnitt:

    Error 80 fatal error LNK1169: one or more multiply defined symbols found C:\Dokumente und Einstellungen\User\Eigene Dateien\Visual Studio 2005\Projects\REST\BASIS\Debug\GetPixel2 FARB2.exe
    Error 43 error LNK2005: "void __cdecl RangedPixelToPixelCopyTransparent(class BMP &,int,int,int,int,class BMP &,int,int,struct RGBApixel &)" (?RangedPixelToPixelCopyTransparent@@YAXAAVBMP@@HHHH0HHAAURGBApixel@@@Z) already defined in main.obj Function.obj
    Error 76 error LNK2005: "void __cdecl RangedPixelToPixelCopyTransparent(class BMP &,int,int,int,int,class BMP &,int,int,struct RGBApixel &)" (?RangedPixelToPixelCopyTransparent@@YAXAAVBMP@@HHHH0HHAAURGBApixel@@@Z) already defined in main.obj Function.obj
    Error 42 error LNK2005: "void __cdecl RangedPixelToPixelCopy(class BMP &,int,int,int,int,class BMP &,int,int)" (?RangedPixelToPixelCopy@@YAXAAVBMP@@HHHH0HH@Z) already defined in main.obj Function.obj
    Error 75 error LNK2005: "void __cdecl RangedPixelToPixelCopy(class BMP &,int,int,int,int,class BMP &,int,int)" (?RangedPixelToPixelCopy@@YAXAAVBMP@@HHHH0HH@Z) already defined in main.obj Function.obj
    Error 41 error LNK2005: "void __cdecl PixelToPixelCopyTransparent(class BMP &,int,int,class BMP &,int,int,struct RGBApixel &)" (?PixelToPixelCopyTransparent@@YAXAAVBMP@@HH0HHAAURGBApixel@@@Z) already defined in main.obj Function.obj
    Error 74 error LNK2005: "void __cdecl PixelToPixelCopyTransparent(class BMP &,int,int,class BMP &,int,int,struct RGBApixel &)" (?PixelToPixelCopyTransparent@@YAXAAVBMP@@HH0HHAAURGBApixel@@@Z) already defined in main.obj Function.obj
    Error 40 error LNK2005: "void __cdecl PixelToPixelCopy(class BMP &,int,int,class BMP &,int,int)" (?PixelToPixelCopy@@YAXAAVBMP@@HH0HH@Z) already defined in main.obj Function.obj
    Error 73 error LNK2005: "void __cdecl PixelToPixelCopy(class BMP &,int,int,class BMP &,int,int)" (?PixelToPixelCopy@@YAXAAVBMP@@HH0HH@Z) already defined in main.obj Function.obj

    wenn ich die #include <EasyBMP.h>-anweisung in main.cpp schreibe, bleiben die 3 oben aufgeführten fehlermeldungen.

    danke nochmals für eure hilfe.
    STICK.

    P.S.: ist es möglich, dass da was mit der EasyBMP.h nicht hinhaut? ich habe gerade meine eigene klasse geschrieben und wie oben empfohlen in MyFunction eingefügt, und es hat geklappt.



  • Das sind keine Probleme des Compilers, sondern des Linkers (und die deuten auf einen Fehler in der EasyBMP.h hin - stehen dort wirklich nur die Prototypen? Oder die kompletten Funktionen? Im letzteren Fall müsstest du das aufteilen)

    Und die drei verbleibenden Compilerfehler dürften damit zusammenhängen, daß die Function.cpp auch die Definition von BMP kennen muß.



  • hi.

    wie es aussieht, stehen die kompletten funktionen nicht in der EasyBMP.h, die sieht nämlich so aus:

    /*************************************************
    *                                                *
    *  EasyBMP Cross-Platform Windows Bitmap Library * 
    *                                                *
    *  Author: Paul Macklin                          *
    *   email: macklin01@users.sourceforge.net       *
    * support: http://easybmp.sourceforge.net        *
    *                                                *
    *          file: EasyBMP.h                       * 
    *    date added: 01-31-2005                      *
    * date modified: 02-06-2005                      *
    *       version: 1.00                            *
    *                                                *
    *   License: BSD (revised/modified)              *
    * Copyright: 2005-6 by the EasyBMP Project       * 
    *                                                *
    * description: Main include file                 *
    *                                                *
    *************************************************/
    
    #include <iostream>
    #include <cmath>
    
    #ifndef EasyBMP
    #define EasyBMP
    
    #ifdef __BCPLUSPLUS__ 
    // The Borland compiler must use this because something
    // is wrong with their cstdio file. 
    #include <stdio.h>
    #else 
    #include <cstdio>
    #endif
    
    #ifdef _MSC_VER 
    // If MSVC++ specific code is ever required, this is 
    // where it goes.
    #endif
    
    #ifdef __GNUC__
    // If g++ specific code is ever required, this is 
    // where it goes. 
    #endif
    
    #ifdef __INTEL_COMPILER
    // If Intel specific code is ever required, this is 
    // where it goes. 
    #endif
    
    #ifndef _DefaultXPelsPerMeter_
    #define _DefaultXPelsPerMeter_
    int DefaultXPelsPerMeter = 3780;
    // set to a default of 96 dpi 
    #endif
    
    #ifndef _DefaultYPelsPerMeter_
    #define _DefaultYPelsPerMeter_
    int DefaultYPelsPerMeter = 3780;
    // set to a default of 96 dpi
    #endif
    
    #include "EasyBMP_DataStructures.h"
    #include "EasyBMP_BMP.h"
    #include "EasyBMP_VariousBMPutilities.h"
    
    #ifndef _EasyBMP_Version_
    #define _EasyBMP_Version_ "1.00"
    #endif
    
    #endif
    

    ich glaube interessant sind zeile 62-64. dort steht nämlich alles andere drin. also nicht nur 'Prototypen', sondern 'kompletten Funktionen'. was kann ich nun machen? habe eigentlich keine lust, die mir jetzt einzeln vorzunehmen und die passenden .cpp's zu basteln.



  • stick_thai schrieb:

    was kann ich nun machen? habe eigentlich keine lust, die mir jetzt einzeln vorzunehmen und die passenden .cpp's zu basteln.

    Ich fürchte, genau das wirst du machen müssen, um dein Projekt zum Laufen zu bringen. (alternativ kannst du dem Herrn Macklin deine Meinung dazu schreiben, was für Müll er verzapft hat :D)

    Die einzige Workaround-Lösung, die mir einfallen würde, wäre (aber das ist keine dauerhafte Lösung):

    namespace
    {
    #include "EasyBMP.h"
    }
    

    (damit bekommt jeder Teil deines Projekts eine eigene Version der EasyBMP-Funktionen)



  • naja. dann kann man halt nichts machen.

    trotzdem danke für die schnelle und kompetente hilfe! 👍
    STICK.



  • Die Funktionsdefinitionen stehen doch in der EasyBMP.cpp
    Kann es sein, dass du die irgendwo mit includiert hast?



  • Braunstein schrieb:

    Kann es sein, dass du die irgendwo mit includiert hast?

    nee, das einzige, was ich includiere, ist die folgende zeile:

    #include <EasyBMP.h>
    

    von der EasyBMP.cpp habe ich in meinem code nichts aufgeführt.



  • Ich habe folgendes bei mir gemacht.
    1. ein neues Konsolenprojekt angelegt (in Code::Blocks)
    2. folgenden Quelltext hineingeschrieben

    #include <iostream>
    #include <EasyBMP.h>
    
    int main()
    {
    	std::cout << "Hello world!" << std::endl;
    	BMP Bild;
    	return 0;
    }
    

    3. die EasyBMP.cpp zum Projekt hinzugefügt
    4. kompiliert und gelinkt
    Ergebnis:
    keine Fehler, eine Warnung

    ..\EasyBMP.cpp:959: warning: unused variable 'ZeroWORD'
    :: === Build finished: 0 errors, 1 warnings ===

    Es sollte also gehen.



  • okay danke. jetzt geht das bei mir auch. ich habe die .cpp vorher nie gebraucht, und die programme funktionierten auch so, etwa in der folgenden weise:

    #include <iostream>
    #include <EasyBMP.h>
    
    int main()
    { 
    	BMP bild;
    
    	return 0;
    }
    

    okay, jetzt habe ich aber die .cpp auch in mein projekt hinzugefügt 🙄
    DANKE!!


Anmelden zum Antworten