/ 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
underlige visual c compiler
Fra : Bo Helleskov


Dato : 17-06-02 07:59

Hej Alle,

Jeg har et problem med "visual c 6" compileren.
Når jeg compiler nedstående kode til "debug-mode" og prøver at køre
kode,
får jeg følgende fejl: "Unhandled exception in .....exe: 0xC000005:
Access Violation".
Hvis jeg derimod compiler til "release-mode" og kører, ja så
fungere koden fint!
Det giver mig hovedbrud! Mit næste skridt er at begynde at sammenligne
"debug"-assembler-koden med "release"-assembler-koden, for at se om
der
er nogle forskelle.

Kan nogle forklare det ??

/Bo


#include <tchar.h>
#include <iostream>
using namespace std;    

void f(TCHAR* p);
int main( void )
{
   TCHAR*   t = "0000000";

   cout << "Before f(): " << t << endl;
   f(t);

   cout << "After f(): " << t << endl;

   return 0;
}

void f(TCHAR* p) {
   while (*p) {
      *p++ = '1';
   }
   cout << endl;
}

 
 
Jonas Meyer Rasmusse~ (17-06-2002)
Kommentar
Fra : Jonas Meyer Rasmusse~


Dato : 17-06-02 10:07

Hejsa.
"Bo Helleskov" <helleskov@vip.cybercity.dk> wrote in message
news:526d97bb.0206162259.50eb02c7@posting.google.com...
> #include <tchar.h>
> #include <iostream>
> using namespace std;
>
> void f(TCHAR* p);
> int main( void )
> {
> TCHAR* t = "0000000";

Når du opretter et string literal, så kommer det til at ligge i det
dataområde, der kendes som "const data".
I C++ må du ikke modificere data der ligger i dette dataområde.

>
> cout << "Before f(): " << t << endl;
> f(t);
>
> cout << "After f(): " << t << endl;
>
> return 0;
> }
>
> void f(TCHAR* p) {
> while (*p) {
> *p++ = '1';

Da p peger ind i const data området får du sikkert en fejl i denne linie, da
du her prøver at modificere den data som ligger
i "const data" området.

> }
> cout << endl;
> }

Grunden til at du kun får fejlen, er formentligt at VC kun kontrollerer at
du overholder reglerne i debug mode -
i release mode, er denne kontrol fjernet. Da oversætteren så åbenbart lægger
string literalet i et ikke konstant dataområde,
så kan du fint modificere det.

Du kan løse problemet simpelt..
blot erstat

TCHAR* t = "0000000";

med

TCHAR[] t = "0000000";

Dette gør at der bliver oprettet et array på stakken, indeholdende en kopi
af string literalet
i det konstante dataområde.
Dit program vil så køre fint

mvh Jonas



Bo Helleskov (17-06-2002)
Kommentar
Fra : Bo Helleskov


Dato : 17-06-02 18:13

Hej Jonas,

Tak for svaret, jeg fandt ud af det ved at gå
igennem assembler koden. Følgende stod:

CONST   SEGMENT
??_C@_06GEKNBBDK@000000?$AA@ DB '000000', 00H      ; `string'
; Function compile flags: /Odt /RTCsu /ZI
CONST   ENDS

og derfor må jeg selvfølgelig ikke ændre i den.

Tak

Bo

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