Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site
Search in forums












SourceForge.net Logo
Home » Community » Newbie corner » MSVC 10 to Upp conversion
MSVC 10 to Upp conversion [message #32638] Mon, 30 May 2011 22:22 Go to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
I am trying to convert a command line app I got working in MSVC 10 into Upp. Then I will make a GUI for it.

It was originally written for Linux in 2005 and a patch for Windows a year or so later. It has not been maintained since then AFAIK.

After making a package in MyApps with the code, making a .cpp file and getting the linking taken of (so far) there were
many warnings regarding deprecation (I think that can be handled).

There were several errors.

I did a search and replace for strcasecmp to strcmp, I can handle the case later.

Here are the remaining errors and the code:
C:\MyApps\GUItiler\tilepack.cpp(61) : error C2065: 'DIR' : undeclared identifier
C:\MyApps\GUItiler\tilepack.cpp(61) : error C2065: 'd' : undeclared identifier
C:\MyApps\GUItiler\tilepack.cpp(66) : error C2065: 'd' : undeclared identifier
C:\MyApps\GUItiler\tilepack.cpp(66) : error C3861: 'opendir': identifier not found
C:\MyApps\GUItiler\tilepack.cpp(67) : error C2065: 'd' : undeclared identifier
C:\MyApps\GUItiler\tilepack.cpp(68) : error C2065: 'd' : undeclared identifier
C:\MyApps\GUItiler\tilepack.cpp(68) : error C3861: 'readdir': identifier not found
C:\MyApps\GUItiler\tilepack.cpp(68) : fatal error C1903: unable to recover from previous error(s); st
	opping compilation

// code that throws the errors

void ScanDatasetR(const char *path) {
    DIR *d;
    struct dirent *de;
    int l, x, y;
    string s;

    d = opendir(path);
    if (!d) return;
    while (de = readdir(d)) {
        if ((de->d_type == DT_DIR) && (de->d_name[0] != '.')) ScanDatasetR((string(path) + string(de->d_name) + "/").c_str());
        if (de->d_type == DT_REG) {
            s = de->d_name;
            if (sscanf(s.substr(0, 2).c_str(), "%x", &l) && sscanf(s.substr(2, 8).c_str(), "%x", &x) && sscanf(s.substr(10, 8).c_str(), "%x", &y)) {
		bm[(static_cast<unsigned __int64>(l) << 50) + (static_cast<unsigned __int64>(y >> 7) << 25) + (x >> 7)].push_back((x & 0x7f) + ((y & 0x7f) << 7));
            }
        }
    }
    closedir(d);
}


I am not that proficient with pointers so help would be appreciated.

With the " unable to recover from previous error(s); stopping compilation" there will probably be more later but just taking it a step at a time.

edit: I don't want to use MSVC for the GUI or anything else if it can be avoided.
I like Upp.

[Updated on: Mon, 30 May 2011 22:43]

Report message to a moderator

Re: MSVC 10 to Upp conversion [message #32639 is a reply to message #32638] Mon, 30 May 2011 22:54 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3357
Registered: August 2008
Senior Veteran
Hello Neil

If you know what that function does it is very easy to translate it to U++.


Best regards
Iñaki
Re: MSVC 10 to Upp conversion [message #32640 is a reply to message #32639] Mon, 30 May 2011 23:05 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Here is a .zip of that package ~2MB.
http://www.nlneilson.com/apps/GUItiler.zip

I think ScanDatasetR is the list of files that will be tiled.

Forgot to mention this links to FWTools 2.4.7 /include and /lib
http://fwtools.maptools.org/

and also in INCLUDE directories
C:\MyApps\GUItiler\win32dummy
C:\MyApps\GUItiler\win32dummy\sys

[Updated on: Mon, 30 May 2011 23:41]

Report message to a moderator

Re: MSVC 10 to Upp conversion [message #32642 is a reply to message #32640] Tue, 31 May 2011 01:39 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Doing a google search, this forum and the Upp Help I came up with a few possibilities.

opendir is a C++ function in the direct.h header

In Upp apparently that is only functions defined in an app
MSVC picked up the C++ opendir but Upp does not.

#include <direct.h>
Adding this to tilepack.cpp and in the .upp file didn't help but didn't give an error for the #include.

In Upp 3470 after setting up the links in both and compiling with MSC9 and MSC10 the results were the same.

[Updated on: Tue, 31 May 2011 02:37]

Report message to a moderator

Re: MSVC 10 to Upp conversion [message #32643 is a reply to message #32642] Tue, 31 May 2011 04:43 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
opendir just iterates through all files in a directory and sub directories.

There must be some function in Upp that does this.

Re: MSVC 10 to Upp conversion [message #32645 is a reply to message #32643] Tue, 31 May 2011 08:03 Go to previous messageGo to next message
dolik.rce is currently offline  dolik.rce
Messages: 1789
Registered: August 2008
Location: Czech Republic
Ultimate Contributor

nlneilson wrote on Tue, 31 May 2011 04:43

opendir just iterates through all files in a directory and sub directories.

There must be some function in Upp that does this.
FindFile object is usually used for this, something like:
void IterateThroughDirs(const String& dir){
	for(FindFile ff(AppendFileName(dir, "*")); ff; ff.Next()) {
		if(ff.IsFolder())
			IterateThroughDirs(ff.GetName()); // call itself on the subdirectory
		else if(ff.IsFile()) {
			// process the file ff.GetName() here
		}
	}
}

Honza
Re: MSVC 10 to Upp conversion [message #32648 is a reply to message #32645] Tue, 31 May 2011 08:40 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3357
Registered: August 2008
Senior Veteran
Hello Neil

Using Honza code and replacing this stuff:

if (sscanf(s.substr(0, 2).c_str(), "%x", &l) && sscanf(s.substr(2, 8).c_str(), "%x", &x) && sscanf(s.substr(10, 8).c_str(), "%x", &y)) {
		bm[(static_cast<unsigned __int64>(l) << 50) + (static_cast<unsigned __int64>(y >> 7) << 25) + (x >> 7)].push_back((x & 0x7f) + ((y & 0x7f) << 7));
            }

with some more readable U++ code you will have it all, and more portable Smile.


Best regards
Iñaki
Re: MSVC 10 to Upp conversion [message #32649 is a reply to message #32648] Tue, 31 May 2011 12:29 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Thanks Honza and Koldo

I use something like your example in Java, this just counts but is about the same for processing files rather than tNum++;
It's just a simple loop back if it's a directory rather than a file.

    private void countFiles(File sourceDirectory){
    	for (File f : sourceDirectory.listFiles()) {
    		if (f.isDirectory()) countFiles(f);
    		if (f.isFile()) tNum++;
    	}
    }

I thought there may be something like the dos findfirst-findnext, Python Walk, etc. rolled into a function like opendir in Upp
or being able to use opendir, I thought that was a C++ function.

Those two lines do look complicated but breaks down to
    if(... && ... && ...){
        ...;
    }

This is mostly with numbers which I am fair with or file names.
That shouldn't be a problem unless Upp doesn't use sscanf, static_cast, push_back, etc..

I will get it to iterate through the files and see what happens.

[Updated on: Tue, 31 May 2011 12:39]

Report message to a moderator

Re: MSVC 10 to Upp conversion [message #32659 is a reply to message #32649] Tue, 31 May 2011 21:20 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3357
Registered: August 2008
Senior Veteran
Hello Neil

For example I would replace

string s;
int l;
...
sscanf(s.substr(0, 2).c_str(), "%x", &l)


with

String s;
int l;
...
l = ScanInt(s.Mid(0, 2), 0, 16);



Best regards
Iñaki
Re: MSVC 10 to Upp conversion [message #32660 is a reply to message #32659] Tue, 31 May 2011 22:06 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Hi Koldo

Thanks for the suggestion.

There are many changes I would like to make or may to need to change to get it to compile.

"l = ScanInt(s.Mid(0, 2), 0, 16);" does look much better.

Searching the package for "opendir" there is only the one instance.
Will get that changed today.
Re: MSVC 10 to Upp conversion [message #32662 is a reply to message #32660] Wed, 01 June 2011 02:59 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Finally got around to starting the changes to iterate through the files and noticed that has all ready been done with findfirst/findnext.
I used the original tilepack.cpp and tinkered with these without any luck.

#ifdef WIN32
#else
#endif

Does Upp treat these differently?

#ifdef WIN32
void ScanDatasetR(const char *path) {
    struct _finddata_t c_file;
    long hFile;
    int l, x, y;
    string s;
    string filespec;

    filespec = string(path) + "\\*.*";

    hFile = _findfirst( filespec.c_str(), &c_file );  // _findfirst
    if( hFile == -1L )
        return;
    do { 
        if ((c_file.attrib & _A_SUBDIR) && (c_file.name[0] != '.')) 
            ScanDatasetR((string(path) + string(c_file.name) + "\\").c_str());
        else if (c_file.attrib & _A_NORMAL) {
            s = c_file.name;
            if (sscanf(s.substr(0, 2).c_str(), "%x", &l) && sscanf(s.substr(2, 8).c_str(), "%x", &x) && sscanf(s.substr(10, 8).c_str(), "%x", &y)) {
		bm[(static_cast<unsigned __int64>(l) << 50) + (static_cast<unsigned __int64>(y >> 7) << 25) + (x >> 7)].push_back((x & 0x7f) + ((y & 0x7f) << 7));
            }
        }
    } while( _findnext( hFile, &c_file) == 0 );  // _findnext
    _findclose( hFile );
}
#else
void ScanDatasetR(const char *path) {
    DIR *d;
    struct dirent *de;
    int l, x, y;
    string s;

    d = opendir(path);  // opendir
    if (!d) return;
    while (de = readdir(d)) {
        if ((de->d_type == DT_DIR) && (de->d_name[0] != '.')) ScanDatasetR((string(path) + string(de->d_name) + "/").c_str());
        if (de->d_type == DT_REG) {
            s = de->d_name;
            if (sscanf(s.substr(0, 2).c_str(), "%x", &l) && sscanf(s.substr(2, 8).c_str(), "%x", &x) && sscanf(s.substr(10, 8).c_str(), "%x", &y)) {
		bm[(static_cast<unsigned __int64>(l) << 50) + (static_cast<unsigned __int64>(y >> 7) << 25) + (x >> 7)].push_back((x & 0x7f) + ((y & 0x7f) << 7));
            }
        }
    }
    closedir(d);
}
#endif


edit: I did a search in the package for WIN32
Other than in tilepack.cpp the only other is in the main (GUItiler.cpp)
#ifndef WIN32
  • Attachment: tilepack.cpp
    (Size: 4.15KB, Downloaded 280 times)

[Updated on: Wed, 01 June 2011 05:20]

Report message to a moderator

Re: MSVC 10 to Upp conversion [message #32663 is a reply to message #32662] Wed, 01 June 2011 08:06 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3357
Registered: August 2008
Senior Veteran
Hello Neil

For me it is very easy to convert the _findfirst, _findnext, _findclose to FindFile class as indicated by Honza, ad the code is more clear.


Best regards
Iñaki
Re: MSVC 10 to Upp conversion [message #32665 is a reply to message #32663] Wed, 01 June 2011 08:37 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Hi Koldo

Yes that would be clear and many things will be changed once I can compile and run it.

Apparently I got over the iterate files issue.

I found these links:
http://www.mail-archive.com/fossil-users@lists.fossil-scm.or g/msg02331.html
http://msdn.microsoft.com/en-us/library/b0084kay.aspx

Put an underscore before each WIN32 to _WIN32

No error as before.

Now I have
tilepack.obj : error LNK2005: _main already defined in GUItiler.obj
Creating library C:\upp\out\MyApps\MSC9.Gui.Mt\GUItiler.lib and object C:\upp\out\MyApps\MSC9.Gui.Mt\GUItiler.exp

and
"fatal error LNK1120: 117 unresolved externals"

At least I am not getting "unable to recover from previous error(s); stopping compilation"

Re: MSVC 10 to Upp conversion [message #32668 is a reply to message #32665] Wed, 01 June 2011 10:10 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
This is what this app does:

1. Change the format of geo-referenced images to WSG84 if necessary.

2. Merge many images into one big mosaic.

3. Tiles the large image into a tiled pyramid for different resolutions of 512x512 pixels. The highest resolution level has the same resolution as the original images. Then 4 of those images are made into a one step lower resolution and so on.
This is the way it is done for Google Earth and many others.

All of this I can do directly with FWTools or OSGeo4W

EXCEPT the tiling and overviews.

The lowest level of resolution (lztd) default size is 180 degrees with gdal2tiles, which is a pain and often some resolution is lost.

The images I use most are the U.S. FAA Charts and I have been using dstile to tile them with and can specify the lztd (LevelZeroTileDelta) as 1, 2, 5 or 10 deg.
The NASA WorldWind project uses an lztd of 36 deg for Satellite images.

Part of a response from the person that patched the original dstile to work in Windows was this:
Quote:

I suggest letting dstile fall into legacy and using this route instead.

The "new" way is geared toward smaller images, doing it on the fly and NO control over the lztd.

I tinkered with gdal2tiles for several days and got that to work for the format and naming convention but the resolution was less and that was only with an lztd of 180 deg.

It took some time to get the code to compile and run in MSVC 10 but I don't want to get tied into that to make changes.

Maybe if I can get the linking problems resolved I can do this in Upp which I prefer.
Re: MSVC 10 to Upp conversion [message #32671 is a reply to message #32668] Wed, 01 June 2011 11:29 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Here are a few of the errors I am getting.
I have everything linked I can think of, include, lib, bin
These all seem to be in FWtools and I shouldn't have to get in there and change code.
Maybe it's time to give this attempt a rest.

Tiler.obj : error LNK2001: unresolved external symbol "public: class GDALDataset * __thiscall GDALDri
	ver::Create(char const *,int,int,int,enum GDALDataType,char * *)" (?Create@GDALDriver@@QAEPAVGDAL
	Dataset@@PBDHHHW4GDALDataType@@PAPAD@Z)
Overviews.obj : error LNK2019: unresolved external symbol "public: enum GDALDataType __thiscall GDALR
	asterBand::GetRasterDataType(void)" (?GetRasterDataType@GDALRasterBand@@QAE?AW4GDALDataType@@XZ) 
	referenced in function "protected: void __thiscall Overviews::BuildOverviewsR(class TileTree::Nod
	e *,int,int,int)" (?BuildOverviewsR@Overviews@@IAEXPAVNode@TileTree@@HHH@Z)
TileProcessor.obj : error LNK2001: unresolved external symbol "public: enum GDALDataType __thiscall G
	DALRasterBand::GetRasterDataType(void)" (?GetRasterDataType@GDALRasterBand@@QAE?AW4GDALDataType@@
	XZ)
Overviews.obj : error LNK2019: unresolved external symbol "public: class GDALRasterBand * __thiscall 
	GDALDataset::GetRasterBand(int)" (?GetRasterBand@GDALDataset@@QAEPAVGDALRasterBand@@H@Z) referenc
	ed in function "protected: void __thiscall Overviews::BuildOverviewsR(class TileTree::Node *,int,
	int,int)" (?BuildOverviewsR@Overviews@@IAEXPAVNode@TileTree@@HHH@Z)
TileProcessor.obj : error LNK2001: unresolved external symbol "public: class GDALRasterBand * __thisc
	all GDALDataset::GetRasterBand(int)" (?GetRasterBand@GDALDataset@@QAEPAVGDALRasterBand@@H@Z)
Tiler.obj : error LNK2001: unresolved external symbol "public: class GDALRasterBand * __thiscall GDAL
	Dataset::GetRasterBand(int)" (?GetRasterBand@GDALDataset@@QAEPAVGDALRasterBand@@H@Z)
Overviews.obj : error LNK2019: unresolved external symbol "public: int __thiscall GDALDataset::GetRas
	terCount(void)" (?GetRasterCount@GDALDataset@@QAEHXZ) referenced in function "protected: void __t
	hiscall Overviews::BuildOverviewsR(class TileTree::Node *,int,int,int)" (?BuildOverviewsR@Overvie
	ws@@IAEXPAVNode@TileTree@@HHH@Z)
TileProcessor.obj : error LNK2001: unresolved external symbol "public: int __thiscall GDALDataset::Ge
	tRasterCount(void)" (?GetRasterCount@GDALDataset@@QAEHXZ)
Warper.obj : error LNK2001: unresolved external symbol "public: int __thiscall GDALDataset::GetRaster
	Count(void)" (?GetRasterCount@GDALDataset@@QAEHXZ)
Overviews.obj : error LNK2019: unresolved external symbol "public: int __thiscall GDALDataset::GetRas
	terYSize(void)" (?GetRasterYSize@GDALDataset@@QAEHXZ) referenced in function "protected: void __t
	hiscall Overviews::BuildOverviewsR(class TileTree::Node *,int,int,int)" (?BuildOverviewsR@Overvie
	ws@@IAEXPAVNode@TileTree@@HHH@Z)
TileProcessor.obj : error LNK2001: unresolved external symbol "public: int __thiscall GDALDataset::Ge
	tRasterYSize(void)" (?GetRasterYSize@GDALDataset@@QAEHXZ)
Overviews.obj : error LNK2019: unresolved external symbol "public: int __thiscall GDALDataset::GetRas
	terXSize(void)" (?GetRasterXSize@GDALDataset@@QAEHXZ) referenced in function "protected: void __t
	hiscall Overviews::BuildOverviewsR(class TileTree::Node *,int,int,int)" (?BuildOverviewsR@Overvie
	ws@@IAEXPAVNode@TileTree@@HHH@Z)
TileProcessor.obj : error LNK2001: unresolved external symbol "public: int __thiscall GDALDataset::Ge
	tRasterXSize(void)" (?GetRasterXSize@GDALDataset@@QAEHXZ)
Overviews.obj : error LNK2019: unresolved external symbol "public: class GDALDriver * __thiscall GDAL
	DriverManager::GetDriverByName(char const *)" (?GetDriverByName@GDALDriverManager@@QAEPAVGDALDriv
	er@@PBD@Z) referenced in function "public: __thiscall
Re: MSVC 10 to Upp conversion [message #32674 is a reply to message #32671] Wed, 01 June 2011 12:09 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3357
Registered: August 2008
Senior Veteran
Hello Neil

The compiler errors in your message are very related to the external library you want to include.

For trying to help you please send a file with all inside ready to be compiled (U++, packages, external includes, libs, dlls, ...). If the compressed size is big to be posted you can put the file in some public file server.


Best regards
Iñaki
Re: MSVC 10 to Upp conversion [message #32675 is a reply to message #32674] Wed, 01 June 2011 12:35 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Hi Koldo

Here is a .zip as of today.
http://www.nlneilson.com/apps/GUItiler.zip ~2MB

This is what it is linked to, FWTools 2.4.7
http://home.gdal.org/fwtools/FWTools247.exe ~22MB
I have this installed on C:\FWTools2.4.7
If you all ready have that installed somewhere else just change the build paths.

Thanks for looking at it, I felt I was running into a dead end street.

edit: If it would be of any help for checking the links or whatever I zipped and uploaded the MSVC 10 package.
http://www.nlneilson.com/apps/DsTileQtGUI.zip ~21MB
That also links to FWTools.

[Updated on: Wed, 01 June 2011 13:16]

Report message to a moderator

Re: MSVC 10 to Upp conversion [message #32680 is a reply to message #32675] Wed, 01 June 2011 17:19 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3357
Registered: August 2008
Senior Veteran
Hello Neil

Include fixed package. It runs using MSC9 (because of the libs) but compiles in MinGW too.

Look to the changes, many of them labeled with "// KOLDO".

The original source uses std and many linux functions.

Look at the main(). It is replaced with a GUI_APP_MAIN but without handling command line args (this work is for you Smile).

Package organizer has been changed too, adding the libs.

Please include the include, lib and bin ("executable directories") paths in "Build methods".

The changes have been rough, just to compile and run. Now you would have to polish it all, giving the package a nice U++ style Smile.

  • Attachment: GUItiler.7z
    (Size: 333.96KB, Downloaded 200 times)


Best regards
Iñaki
Re: MSVC 10 to Upp conversion [message #32684 is a reply to message #32680] Wed, 01 June 2011 23:05 Go to previous messageGo to next message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Great!

Much appreciated.

Adam Nowacki (nowak) did the original code for Linux and Tisham Dhar (whatnick) did the
conversion to work with Windows.
That is why the Linux code is still there.

The command line args are straight forward, most are just passed to GDAL.
The main arg I was concerned about is for the tile size.
gdal2tiles ONLY handles an lztd of 180 deg, dstile takes an arg for the size.

Now I can make a Upp GUI that handles the args and does some pre-checking.
To merge and tile 74 images it may take 5 hours.
To have it kick out because of a problem with one of the last few images is a pain,
the set has to be done as a whole.

Thanks Koldo!
Re: MSVC 10 to Upp conversion [message #32685 is a reply to message #32684] Thu, 02 June 2011 00:41 Go to previous messageGo to previous message
nlneilson is currently offline  nlneilson
Messages: 644
Registered: January 2010
Location: U.S. California. Mojave &...
Contributor
Hi Koldo

Your package compiled the first time without errors, great.

A few changes I noticed was
#include "win32dummy/unistd.h"
#include "win32dummy/dirent.h"
and in the .upp file
library
	"bgd gdal_i geos_i geotiff_i iconv libtiff_i libxml2 mapserver_i ogdi_32b1 ogdi_fw proj_i";

That all make sense but would not have figured that out myself.

The number of arg can be quite large like this:
dstile.exe tile --lztsd 10.0 --wwcache --overviews 48States HalifaxN.tif HalifaxS.tif MontrealN.tif MontrealS.tif ...

for the images/files to be merged and tiled (I often do 74) plus ~6 more options in the existing code
and I will be adding a few more with changes.
With no args it just lists the options.
I can handle that.

The biggest problem was getting the existing code to compile in Upp.

It will be interesting to see what other changes you have made.

Thanks again.


Previous Topic: Please recommend a scripting language
Next Topic: String to std::string conversion
Goto Forum:
  


Current Time: Sat Apr 27 05:36:01 CEST 2024

Total time taken to generate the page: 0.07367 seconds