/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
directories
Fra : Jesper Gødvad


Dato : 23-08-01 14:29

Hej Alle

Så vidt jeg kan se findes der ikke funktioner i Standard C++ Library til at
læse directories.

I Borland har jeg fundet dir.h, men hvordan kan jeg på forhånd sikre mig at
koden er portabel?

En mulighed er selvfølgelig at placere de få dir funktioner i sin egen fil,
så det kun er dem der skal rettes når jeg skifter platform, men jeg går
udfra at antallet vil vokse og det bryder desuden logisk med de øvrige
funktioner.

En anden mulighed er vel noget i stil med:

#DEFINE WIN

#ifdef WIN
std::string dir_funktion() {
....
}
#endif

#ifdef LINUX
std::string dir_funktion() {
....
}
#endif

En tredie mulighed er, at der i Linux findes en fuldt ud tilsvarende dir.h,
så det slet ikke er nødvendigt at tage højde for forskellende, men det ved
jeg jo typisk ikke på designtidspunktet.

Hvordan griber man rent praktisk en problemstilling som ovenstående an?

mvh. jesper



 
 
Mogens Hansen (23-08-2001)
Kommentar
Fra : Mogens Hansen


Dato : 23-08-01 20:33


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9m307b$8e3$1@sunsite.dk...
> Hej Alle
>
> Så vidt jeg kan se findes der ikke funktioner i Standard C++ Library til
at
> læse directories.

Det er så vidt jeg ved rigtigt.
Det er iøvrigt ikke alle systemer, der har directories.

>
> I Borland har jeg fundet dir.h, men hvordan kan jeg på forhånd sikre mig
at
> koden er portabel?

Det nemmeste er at finde et bibliotek, der løser problemet for dig.
Prøv f.eks. på boost
http://www.boost.org/libs/dir_it/index.htm

ellers findes der kommercielle fra f.eks. ObjectSpace (www.objectspace.com)
og RogueWave (www.roguewave.com)

>
> En mulighed er selvfølgelig at placere de få dir funktioner i sin egen
fil,
> så det kun er dem der skal rettes når jeg skifter platform, men jeg går
> udfra at antallet vil vokse og det bryder desuden logisk med de øvrige
> funktioner.

Ja

>
> En anden mulighed er vel noget i stil med:
>
> #DEFINE WIN

Ikke nødvendigt - se lidt længere nede

>
> #ifdef WIN
> std::string dir_funktion() {
> ....
> }
> #endif
>
> #ifdef LINUX
> std::string dir_funktion() {
> ....
> }
> #endif

Sådan håndteres forskelle mellem platforme og compilere typisk.
Compilerne har ofte predefineret en række macroer, som både angiver platform
og compiler fabrikat og compiler version, så man ikke selv behøver af
definere dem. Kig i hjælpesystemet under "Predefined Macros" (både for
Borland C++Builder og Microsoft Visual C++).

F.eks.:

#include <iostream>
#include <iomanip>

int main(void)
{
using std::cout;
using std::endl;
using std::hex;
#ifdef __BORLANDC__
cout << "This is the Borland C++ Compiler, version " << hex <<
__BORLANDC__
#ifdef __WIN32__
<< " for the MS-Windows 32 bit platform" << endl;
#endif
#endif

#ifdef _MSC_VER
cout << "This is the Microsoft C++ Compiler, version " << _MSC_VER
#ifdef _WIN32
<< " for the MS-Windows 32 bit platform" << endl;
#endif
#endif

#ifdef __GNUC__
cout << "This is the GNU C++ Compiler, version " << __GNUC__ << '.' <<
__GNUC_MINOR__
#ifdef __linux
<< " for the Linux platform" << endl;
#endif
#endif

return 0;
}


>
> En tredie mulighed er, at der i Linux findes en fuldt ud tilsvarende
dir.h,
> så det slet ikke er nødvendigt at tage højde for forskellende, men det ved
> jeg jo typisk ikke på designtidspunktet.
>

Hvis der gør, og det er tilstrækkeligt, så er det jo fint

> Hvordan griber man rent praktisk en problemstilling som ovenstående an?
>

