P
Pavel
To browse code Eclipse with CDT is pretty good if you can tame your projects formathog said:Mostly when I program it is maintenance work - making little tweaks and
corrections to other people's code. The C++ books and tutorials are all clear
and wonderful about objects and methods but they only ever give toy examples. In
real world programs it seems that the code is always a morass of object types
and methods, often with similar names.
(Resulting in: "yes, 'print', but which 'print'?"). I find it extremely
difficult to find in such code where actions actually occur, or in many cases
what earlier events led to an issue later in the program.
Presumably there are tools to help with this that I should be using but am not.
What are these tools? If somebody knows of a tutorial or reference on how to
deal with complex code like this, please share it.
For instance, lately I have had to make some changes to Inkscape. The
development environment is Mingw. This program uses Cairo, GDK, GTK, Pango, and
heaven knows what else, in addition to all of its own code. The closest thing I
have to a class browser is the doxygen web interface, example:
http://fossies.org/dox/inkscape-0.48.3.1/clipboard_8cpp_source.html
One of the tasks on my "to do" list is to add import/export of images to the EMF
extension. I found the relevant sections in the EMF extension (switch() cases
provided, but no code in them) by a grep through all of the source code for the
EMF keyword function associated with images. Looking around for an example of
how to handle images in Inkscape located the link above by more grep's, since I
knew one could paste an image into the program from the clipboard. From this
link, on line 937 we see that rather than converting directly from GDK:ixbuf
to an Inkscape object type they punted. First they save from the Pixbuf to a PNG
file, and then they use a preexisting file_import function to read that object
back in. The program pastes at the cursor (or something like "at the cursor")
but how it knows where that is lies in a code segment far far away. Anyway, this
illustrates the point I'm trying to make. One would imagine that somewhere in
this heap of code there is a "create/import image of size W,H at position X,Y",
but good luck finding it.
Figuring out the logic in real C++ programs is also challenging. In Inkscape,
for instance, much of the program is event driven, so a backtrace will often not
tell you what happened before a given execution point. Example:
A ->
B ->
C (configure: event X will cause E) ->
D (configure: something else relevant when E runs) ->
C ->
B (event X) ->
E (stops at preset breakpoint)
So the back trace shows
A->B->E
and there is no clue that C and D are important, or even that they ever ran.
This A->E example is grossly simplified, since in the real program there were
thousands of function calls before event X. Short of tracing every function call
how would one ever know that C,D need to be looked at?
Thank you,
David Mathog
it (it is usually possible, but for some of mine I still have to use the
immortal combination of gvim, ctags, fgrep and egrep).
Draw diagrams for your own understanding (I use Umbrello) but do not get too
crazy about it. Mostly no one will be looking at them except yourself.
Try to understand way of thinking of your predecessors and memorize stuff (I
know first hand how stupid it sounds and how painful it feels but somehow it
eventually pays off for me).
HTH
-Pavel