/ 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
Hvorfor får jeg warning? Standard Library
Fra : Jesper Gødvad


Dato : 03-05-01 14:41


Jeg har lavet en funktion, der ved kompilering giver warning i BCC32 5.5,
men er påkrævet i Linux.

Er der nogen der har en forklaring eller et alternativt forslag så jeg
undgår warning?

Warning: Dist is assigned a value that is never used.

void minFunktion() {
minVector::iterator count;
minVector::difference_type dist = 0; //dist = 0; giver Warning i Borland,
men virker Linux??
mitObjekt tmp;
for (count = tabel.begin(); count != tabel.end(); count++) {
tmp = *count;
distance(tabel.begin(), count, dist);
cout << dist << ") " << tmp << endl;
}
}

~jesper~




 
 
Igor V. Rafienko (03-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 03-05-01 15:02

* Jesper Gødvad

> Er der nogen der har en forklaring eller et alternativt forslag så
> jeg undgår warning?


Ikke bruk dist? :)


> Warning: Dist is assigned a value that is never used.


Gir mening.


> void minFunktion() {
> minVector::iterator count;
> minVector::difference_type dist = 0; //dist = 0; giver Warning i Borland, men virker Linux??
> mitObjekt tmp;
> for (count = tabel.begin(); count != tabel.end(); count++) {
> tmp = *count;
> distance(tabel.begin(), count, dist);


Huh? IIRC finnes distance bare i en utgave, nemlig den med 2
argumenter som er iterators som betegner "differansen" mellom det
andre og det første. Mener du kanskje

dist = distance( table.begin(), count );

? (selv da er funksjonen komplett meningsløs).

En annen ting er at det slettes ikke er nødvendig å regne ut
distance() i dette tilfellet -- indeksen til elementet forteller deg
alt du trenger å vite. Og det å regne ut distance for alt annet enn
Random access iterators gjentatte ganger er en Dårlig Ide[tm].

Hvis du vil skrive et element og dens posisjon, foreslår jeg noe
sånt:


foo::difference_type index = 0;
foo::iterator start = table.begin(), end = table.end();

for ( start = table.begin(), index = 0; start != end; ++start, ++index ) {
foo::value_type object = *count;
cout << object << " @ " << index << "\n";
}





ivr, som prøver samtidig å høre BS snakke om framtiden til C++.
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing."

Jesper Gødvad (03-05-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 03-05-01 23:43


"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjvzocusf97.fsf@hel.ifi.uio.no...
> * Jesper Gødvad
>
> > Er der nogen der har en forklaring eller et alternativt forslag så
> > jeg undgår warning?
> Ikke bruk dist? :)

Ja, det kan du jo sagtens sige (og det gør du jo flere gange), men jeg skal
bruge en dynamisk container med random access adgang.

Andre forslag?

[cut]

> Huh? IIRC finnes distance bare i en utgave, nemlig den med 2
> argumenter som er iterators som betegner "differansen" mellom det
> andre og det første. Mener du kanskje
>
> dist = distance( table.begin(), count );
>
> ? (selv da er funksjonen komplett meningsløs).

Det virker da også meget mere logisk. Jeg ville vedhæfte dokumentationen fra
Borland Builder 5's hjælpefil, men det må jeg ikke. Det er ellers der jeg
har det fra.

(Var der nogen, der sagde at Borland havde bedre implementering af Standard
Library, Mogens? )

> ivr, som prøver samtidig å høre BS snakke om framtiden til C++.

Jeg forstår desværre ikke hvad du mener med ovenstående.

venlig hilsen Jesper





Mogens Hansen (04-05-2001)
Kommentar
Fra : Mogens Hansen


Dato : 04-05-01 01:21

Hej Jesper,
>
> Det virker da også meget mere logisk. Jeg ville vedhæfte dokumentationen
fra
> Borland Builder 5's hjælpefil, men det må jeg ikke. Det er ellers der jeg
> har det fra.

Borlands dokumentation er _ikke_ C++ Standarden.

>
> (Var der nogen, der sagde at Borland havde bedre implementering af
Standard
> Library, Mogens? )

Oh Gud - nu kunne jeg jo give mig til at håne dig i højlydte vendinger.

Bedre end hvad ?

Det er jo skuffende at blive citeret ukorrekt og ude af kontekst. Den slags
kan man kun miste respekten for. Du har i hvert fald ikke øget min lyst til
at hjælpe dig fremover. Jeg har tilmed prøvet at forklare dig en del
off-line i private mail.
Jeg har vist aldrig sagt at det er "ISO C++ Standard Library reference
implementeringen" (hint: den findes ikke), der følger med Borland C++
compileren. Det er i øvrigt RogueWave, der har skrevet den.
Jeg har vist aldrig sagt at Borland C++ er _den_ mest compliant compiler der
findes på denne planet. Det er nok nærmere EDG frontenden, som dog heller
ikke er fuldstændig compliant.
Jeg har vist aldrig skamrost Borlands dokumentation, selv der ikke er
_meget_ at kritisere på dette punkt. Generelt er det bedre at have gode
bøger - f.eks. Matt Austerns bog på dette punkt.
Jeg har henvist til en undersøgelse af en række compilere som Herb Sutter
var hovedmanden bag (jeg kan da også nævne at jeg talte face-to-face med
Herb Sutter om test-suiter og hvordan man tester compilere _inden_ han gik i
gang med undersøgelen).
Jeg har sagt at ofte (men ikke altid) er Borland C++Builder V5 (og dermed
også V5.5 af deres kommandolinie compiler) en del mere compliant end
Microsoft V6.0. Det står jeg gerne ved. Det er den gængse opfattelse, men
ikke præcist det som Herb Sutters undersøgelse viser i sin oversigt.
Jeg kan som eksempel nævne at jeg compilerede for nyligt _al_ sourcekoden
fra Andrew Koenig og Barbara Moo's bog "Accelerated C++" med Borland
C++Buiilder V5.0.
Resultatet var at Borland compileren fandt 2 fejl i koden. En manglende over
holdelse af ANSI C++ standarden ved oversættelse, og en fejl som CodeGuard
fandt på runtime. Disse fejl er rettet i koden der kan downloades og vil
komme med i næste oplag af bogen.
Se:
http://www.acceleratedcpp.com/details/errata.html

Status på source koden til "Accelerated C++" er:
96 "ifdef" for at håndtere Microsoft Visual C++ V6 fejl
13 "ifdef" for at håndtere GNU (V??) fejl
1 "ifdef" for at håndtere for at håndtere Borland C++Builder V5.0 fejl
men det skrev jeg allerede til dig i en privat mail lørdag den 21. april.

Nå, men tilbage til "distance" og dokumentationen til Borland C++Builder
V5.0


I C++ Standarden er distance defineret som
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);

Kig øverst på den side der beskrive "distance" i Borland hjælpefilen, så vil
du se at der står
template <class ForwardIterator>
iterator_traits<ForwardIterator>::difference_type
distance (ForwardIterator first,
ForwardIterator last);

der står også følgende form:
template <class ForwardIterator, class Distance>
void distance (ForwardIterator first,
ForwardIterator last,
Distance& n);
som er den oprindelige STL implementering. Det var lavet sådan på grund af
specifikationen og implementeringen af templates på daværende tidspunkt -
partial template specialisation.
Kan du huske at jeg sagde at STL _ikke_ er en del af ISO C++ Standard
library, selv om man ofte siger det. Dette er et eksempel på hvordan de
adskiller sig fra hinaden.

Hvis du kigger i dokumentationen til Visual C++ V6.0 står der:
template<class Init, class Dist>
ptrdiff_t distance(InIt first, InIt last);

og de har i øvrigt også stort set den oprindelige STL implementering
template<class InIt, class Dist>
void _Distance(InIt first, InIt last, Dist& n0);

Det at give flere funktioner, end hvad der er beskrevet i ISO C++
Standarden, med sin compiler er _ikke_ non-compliant.
Ovenstående eksempel viser også at i det konkrete eksempel er RogueWaves
(Borland) erklæring af distance _lidt_ mere compliant en Dinkum (Microsoft)
erklæringen. Så det bekræfter for så vidt blot hvad jeg tidligere har nævnt.


>
> > ivr, som prøver samtidig å høre BS snakke om framtiden til C++.
>
> Jeg forstår desværre ikke hvad du mener med ovenstående.

Der ligger et foredrag som MP3 file på TechNetCast.

Desuden vil du på comp.std.c++ og comp.lang.c++.moderated kunne se et indlæg
skrevet af Francis Glassborow, som han skrevn mens Bjarne Stroustrup holdt
et foredrag til ISO Standardiserings komitteen tirsdag aften i
Charlottenlund, om hvilke retninger C++ kunne udvikle sig i fremtiden.
Efterfølgende var der debat med alle "spidserne" i C++ verdenen.
Under foredraget sad _jeg_ umiddelbart ved siden af Francis Glassborow og så
hvad han skrev til nyhedsgrupperne.
På den min venstre side sad alle folkene fra EDG compileren, som jeg lige
nåede at snakke lidt med, fordi vi anvender deres front-end på mit arbejde.

Venlig hilsen

Mogens Hansen



Jesper Gødvad (04-05-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 04-05-01 10:00


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:9csskq$1nd6$2@news.cybercity.dk...
> Hej Jesper,

> > (Var der nogen, der sagde at Borland havde bedre implementering af
> Standard
> > Library, Mogens? )
>
> Oh Gud - nu kunne jeg jo give mig til at håne dig i højlydte vendinger.
>
> Bedre end hvad ?
>
> Det er jo skuffende at blive citeret ukorrekt og ude af kontekst. Den
slags
> kan man kun miste respekten for. Du har i hvert fald ikke øget min lyst
til
> at hjælpe dig fremover. Jeg har tilmed prøvet at forklare dig en del
> off-line i private mail.
> Jeg har vist aldrig sagt at det er "ISO C++ Standard Library reference
> implementeringen"

Jeg er enig med dig i alt hvad du skriver bortset fra at du føler jeg har
citeret dig ukorrekt. Det var ikke ment som en stikpille til dig, fordi du
angiveligt skulle have sagt et eller andet (forkert) om implementeringen af
Standard Library. Det har jeg slet ingen forudsætninger for at udtale mig om
og hvis du skrev en bog om emnet ville jeg købe den.

Min kommentar var ment som en reference til dengang du fortalte mig, at
ingen compilere har en fuldt implementeret Standard Library og jeg spurgte
om man i disse tilfælde så blot ville lave en workaround, hvilket du
bekræftede. Det var min opfattelse at eksemplet illustrerede et sådant
eksempel, men der er åbenbart noget jeg har misset som du skriver i næste
mail.

Jeg er taknemmelig for de svar og forklaringer du har givet mig privat og i
resten af gruppen, så jeg håber sandelig ikke du afholder dig fra at skrive
til mig (eller andre) fremover. Der er vist ingen her, som kan stille
spørgsmålstegn ved din viden om emnet. Det er desuden en fornøjelse at mange
af dine posts er sat i historisk perspektiv, hvor du fortæller hvornår,
hvordan og hvorfor tingene blev til. Brevet jeg svarer på her er ingen
undtagelse.

Som sagt har det aldrig været hensigten at insinuere at du har taget fejl,
men hvis du har oplevet det sådan får du hermed en undskyldning og jeg vil
vare mig for at skrive noget lignende fremover.

venlig hilsen Jesper Gødvad





Igor V. Rafienko (04-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 04-05-01 12:23

* Jesper Gødvad

> Ja, det kan du jo sagtens sige (og det gør du jo flere gange), men
> jeg skal bruge en dynamisk container med random access adgang.
>
> Andre forslag?


Ikke før du forteller hva er det du _egentlig_ vil.


> > dist = distance( table.begin(), count );
> >
> > ? (selv da er funksjonen komplett meningsløs).
>
> Det virker da også meget mere logisk.


Det er fremdeles ytterst meningsløst, men men...


> Jeg ville vedhæfte dokumentationen fra Borland Builder 5's
> hjælpefil, men det må jeg ikke. Det er ellers der jeg har det fra.


<URL:http://www.dinkum.com/> Eller "lefsa" (aka ISO/IEC
14882:1998(E)).


> > ivr, som prøver samtidig å høre BS snakke om framtiden til C++.
>
> Jeg forstår desværre ikke hvad du mener med ovenstående.


B. Stroustrup og et par andre holdt et foredrag (paneldebatt) om
framtiden til C++. mp3-filen ligger her:
<URL:http://technetcast.ddj.com/tnc_play_stream.html?stream_id=560>





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

Jesper Gødvad (03-05-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 03-05-01 23:51


"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjvzocusf97.fsf@hel.ifi.uio.no...

> Hvis du vil skrive et element og dens posisjon, foreslår jeg noe
> sånt:
>
> foo::difference_type index = 0;
> foo::iterator start = table.begin(), end = table.end();
>
> for ( start = table.begin(), index = 0; start != end; ++start, ++index ) {
> foo::value_type object = *count;
> cout << object << " @ " << index << "\n";
> }

---
// Min funktion, som den ser ud. symbolVector er en vector <TabelObjekt>
void Symbols::printTabel() {
symbolVector::difference_type index = 0;
symbolVector::iterator start = tabel.begin(), slut = tabel.end();
TabelObjekt tmp;

for ( start = tabel.begin(), index = 0; start != slut; ++start, ++index) {
tmp = *start;
cout << index << ") " << tmp << endl;
}
}
---

og mit kompileringsresultat:

---
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
t6.cpp:
Warning W8004 symbols.cpp 102: 'start' is assigned a value that is never
used in function Symbols::printTabel()
Warning W8004 symbols.cpp 101: 'index' is assigned a value that is never
used in function Symbols::printTabel()
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
---

Skal jeg bare konstatere at compileren ikke overholder Standard C++ Library
på dette punkt eller er der noget jeg har misset?

venlig hilsen Jesper




Mogens Hansen (04-05-2001)
Kommentar
Fra : Mogens Hansen


Dato : 04-05-01 01:21


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9csn63$76h$1@sunsite.dk...
>
> "Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
> news:xjvzocusf97.fsf@hel.ifi.uio.no...
>
> > Hvis du vil skrive et element og dens posisjon, foreslår jeg noe
> > sånt:
> >
> > foo::difference_type index = 0;
> > foo::iterator start = table.begin(), end = table.end();
> >
> > for ( start = table.begin(), index = 0; start != end; ++start, ++index )
{
> > foo::value_type object = *count;
> > cout << object << " @ " << index << "\n";
> > }
>
> ---
> // Min funktion, som den ser ud. symbolVector er en vector <TabelObjekt>
> void Symbols::printTabel() {
> symbolVector::difference_type index = 0;
> symbolVector::iterator start = tabel.begin(), slut = tabel.end();
> TabelObjekt tmp;
>
> for ( start = tabel.begin(), index = 0; start != slut; ++start, ++index)
{
> tmp = *start;
> cout << index << ") " << tmp << endl;
> }
> }
> ---
>
> og mit kompileringsresultat:
>
> ---
> Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
> t6.cpp:
> Warning W8004 symbols.cpp 102: 'start' is assigned a value that is never
> used in function Symbols::printTabel()
> Warning W8004 symbols.cpp 101: 'index' is assigned a value that is never
> used in function Symbols::printTabel()
> Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
> ---
>
> Skal jeg bare konstatere at compileren ikke overholder Standard C++
Library
> på dette punkt eller er der noget jeg har misset?

ja - der er noget du har misset!

Venlig hilsen

Mogens Hansen



Igor V. Rafienko (04-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 04-05-01 12:30

* Jesper Gødvad


> // Min funktion, som den ser ud. symbolVector er en vector <TabelObjekt>
> void Symbols::printTabel() {
> symbolVector::difference_type index = 0;
                ^^
> symbolVector::iterator start = tabel.begin(), slut = tabel.end();
             ^^^^^^^^^^^^^^


Her kommer en initialisering, "for ordens skyld".


> TabelObjekt tmp;
>
> for ( start = tabel.begin(), index = 0;
    ^^^^^^^^^^^^^^ ^^

og så kommer en tilordning til, som er det man _egentlig_ vil gjøre.
Eller nei, _egentlig_ vil man gjøre dette:

for ( symbolVector::iterator start = tabel.begin(),
symbolVector::difference_type index = 0;
start != slut;
++start, ++index )

men dette er (dessverre?) ulovlig i C og C++.


> start != slut; ++start, ++index) {
> tmp = *start;
> cout << index << ") " << tmp << endl;
> }
> }

[snip]


Jeg er imponert over at kompilatoren protesterte på sånt, men det var
på ingen måte i strid med hva "lefsa" krever av en implementasjon.
IIRC, har en kompilator rett til å klage på _hva som helst_, selv på
pedantisk korrekt kode (i visse tilfeller kreves det en feilmelding,
men jeg kan ikke huske at det finnes tilfeller der det er eksplisitt
forbudt å gi en feilmelding). Mao. "your code is out of synch with
Moon phase" er en tillatt (feil)melding fra en implementasjon.





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

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


Dato : 08-05-01 11:47


> Jeg er imponert over at kompilatoren protesterte på sånt, men det var
> på ingen måte i strid med hva "lefsa" krever av en implementasjon.
> IIRC, har en kompilator rett til å klage på _hva som helst_, selv på
> pedantisk korrekt kode (i visse tilfeller kreves det en feilmelding,
> men jeg kan ikke huske at det finnes tilfeller der det er eksplisitt
> forbudt å gi en feilmelding). Mao. "your code is out of synch with
> Moon phase" er en tillatt (feil)melding fra en implementasjon.

Nu har jeg ændret funktionen til:

void Symbols::printTabel() {
size_t index;
symbolVector::iterator start;
symbolVector::iterator slut = tabel.end();
TabelObjekt tmp;
for ( start = tabel.begin(), index = 0; start != slut; ++start, ++index) {
tmp = *start;
cout << index << ") " << tmp << endl;
}
}

... og det komplierer uden warnings på både bcc32 og g++

Tak for hjælpen.

mvh. Jesper



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste