Avatar billede thomas_nj Nybegynder
13. februar 2005 - 23:41 Der er 12 kommentarer og
1 løsning

Exception gør ikke som jeg vil have de skal

Hej eksperter

  Dette her er første gang jeg leger med exceptions, så det kan godt ske jeg har misforstået noget. Det der går galt for mig er at følgende program bare afslutter i stedet for at udskrive den fejl jeg gerne ville have det til.
  Problemet opstår både under linux og windows(koden i ser her)

#include <iostream>
#include <cstdlib>

using namespace std;

int main () {
  char myarray[10];
  try
  {
    for (int n=0; n<=10; n++)
    {
      if (n>9) throw "Out of range";
      myarray[n]='z';
    }
  }
  catch (char * str)
  {
    cout << "Exception: " << str << endl;
  }
  system("pause");
  return 0;
}

  Nogen ideer til hvordan jeg holder programmet i live så jeg får vist min fejlmeddelelse?
Avatar billede arne_v Ekspert
13. februar 2005 - 23:49 #1
Det virker med MS VC++ 7.1 og BC++ 5.5 men ikke med diverse GCC.
Avatar billede bertelbrander Novice
13. februar 2005 - 23:49 #2
Prøv med:
  catch (const char * str)
Avatar billede thomas_nj Nybegynder
13. februar 2005 - 23:51 #3
bertelbrander >> åbenbart det der skulle til. Du har vel ikke også en forklaring på hvorfor den skal være const?
Avatar billede arne_v Ekspert
13. februar 2005 - 23:51 #4
Se det virker jo.

Pudsigt fordi eksemplet er jo "kendt" (http://www.cplusplus.com/doc/tutorial/tut5-3.html)
Avatar billede bertelbrander Novice
13. februar 2005 - 23:54 #5
Ikke nogen skudsikker forklaring.

Men kompileren mener tilsyneladende at "Out of range" er en const char *, det vil jeg nu ikke mene at det er.
Så vidt jeg kan se vil  catch (const char * str) både fange const og ikke const char *
Avatar billede bertelbrander Novice
13. februar 2005 - 23:58 #6
I C++ standarden står der at:

throw "Help!";
can be caught by a handler of const char* type:
try {
// ...
}
catch(const char* p) {
// handle character string exceptions here
}

Så gcc har måske ret.
Avatar billede arne_v Ekspert
14. februar 2005 - 00:05 #7
Et interessant eksperiment:

C:\>type z.cpp
#include <iostream>
#include <cstdlib>

using namespace std;

int main () {
  char myarray[10];
  try
  {
    for (int n=0; n<=10; n++)
    {
      if (n>9) throw "Out of range";
      myarray[n]='z';
    }
  }
  catch(char *str)
  {
    cout << "Exception: " << str << endl;
  }
  system("pause");
  return 0;
}

C:\>g++ z.cpp -o z.exe

C:\>z

abnormal program termination

C:\>g++ -fno-const-strings z.cpp -o z.exe

C:\>z
Exception: Out of range
Press any key to continue . . .
Avatar billede bertelbrander Novice
14. februar 2005 - 00:15 #8
Kikkede lidt mere i C++ standarden, der står der:
An ordinary string literal has type “array of n const char”

En "string literal" en en "string literal" og dermed const...
Avatar billede bertelbrander Novice
14. februar 2005 - 00:25 #9
Et andet eksempel:

#include <iostream>

using namespace std;

void t(const char *p)
{
  std::cout << "P is const" << std::endl;
}

void t(char *p)
{
  std::cout << "P is not const" << std::endl;
}

int main ()
{
  t("This is a test");
}

g++ siger at P er const, det gør Borland, Visual C++ og Digital Mars ikke.

Det skyldes måske at en "string literal" ikke er const i C
Avatar billede arne_v Ekspert
14. februar 2005 - 13:54 #10
Tja - det det er grusomt svært at skrive et C eller C++ program som opfører
sig ens på alle styresystemer/compilere.
Avatar billede thomas_nj Nybegynder
14. februar 2005 - 18:38 #11
Med det niveau jeg koder på opgiver jeg at forstå den helt store sammenhæng og bare glæde mig over det virker.
  arne_v>> Gider du ikke lægge et svar så jeg kan lukke?
  bertelbrander >> Mange tak for hjælpen med at opklare mysteriet
Avatar billede arne_v Ekspert
14. februar 2005 - 18:40 #12
ok
Avatar billede bertelbrander Novice
14. februar 2005 - 20:05 #13
C++ slæber rundt på en meget stor bagage. De fleste kompiler fabrikanter forsøger at være bagud kompatible. Selv om C++ standarden er 6 år gammel er der ikke ret mange der lever op til den.

Nye sprog som C# og java er mere rene, for der findes (stort set) kun en standard.

Det virker med const char * med alle de kompilere jeg har ved hånden, ellers må man lave en cast.
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