Probleme beim Verstehen des Codes



  • Kann mir jemand helfen?

    Ich habe mir das Programm CXImage gezogen. Das ist ein OpenSource-Projekt, an
    dem ich mich mal versuchen möchte. Dazu muss ich erstmal den Quellcode verstehen.
    Kann mir jemand Stück für Stück folgenden Quellcode erklären (am besten zeilenweise):

    -------------------------------------------------------------------------------

    #define MAX_UNDO_LEVELS 8
    #define MAX_SEL_POINTS 8000
    
    #define	WM_USER_NEWIMAGE WM_USER+1
    #define WM_USER_PROGRESS WM_USER+2
    
    #define LEN2D(X,Y) sqrt((float)((X)*(X)+(Y)*(Y)))
    
    #include "ximajpg.h"
    
    class IcImage;
    class CDemoDoc : public CDocument
    {
    protected: 
    	CDemoDoc();
    	DECLARE_DYNCREATE(CDemoDoc)
    
    public:
    
    	IcImage *image;				
    	HANDLE	hThread,hProgress;	
    
    	void	*m_fp[6];	
    	long	m_MenuCommand;
    
    	POINT m_Sel[MAX_SEL_POINTS]; 
    	long m_NumSel;
    	int	 m_tool;
    
    #ifndef VATI_EXTENSIONS
    	LOGFONT m_font;
    	CString m_text;
    	COLORREF m_color;
    #else
    	int  m_isRectSel;
    #endif
    
    	long m_hr[256]; 
    	long m_hg[256];
    	long m_hb[256];
    	long m_hgray[256];
    	long m_hmax;
    
    	IcImageJPG m_exif;
    
    public:
    	void SubmitUndo();
    	inline IcImage *GetImage() { return image; }
    	inline BOOL GetStretchMode() { return stretchMode; }
    	inline BOOL GetSmoothMode() { return m_bSmoothDisplay; }
    	inline BOOL GetWaitingClick() { return m_WaitingClick; }
    	inline void SetWaitingClick(BOOL b) { m_WaitingClick=b; }
    	inline float GetZoomFactor() { return m_ZoomFactor; }
    	int ComputePixel(float x, float y, float &x1, float &y1);
    	CString FindExtension(const CString& name);
    	int FindType(const CString& ext);
    
    	//{{AFX_VIRTUAL(CDemoDoc)
    	public:
    	virtual BOOL OnNewDocument();
    	virtual void Serialize(CArchive& ar);
    	virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
    	virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
    	virtual BOOL DoSave(LPCTSTR pszPathName, BOOL bReplace =TRUE);
    	//}}AFX_VIRTUAL
    
    public:
    	void Stopwatch(int start0stop1);
    	void UpdateStatusBar();
    	virtual ~CDemoDoc();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    protected:
    	BOOL stretchMode;
    	BOOL m_bSmoothDisplay;
    	IcImage *imageUndo[MAX_UNDO_LEVELS];
    	int m_UndoLevel;
    	float m_ZoomFactor;
    	BOOL m_WaitingClick;
    	LARGE_INTEGER m_swFreq, m_swStart, m_swStop; 
    	float m_etime; 
    	long m_progress;
    
    	//{{AFX_MSG(CDemoDoc)
    	afx_msg void OnUpdateFileSaveAs(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI);
    	afx_msg void OnStretchMode();
    	afx_msg void OnUpdateStretchMode(CCmdUI* pCmdUI);
    	afx_msg void OnTransformEllipse();
    	afx_msg void OnWindowDuplicate();
    	afx_msg void OnEditCopy();
    	afx_msg void OnIcimageFlip();
    	afx_msg void OnIcimageMirror();
    	afx_msg void OnIcimageNegative();
    	afx_msg void OnIcimageGrayscale();
    	afx_msg void OnIcimageRotate();
    	afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);
    	afx_msg void OnEditRedo();
    	afx_msg void OnEditUndo();
    	afx_msg void OnUpdateEditRedo(CCmdUI* pCmdUI);
    	afx_msg void OnViewZoomin();
    	afx_msg void OnViewZoomout();
    	afx_msg void OnUpdateViewZoomin(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateViewZoomout(CCmdUI* pCmdUI);
    	afx_msg void OnViewNormalviewing11();
    	afx_msg void OnUpdateViewNormalviewing11(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSettransparency();
    	afx_msg void OnUpdateIcimageSettransparency(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageRemovetransparency();
    	afx_msg void OnUpdateIcimageRemovetransparency(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageResample();
    	afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageFlip(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageGrayscale(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageMirror(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageNegative(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageResample(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageRotate(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateTransformEllipse(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageDecreasebpp();
    	afx_msg void OnIcimageIncreasebpp();
    	afx_msg void OnIcimageOptions();
    	afx_msg void OnIcimageDither();
    	afx_msg void OnUpdateIcimageDither(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageThreshold();
    	afx_msg void OnUpdateIcimageThreshold(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSplitrgb();
    	afx_msg void OnUpdateIcimageSplitrgb(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSplityuv();
    	afx_msg void OnUpdateIcimageSplityuv(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSplithsl();
    	afx_msg void OnUpdateIcimageSplithsl(CCmdUI* pCmdUI);
    	afx_msg void OnIcimagePseudocolors();
    	afx_msg void OnUpdateIcimagePseudocolors(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageFiltersColorize(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageFiltersColorize();
    	afx_msg void OnIcimageDarken();
    	afx_msg void OnUpdateIcimageDarken(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageLighten();
    	afx_msg void OnUpdateIcimageLighten(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageContrast();
    	afx_msg void OnUpdateIcimageContrast(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageEmboss();
    	afx_msg void OnUpdateIcimageEmboss(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageBlur();
    	afx_msg void OnUpdateIcimageBlur(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageDilate();
    	afx_msg void OnUpdateIcimageDilate(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageEdge();
    	afx_msg void OnUpdateIcimageEdge(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageErode();
    	afx_msg void OnUpdateIcimageErode(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSharpen();
    	afx_msg void OnUpdateIcimageSharpen(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSoften();
    	afx_msg void OnUpdateIcimageSoften(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageCrop(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageCrop();
    	afx_msg void OnUpdateIcimageRemovealphachannel(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageRemovealphachannel();
    	afx_msg void OnIcimageOpacity();
    	afx_msg void OnIcimageInvetalpha();
    	afx_msg void OnUpdateIcimageInvetalpha(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageAlphapalettetoggle();
    	afx_msg void OnUpdateIcimageAlphapalettetoggle(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageAlphastrip();
    	afx_msg void OnUpdateIcimageAlphastrip(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageRotatel();
    	afx_msg void OnUpdateIcimageRotatel(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageRotater(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageRotater();
    	afx_msg void OnUpdateIcimageGamma(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageGamma();
    	afx_msg void OnUpdateIcimageMedian(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageMedian();
    	afx_msg void OnIcimageAddnoise();
    	afx_msg void OnUpdateIcimageAddnoise(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateViewToolsMove(CCmdUI* pCmdUI);
    	afx_msg void OnViewToolsMove();
    	afx_msg void OnViewToolsSelect();
    	afx_msg void OnUpdateViewToolsSelect(CCmdUI* pCmdUI);
    	afx_msg void OnViewToolsZoom();
    	afx_msg void OnUpdateViewToolsZoom(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateViewPalette(CCmdUI* pCmdUI);
    	afx_msg void OnViewPalette();
    	afx_msg void OnIcimageCombine();
    	afx_msg void OnUpdateIcimageCombine(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageFft();
    	afx_msg void OnUpdateIcimageFft(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSplityiq();
    	afx_msg void OnUpdateIcimageSplityiq(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSplitxyz();
    	afx_msg void OnUpdateIcimageSplitxyz(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageRepair();
    	afx_msg void OnUpdateIcimageRepair(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageAlphachannelSplit(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageAlphachannelSplit();
    	afx_msg void OnViewToolsText();
    	afx_msg void OnUpdateViewToolsText(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSplitcmyk();
    	afx_msg void OnUpdateIcimageSplitcmyk(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageAlphaCreate();
    	afx_msg void OnIcimageFiltersLog();
    	afx_msg void OnUpdateIcimageFiltersLog(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageFiltersRoot();
    	afx_msg void OnUpdateIcimageFiltersRoot(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageHistogramEqualize();
    	afx_msg void OnUpdateIcimageHistogramEqualize(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageHistogramNormalize();
    	afx_msg void OnUpdateIcimageHistogramNormalize(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageHistogramStretch();
    	afx_msg void OnUpdateIcimageHistogramStretch(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageGaussian3x3();
    	afx_msg void OnUpdateIcimageGaussian3x3(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageGaussian5x5();
    	afx_msg void OnUpdateIcimageGaussian5x5(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageContour();
    	afx_msg void OnUpdateIcimageContour(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageLesscontrast();
    	afx_msg void OnUpdateIcimageLesscontrast(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageJitter();
    	afx_msg void OnUpdateIcimageJitter(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateWindowDuplicate(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateFiltersMix(CCmdUI* pCmdUI);
    	afx_msg void OnFiltersMix();
    	afx_msg void OnIcimageCircletransformCylinder();
    	afx_msg void OnUpdateIcimageCircletransformCylinder(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageCircletransformPinch();
    	afx_msg void OnUpdateIcimageCircletransformPinch(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageCircletransformPunch();
    	afx_msg void OnUpdateIcimageCircletransformPunch(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageCircletransformSwirl();
    	afx_msg void OnUpdateIcimageCircletransformSwirl(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageCircletransformBathroom();
    	afx_msg void OnUpdateIcimageCircletransformBathroom(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageHistogramStretch1();
    	afx_msg void OnIcimageHistogramStretch2();
    	afx_msg void OnUpdateIcimageHistogramStretch1(CCmdUI* pCmdUI);
    	afx_msg void OnUpdateIcimageHistogramStretch2(CCmdUI* pCmdUI);
    	afx_msg void OnFiltersNonlinearEdge();
    	afx_msg void OnUpdateFiltersNonlinearEdge(CCmdUI* pCmdUI);
    	afx_msg void OnIcimageSkew();
    	afx_msg void OnUpdateIcimageSkew(CCmdUI* pCmdUI);
    	afx_msg void OnViewToolsTracker();
    	afx_msg void OnUpdateViewToolsTracker(CCmdUI* pCmdUI);
    	afx_msg void OnJpegcompression();
    	afx_msg void OnUpdateJpegcompression(CCmdUI* pCmdUI);
    	afx_msg void OnViewSmooth();
    	afx_msg void OnUpdateViewSmooth(CCmdUI* pCmdUI);
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    

    -------------------------------------------------------------------------------

    Bestimmte Sachen verstehe ich ja. Mir ist klar, dass man mit define neue Konstanten definiert,
    oder das name(x,y) eine Funktion ist, wo in Klammern Parameter stehen können. class ist
    Klasse. Durch die Wahl des Namens bekomme ich sicher auch raus, was die jeweilige Funktion macht.
    Trotzdem habe ich Probleme bei verstehen des Codes. Was ist z.B. afx_msg? Warum werden die Zeilen
    in AFX_MSG nicht ignoriert? Es stehen dort doch //, was eigentlich einen Kommentar bezeichnet.
    Also im großen und ganzen brauch ich alles erklärt, denn das Unverständnis geht schon am ersten
    protected los.

    Wäre nett, wenn mir das mal jemand erklären kann!

    Danke schon im Voraus!



  • Hallo,

    ich glaube da bist Du nicht an der richtigen Stelle hier.
    Du solltest lieber auf der Projekt-Homepage nach Infos suchen und in die Doku dazu sehen.

    Ne Frage: Schon mal C++ programmiert?

    Zu den Kommentaren: das // kennzeichnet nur Kommentare bis zum Ende der Zeile.
    Deswegen wird der Teil nicht ignoriert.

    Ciao



  • Das Problem dabei ist, dass der Support dort nicht so gut ist. Ich war dort mit einem in Kontakt. Jedoch hat mich das Gespräch nicht wirklich weiter gebracht, weil die sich dort eher mit Problemen im Ausführen beschäftigen. Sich dort den Quellcode einer Datei erklären zu lassen, ist eher ungünstig. Daher wende ich mich an ein Forum.
    Ich bin totaler Anfänger mit C++, deshalb frage ich ja. Ich versuch erstmal, den Code zu verstehen, bevor ich mich dann selbst dran versuch. Ich hab mir ein Projekt gesucht, was mich selbst interessiert, denn die Beispiele in den Anfängerbüchern sind meist sehr einfach und für eigene Projekte weniger geeignet. Da ich eh so ein Programm brauch, hab ich mich für CXImage entschieden, um es so zu verändern, wie ich es gern hätte, doch dazu muss ich erstmal wissen, was im Code steht.



  • Kann mir jemand Stück für Stück folgenden Quellcode erklären (am besten
    zeilenweise):

    ok. ich fang mal an.

    #define LEN2D(X,Y) sqrt((float)((X)*(X)+(Y)*(Y)))
    

    dieses makro ist unfug. zum einen sollte der zielcompiler _hypot2 haben, das ist dafür da. zum anderen sollte man eine inline-funktion statt eines makros bauen. weil sonst crasht die sache bei LEN2D(x++,y). außerdem hätte der nasenbär nicht das ergebnis casten sollen, sondern die parameter. sonst verrechnet der sich ganz massiv, wenn x oder y gräßer als 60000 werden.
    also mindestens

    inline float len2d(float x,float y){
       return sqrt(x*x+y*y);
    }
    

    und dann wegen der möglichkeit, in c++ mehrer funktionen gleichen namens zu haben, auch gleich

    inline float len(float x,float y){
       return sqrt(x*x+y*y);
    }
    

    vielleicht wollen wir einfach feststellen, ob der zielcompiler hypot2 hat? ja, klasse idee. wie deklarieren

    char _hypot2(...);
    

    und wissen, daß der compiler eine funktion mit ellipsen (die 3 punkte) nur aufrufen worde, wenn gar nix anderes passt. existiert also eine ordentliche _hypot2, wird die genommen. naja, und die ordentliche gibt bestimmt keinen char zurück.

    char _hypot2(...);
    inline float len(float x,float y){
       if(sizeof(_hypot2(x,y)==1)
          return sqrt(x*x+y*y);
       else
          return _hypot2(x,y);
    }
    

    lustig, gell?



  • catcharlie: so lernt man nicht programmieren. du musst wie jeder andere auch am anfang anfangen und nicht sofort mittendrin.



  • catcharlie schrieb:

    Was ist z.B. afx_msg?

    dazu geh in das include-verzeichnis deines compilers und such alle dateien durch nach "#define afx_msg". ich mach das mal für dich.

    // Type modifier for message handlers
    #ifndef afx_msg
    #define afx_msg         // intentional placeholder
    #endif
    

    aha! ms hat sich nur freigehalten, da was hinzuschreiben, wenn sie mal wollen. also stell dir vor, der nächste compiler kann fastcall-funktionen erheblich besser als normale. dann machen die da

    #ifndef afx_msg
    #define afx_msg __fastcall
    #endif
    

    hin, und alles ist gut. bisher isses nix.

    Warum werden die Zeilen in AFX_MSG nicht ignoriert? Es stehen dort doch //, was eigentlich einen Kommentar bezeichnet.
    

    wie bereits gesagt, geht // nur bis zum zeilenende.
    aber dennoch ist //{{ irgendwie zauberwerk. wenn du den microsoft-compiler und -editor verwendest, dann ist das zeigs zwischen //{{ und //}} ausgegraut wie ein kommentar. das soll heißen, der mensch soll hier nicht rumfummeln. das zeig dazwischen wurde vom klassenassistenten gebaut. und der kommt schrecklich durcheinander, wenn man den code da per hand ändert. will man da was ändern, soll man das wieder per klassenassistent machen.

    Also im großen und ganzen brauch ich alles erklärt, denn das Unverständnis geht schon am ersten
    protected los.

    zum protected könnte das hier der gute text für dich sein: http://www.henkessoft.de/C++/C++/grundlagen.htm



  • Bücher zu nehmen ist sich ne Variante, aber es ist ja nicht so, dass ich keine hätte. Schließlich besteht das Projekt nicht nur aus einer Datei. Es ist nur sehr aufwendig ständig zig Bücher zu wälzen und trotzdem nicht das zu erfahren, was man eigentlich wissen will.

    Aber danke, ich bin gewarnt.



  • Ich hab mir das Tutorial gleich mal ausgedruckt. Is nicht schlecht. Ich hab zwar was ähnliches, aber die Beschreibung über ein Beispiel ist nicht schlcht und besser nachvollziehbar...Danke Volkard



  • ard schrieb:

    catcharlie: so lernt man nicht programmieren. du musst wie jeder andere auch am anfang anfangen und nicht sofort mittendrin.

    VORSICHT, bei derartigen Pöbeleien wird du sofort gnadenlos gelöscht.



  • 😞


Anmelden zum Antworten