/ 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
printf eller cout?
Fra : Bertel Lund Hansen


Dato : 10-04-02 06:49

Hej alle

Jeg har lært C i 1. og 2. semester. Her i 4. har jeg så valgt
C++. Jeg havde glædet mig til at få en nemmere håndtering af
strenge, og det er der da også, men at få en formatteret udskrift
er åbenbart langt nemmere med printf - at skrive i hvert fald.
Det kan jo godt ske at den færdige kode er på højde med
kompileret C-kode.

Er det mig der er for konservartiv, eller hva'?


 
 
Mogens Hansen (10-04-2002)
Kommentar
Fra : Mogens Hansen


Dato : 10-04-02 07:54


"Bertel Lund Hansen" <nospam@lundhansen.dk> wrote

>
> Jeg har lært C i 1. og 2. semester. Her i 4. har jeg så valgt
> C++. Jeg havde glædet mig til at få en nemmere håndtering af
> strenge, og det er der da også, men at få en formatteret udskrift
> er åbenbart langt nemmere med printf - at skrive i hvert fald.

Der er klart situationer, hvor printf (og den familie) umiddelbart er mere
tilgængelig.
Kan du give et eksempel på hvad du har oplevet ?

iostream løser to væsentlige opgaver i forhold til printf:
* det er type sikkert
* der er udvideligt i forhold til bruger definerede typer
Der er også andre ting, det løser.

Type sikkert:
Med printf skal man først skrive en teksstreng, der fortæller _run-time_
systemet hvilket typer det kan forvente af finde på kaldestakken.
Hvis man får skrevet forkert, eller senere ændrer på en variabels type, så
skriver printf garbage ud.
Nogle compilere kan give warnings, hvis der er uoverensstemmelse mellem
formatstrengen, men de fleste compilere jeg kender gør det ikke.

Compiletime fejl er at foretrække frem for run-time fejl. Funktions
overloading, så man finder den rigtige typesikre funktion er endnu bedre.

Det generelle problem er at man mister type information i forhold til
compileren, når man repræsenterer en type som en tekststreng.


Udvideligt i forhold til bruger definerede typer:
Man kan selv definere en klasse, f.eks. (er ikke compileret):

class date;

er dertil definere en streaming operator

ostream& operator<<(ostream& os, const date& d);

så man kan skrive datoer ud på præcis samme måde som integer osv.

> Er det mig der er for konservartiv, eller hva'?
>

Det man kender opfattes naturligvis som værende nemmere end det man ikke
kender.

Personligt havde jeg svært ved at omstille mig, men idag bruger jeg aldrig
printf mere. Når man har siddet om kæmpet med unødvendige type fejl
tilstrækkeligt mange gange, så værdsætter man C++'s typesikre stream
bibliotek.

Venlig hilsen

Mogens Hansen



Claus Rasmussen (10-04-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 10-04-02 08:18

Bertel Lund Hansen wrote:

> Jeg har lært C i 1. og 2. semester. Her i 4. har jeg så valgt
> C++. Jeg havde glædet mig til at få en nemmere håndtering af
> strenge, og det er der da også, men at få en formatteret udskrift
> er åbenbart langt nemmere med printf - at skrive i hvert fald.
> Det kan jo godt ske at den færdige kode er på højde med
> kompileret C-kode.
>
> Er det mig der er for konservartiv, eller hva'?

Nja. Det er rigtigt, at hvis du ønsker at udskrive dine data i
kolonner med venstre-højre justering og med et bestemt antal
decimaler, så er printf nemmere:

printf("%-40s\n%2f", "Felt på 40 tegn", 123.456)

sammenlignet med

cout << setw(40) << "Felt på 40 tegn" << endl
<< setprecision(2) << 123.456 << endl;

(du skal være opmærksom på, at der endnu ikke er særligt mange
compilere, der implementerer alle manipulatorer. gcc-2.x gør
ikke. gcc-3.x gør.

Men jeg synes, det opvejes af mulighederne for at behandle dine
egne typer, som var de indbygget i srpoget. F.eks:

struct Date {
int year, month, day;

Date(int year, int month, int day)
: year(year), month(month), day(day)
{}

friend ostream& operator<<(ostream& out, const Date& d) {
out << year << "-" << month << "-" << day;
return out;
}
};

int main() {
Date dato(2002, 4, 10);

cout << "Der er i dag d. " << dato << endl;
}


Boost (www.boost.org) har gang i en printf lignende udvidelse til
cout m.fl, så kan kan skrive noget i stil med:

cout << "Det er i dag d. " << dato << endl
<< format("%-40s", "Felt på 40 tegn") << endl
<< format("%2f", 123.456) << endl;

Altså det bedste fra C/C++ kombineret (bortset fra, at de så vidt
jeg kan læse mig frem til har valgt en strækkelig syntax). Boost
versionen af printf er endnu ikke en del af deres library, men
den kommer nok i løbet af få måneder.

Men det bedste ved at anvende C++s cout er altså, at du kan udvide
den. F.eks har jeg selv lavet en lille fiks ting, som jeg bruger,
når jeg vil have pæne udskrifter af containere:

list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);

cout << format(l.begin(), l.end(), "(", ", ", ")") << endl;

Som udskriver '(1, 2, 3)'. Og igen kan du kombinere dine egne
kreationer med hvad der ligger i standarden allerede.

-Claus


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