Prøver at finde et tredieparts bibliotek, der løser problemet.
Der findes mange gode biblioteker, både gratis og kommercielle, som ikke er
en del af Standard Library.

Venlig hilsen

Mogens Hansen



Jesper Gødvad (25-08-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 25-08-01 10:53


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message news:9m3lu5$31c3
>
> Det nemmeste er at finde et bibliotek, der løser problemet for dig.
> Prøv f.eks. på boost
> http://www.boost.org/libs/dir_it/index.htm

Virker det hos dig?

Jeg har forsøgt at installere hele biblioteket, men det er komplet
uforståetligt hvad der går galt. "JAM er en afløser for MAKE[1]. FTJam er en
forbedring af JAM". Hvad er make? Dokumentationen til FTJam er den samme som
fra Jam. Jeg har sat envioment variabler (uden VFAT extensions), men det
hele sejler over flere sider og uden konkrete eksempler. :-? :-?

Som jeg forstår det, er FTJam en kompileringsutility der kalder BCC32 med de
rigtige parametre i den rigtige rækkefølge. Den er nødvendig for at
kompilere nødvendige obj filer før jeg kan bruge visse af bibliotekerne.

Jeg har nu en jam.exe på disken, men hver gang jeg eksekverer den får jeg:

Compiler is Borland C++
Jamfile: No such file or directory
....found 7 targets...
( i nogle tilfælde 1 target )

Kørsel med parametre ser ikke ud til at hjælpe og det hele bliver ikke
sjovere af, at dokumentationen fortæller at det nu er blevet "m e g e t n
e m m e r e" efterfulgt af et eksempel som er komplet uforståeligt for mig.

Da jeg løb sur i de samlede Boost libs og Jam koncenterede jeg mig alene om
dir_it.


> bcc32 -Ig:\osv dir_it_tst
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
dir_it_tst.cpp:
Error E2139 boost/directory.h 100: Declaration missing ;
Error E2089 boost/directory.h 135: Identifier 'value_type' cannot have a
type qualifier
Error E2139 boost/directory.h 135: Declaration missing ;
Error E2268 dir_it_tst.cpp 41: Call to undefined function 'localtime' in
function main()
Error E2268 dir_it_tst.cpp 41: Call to undefined function 'strftime' in
function main()
*** 5 errors in Compile ***

i directory.h :
99: struct size { typedef size_t value_type; };
100: struct mtime { typedef time_t const *value_type; };

Hvis noget, er der vel et semikolon for meget og ikke for lidt?

> > Hvordan griber man rent praktisk en problemstilling som ovenstående an?
>
> Prøver at finde et tredieparts bibliotek, der løser problemet.
> Der findes mange gode biblioteker, både gratis og kommercielle, som ikke
er
> en del af Standard Library.

Boost bibliotekerne har ambitioner om at blive implementeret i Standard C++
Library og dir_it har et meget smukt interface. Hvis de ellers virkede (hos
mig) var det et godt valg. Installationen er i hvert fald ikke for
begyndere.

Mit spørgsmål gik nu mest på hvordan man designede portabiliteten og det har
jeg da fundet udaf, så tak for hjælpen

mvh. jesper




Mogens Hansen (25-08-2001)
Kommentar
Fra : Mogens Hansen


Dato : 25-08-01 13:19


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9m7s9v$l9o$1@sunsite.dk...
>
> "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message news:9m3lu5$31c3
> >
> > Det nemmeste er at finde et bibliotek, der løser problemet for dig.
> > Prøv f.eks. på boost
> > http://www.boost.org/libs/dir_it/index.htm
>
> Virker det hos dig?

Ikke umiddelbart med Borland C++Builder, når det downloades.
Jeg har kigget på dir_it eksemplet (dir_it_tst.cpp), og har fundet ud af at
der er en række fejl i koden, så den i hvertfald ikke er i overensstemmelse
ISO C++ Standarden.

>
> Jeg har forsøgt at installere hele biblioteket, men det er komplet
> uforståetligt hvad der går galt. "JAM er en afløser for MAKE[1]. FTJam er
en
> forbedring af JAM". Hvad er make? Dokumentationen til FTJam er den samme
som
> fra Jam. Jeg har sat envioment variabler (uden VFAT extensions), men det
> hele sejler over flere sider og uden konkrete eksempler. :-? :-?
>

Make er en utility, der f.eks. kan anvendes til at compilere og linke
programmer med.
Man kan sætte nogle regler op, så den sikrer at der netop bliver compileret
det nødvendige.
Det er rund regnet det som projekt-styringen i Integrerede Development
Environment (IDE) (f.eks. Microsoft Visual C++, KDE KDevelop og Borland
C++Builder) tager sig af.
Make er fortsat god til at styre store projekter fra kommandolinien.

>
> > bcc32 -Ig:\osv dir_it_tst
> Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
> dir_it_tst.cpp:
> Error E2139 boost/directory.h 100: Declaration missing ;

Ikke C++
linien
struct mtime { typedef time_t const *value_type; };
skal rettet til
struct mtime { typedef std::time_t const *value_type; };

Der mangler også en
#include <ctime>

> Error E2089 boost/directory.h 135: Identifier 'value_type' cannot have a
> type qualifier
> Error E2139 boost/directory.h 135: Declaration missing ;
> Error E2268 dir_it_tst.cpp 41: Call to undefined function 'localtime' in
> function main()

Ikke C++
Det hedder std::localtime

> Error E2268 dir_it_tst.cpp 41: Call to undefined function 'strftime' in
> function main()

Ikke C++
Det hedder std::strftime

> *** 5 errors in Compile ***
>

Senere vil du få nogle
"Invalid explicit specialization of '...'

F.eks. står der

template <> get<size>:erator value_type() const
{
return m_it.rep->get_data().size;
}

hedder retteligt

get<size>:erator value_type() const
{
return m_it.rep->get_data().size;
}

jvf. §14.7.3 i C++ standarden (side 274)

Med passende smårettelser for at få gjort koden mere i overensstemmelse med
C++ Standarden (jeg har ikke en komplet liste lige nu) kan jeg få dir_it til
at køre med Borland C++Builder V5.0.

>
> Boost bibliotekerne har ambitioner om at blive implementeret i Standard
C++
> Library og dir_it har et meget smukt interface. Hvis de ellers virkede
(hos
> mig) var det et godt valg. Installationen er i hvert fald ikke for
> begyndere.
>

dir_it bibliotekeet figurer fortsat under "Beta Libraries".

Jeg er rimeligt sikker på at dir_it er blevet testet med Microsoft Visual
C++.
Jeg behøver vel ikke at snakke yderligere om Microsoft Visual C++ og
overholdelse af ISO C++ Standarden ?

Venlig hilsen

Mogens Hansen



Jesper Gødvad (27-08-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 27-08-01 23:44


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:9m8543$dq7$1@news.cybercity.dk...
> > > Det nemmeste er at finde et bibliotek, der løser problemet for dig.
> > > Prøv f.eks. på boost
> > > http://www.boost.org/libs/dir_it/index.htm
> >

> > Virker det hos dig?
>
> Ikke umiddelbart med Borland C++Builder, når det downloades.
> Jeg har kigget på dir_it eksemplet (dir_it_tst.cpp), og har fundet ud af
at
> der er en række fejl i koden, så den i hvertfald ikke er i
overensstemmelse
> ISO C++ Standarden.

Jeg ved godt den er i beta, så selvom jeg ikke forventede alt ville virke,
regnede jeg da med at den kunne kompilere. Når tanken netop er at
biblioteket er til brug under flere compilere og operativsystemer virker det
som en lidt underlig fremgangsmåde, men jeg kan heller ikke vurdere om det
er en enkelt svipser eller om han bare ikke har taget højde for det.

> > Error E2139 boost/directory.h 100: Declaration missing ;
>
> Ikke C++
> linien
> struct mtime { typedef time_t const *value_type; };
> skal rettet til
> struct mtime { typedef std::time_t const *value_type; };



Det er jo helt uforståeligt.
'typedef' kan *kun* være en synonym erklæring
'std::time_t' er sikkert 'bare' en 32-bit integer
'const' går jeg udfra angiver at *value_type ikke ændrer std::time_t
*value_type går jeg udfra er selve synonymet og ikke en pointer til
synonymet.
*value_type går jeg også udfra er et reserveret ord.

Hvad er meningen? i modsætning til de øvrige struct's der har samme
karakteristika som en fil-tid (dvs. at de er readonly).

struct is_directory { typedef bool value_type; };
struct is_regular { typedef bool value_type; };
struct is_hidden { typedef bool value_type; };

Jeg går udfra at idéen med disse er, at value_type automatisk returneres, så
man kan skrive:
is_hidden foo;
if ( foo ) ....

men hvorfor så ikke bare:
typedef bool is_hidden;
typedef std::time_t mtime;

eller

struct mtime { timedef std::time_t value_type; };

der er jo intet sparet ved at lave pointere til integers.

> Med passende smårettelser for at få gjort koden mere i overensstemmelse
med
> C++ Standarden (jeg har ikke en komplet liste lige nu) kan jeg få dir_it
til
> at køre med Borland C++Builder V5.0.

Husk at sende dem til ham. Interfacet er godt, så det ville være en
fornøjelse hvis det kom til at virke.

> Jeg er rimeligt sikker på at dir_it er blevet testet med Microsoft Visual
> C++.
> Jeg behøver vel ikke at snakke yderligere om Microsoft Visual C++ og
> overholdelse af ISO C++ Standarden ?

Nej, det er bare mig der bliver overrasket hver gang

mvh. jesper



Mogens Hansen (28-08-2001)
Kommentar
Fra : Mogens Hansen


Dato : 28-08-01 18:44


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9mei85$t37$1@sunsite.dk...
>
> "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
> news:9m8543$dq7$1@news.cybercity.dk...

>
> Jeg ved godt den er i beta, så selvom jeg ikke forventede alt ville virke,
> regnede jeg da med at den kunne kompilere. Når tanken netop er at
> biblioteket er til brug under flere compilere og operativsystemer virker
det
> som en lidt underlig fremgangsmåde, men jeg kan heller ikke vurdere om det
> er en enkelt svipser eller om han bare ikke har taget højde for det.
>

Jeg tror blot at det ikke er testet færdigt.
Man bruger jo typisk compileren til at checke at ens kode er i
overensstemmelse med sprogspecifikationen.
Man starter med een compiler, og tester derefter med flere (hvis man har
flere).
For at have friheden til at vælge en compiler med de egenskaber (f.eks.
understøttede platforme, kode generering, fejlfindingsværktøjer etc.) som
man har brug for er det vigtigt at compileren i høj grad understøtter C++
Standarden. Ellers bliver man unødvendigt nemt bundet til een compiler.

> > > Error E2139 boost/directory.h 100: Declaration missing ;
> >
> > Ikke C++
> > linien
> > struct mtime { typedef time_t const *value_type; };
> > skal rettet til
> > struct mtime { typedef std::time_t const *value_type; };
>
>
>
> Det er jo helt uforståeligt.

Det er blot at typen "time_t" er en del af namespace "std".

> *value_type går jeg også udfra er et reserveret ord.

Nej, det er bare en typedef

>
> Hvad er meningen? i modsætning til de øvrige struct's der har samme
> karakteristika som en fil-tid (dvs. at de er readonly).

Jeg ved ikke umiddelbart hvorfor han valgte at gøre det til en pointer - jeg
ville blot have det til at compilere

> Jeg går udfra at idéen med disse er, at value_type automatisk returneres,

> man kan skrive:
> is_hidden foo;
> if ( foo ) ....
>

Nej, det er for at kunne lave noget "property" lignende kode:
if(get<is_directory>(it)) ...

Om det er nemmere end at skrive
if(it.is_directory()) ...

vil jeg ikke afgøre. Der kan ligge nogle smarte tanker bag.

>
> Husk at sende dem til ham. Interfacet er godt, så det ville være en
> fornøjelse hvis det kom til at virke.
>

Det skal jeg nok - men jeg har ikke gjort det endnu.

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste