Avatar billede hrc Mester
10. november 2003 - 18:02 Der er 7 kommentarer og
1 løsning

Undgå printf i C++

Vil kalde clog og få output foranstillet med "Main (debug): ". Eksempelvis skal

    clog << "Division by (close to zero): " << TinyNumber << endl;

resultere i følgende output:

    "Main (debug): Division by (close to zero): 0.000023\n".

Fordelen er, at n parametre kan angives uden at være typefaste som i printf. Kan jeg (jeg kan ikke, men kan nogen) nedarve clog og derved ændre dens << operator så ovenstående kommer til at virke?


Alternativet (der passer bedst til det nuværende problem): Kan man implementere noget lignende nedenstående pseudokode?

#include <iostream>
using namespace std;

void print_message(char *name, char* type, char *msg)
{
  clog << endl << type << ": " << name << "  -  " << msg;
}

int main(int argc, char *argv[]){
  int x = 12, y = 33;

  print_message("Main","Debug","Hello, world"); // OK

  print_message("Main","Debug", ("x: " << x << "  y: " << y) ); // HowTo?
  return 0;
}

Ender jeg med at må lave en streng først eller bare bruge (good-ol) printf?

P.S. Jeg hader Ekspertens time-out logout!!!
Avatar billede arne_v Ekspert
10. november 2003 - 18:13 #1
Det nemmeste er ikke at bruge en metode/funktion fordi << har allerede
den funktionalitet.

Evt. bruge preprocessoren a la:

#include <iostream>

using namespace std;

#define PRINTCOUT(s1,s2,s3) cout << s1 << ":" << s2 << " - " << s3 << endl;

int main()
{
  PRINTCOUT("a","b","c")
  PRINTCOUT("a","b","1>2 " << (1>2?"true":"false"))
  PRINTCOUT("a","b","2>1 " << (2>1?"true":"false"))
  return 0;
}
Avatar billede arne_v Ekspert
10. november 2003 - 18:14 #2
Alternativt skal du bruge funktionerne i stdarg.h til at supportere et variabelt
antal argumenter.

Det kan også gøres. Men det kan godt blive lidt problematisk at styre typerne.
Avatar billede arne_v Ekspert
10. november 2003 - 20:18 #3
Følgende virker men er absolut ikke kønt:

#include <iostream>
#include <cstdarg>

using namespace std;

const int INTARG = 1;
const int STRARG = 2;

void printcout(char *s1,char *s2,int n,...)
{
  cout << s1 << ":" << s2 << ":";
  va_list argptr;
  va_start(argptr,n);
  for(int i=0;i<n;i++)
  {
      switch(va_arg(argptr,int))
      { 
        case INTARG:
            cout << va_arg(argptr,int);
            break;
        case STRARG:
            cout << va_arg(argptr,char *);
            break;
      }
  } 
  va_end(argptr);
  cout << endl;
}

int main()
{
  printcout("a","b",1,STRARG,"c");
  printcout("a","b",2,STRARG,"1>2 ",STRARG,1>2?"true":"false");
  printcout("a","b",2,STRARG,"2>1 ",STRARG,2>1?"true":"false");
  return 0;
}
Avatar billede narrr Nybegynder
11. november 2003 - 08:08 #4
Du skal vel bruge noget stringstream.... jeg laver lige et eksempel senere.
Avatar billede narrr Nybegynder
11. november 2003 - 10:16 #5
nå.. det kunne man åbenbart ikke :(
Avatar billede soepro Nybegynder
12. november 2003 - 13:14 #6
Hvis du vil sætte noget (automatisk) ind foran den almindelige tekst UDEN selv af skrive det, er du som udgangspunkt nødt til enten at overloade << operatoren for clog, eller lave en ny klasse med << operator i, og overloade << operatoren i den. Jeg tvivler meget på at du rent faktisk vil kunne slippe afsted med at overloade selve clog's '<<' operator, så nedarving er nok svaret, dvs. noget i stil med:

class xlog : clog
{
  ostream& operator << (stream& a)
  {
      clog << "Main debug: " << a;
  }
}

Og så skrive

xlog << "Division by (close to zero): " << TinyNumber << endl;

i ste´det for.
Avatar billede hrc Mester
13. november 2003 - 17:48 #7
Til soepro. Vil dit eksempel ikke resultere i følgende output:

Main debug Division by (close to zero): Main debug 0.... Main debug <cr> ?

Altså 3 gange prefixing
Avatar billede soepro Nybegynder
14. november 2003 - 08:34 #8
hrc >> Jo sikkert, jeg skriver derfor også bare "noget i stil med". Man kunne jo f.eks. nøjes med at skrive 'Main debug:' efter hver endl. Du vil jo i praksis også skulle overloade operatoren for alle andre datatype, du ønsker at kunne "hælde ud".
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester