Newsgroup: it.comp.lang.c++
Titolo: Comportamento assurdo... mi si è bevuto il linker!!! :((

Salve! Mi è appena successa una cosa che ha dell'assurdo!! Non so come, non
so perché, mi è "scoppiato" il vc6 sotto gli occhi!!
Precisamente, stavo facendo delle prove coi puntatori a funzioni membro. Il
codice di prova che ha causato il tutto è il seguente:
class Foo
{
public:
 int bar(int i){cout<<"int bar(int)"<<endl;return i;}
 int bar(int i)const{cout<<"int bar(int) const"<<endl;return i;}
 int bar(int& i){cout<<"int bar(int&)"<<endl;return i;}
 int bar(int& i)const{cout<<"int bar(int&) const"<<endl;return i;}
 int bar(const int& i){cout<<"int bar(const int&)"<<endl;return i;}
 int bar(const int& i)const{cout<<"int bar(const int&) const"<<endl;return
i;}
};
typedef int (Foo::*Int)(int);
typedef int (Foo::*Int_C)(int)const;
typedef int (Foo::*IntR)(int&);
typedef int (Foo::*IntR_C)(int&)const;
typedef int (Foo::*CIntR)(const int&);
typedef int (Foo::*CIntR_C)(const int&);
void main()
{
 Foo foo;
 Int i;
 Int_C i_c;
 IntR ir;
 IntR_C ir_c;
 CIntR cintr;
 CIntR_C cintr_c;
 (foo.*i)(10);
}
... Vado a compilare ed eseguire e...... come per magia lo schermo diventa
completamente nero e il pc si blocca. Resetto brutalmente il pc, riavvio,
riapro il vc6, cancello il precedente listato e provo a compilare ed
eseguire un codice col solo main vuoto. E.... Sorpresa delle sorprese, ecco
cosa mi rimprovera il compilatore:
Compiling...
main.cpp
Linking...
LINK : error : Internal error during ReadSymbolTable
  ExceptionCode            = C0000005
  ExceptionFlags           = 00000000
  ExceptionAddress         = 10312EA4
  NumberParameters         = 00000002
  ExceptionInformation[ 0] = 00000000
  ExceptionInformation[ 1] = 009F0000
CONTEXT:
  Eax    = 009EF01C  Esp    = 006CF0B0
  Ebx    = 009EF020  Ebp    = 006CF0D4
  Ecx    = 00001C88  Esi    = 009F0000
  Edx    = 00008200  Edi    = 008F8078
  Eip    = 10312EA4  EFlags = 00010202
  SegCs  = 00000247  SegDs  = 0000024F
  SegSs  = 0000024F  SegEs  = 0000024F
  SegFs  = 000046C7  SegGs  = 00000000
  Dr0    = 006CF0B0  Dr3    = 009EF020
  Dr1    = 006CF0D4  Dr6    = 00001C88
  Dr2    = 00000000  Dr7    = 00000000
Error executing link.exe.
Tool execution canceled by user.
... Ha dell'incredibile!! Possibile che quel *quasi* innocente codice che ho
riportato all'inizio abbia potuto fare una mostruosità del genere???
Scusate la lunghezza, ma sto disperando, per non dire altro!!
--
"Solo gli idioti non hanno dubbi."
"Ne sei sicuro?"
"Certo."
Georges Courteline

 ...
Thanks to God il problema del linker bevuto si č auto-risolto (mha!) ...
resta il fatto che la schermata nera con tanto di PC "congelato" ha comunque
dell'assurdo! Qualcuno mi sa spiegare il perché di ciň che č accaduto ??
Grazie.

 LINK : error : Internal error during ReadSymbolTable
[...]
reinstalla Visual C++. Mi sa di librerie standard rovinate. Nel crash a 
qualche file oggetto potrebbero essere stati alterati dei campi, che 
ora puntano su Marte e mandano in crash il linker. Su che sistema sei? 
se puoi, passa alla famiglia NT e al filesystem NTFS
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

  (foo.*i)(10);
	Ma i dove e' stato inizializzato? Se usi puntatori non inizializzati lo
schermo nero mi pare il minimo...
_dave_

 Ma i dove e' stato inizializzato?
void main()
{
 Foo foo;
 Int i; // <--- qui !
 [...]

 wrote

Me ne sono reso conto adesso!! Ma quanto sono idiota da 1 a 9999 ??? Non ho
inizializzato i !!! Sorry!! ... by the way, può essere che si generi tutto
'sto pandemonio per una mancata inizializzazione ??? mha! Cià

 
Compilato con gcc ed eseguito nulla di anormale :)
[yeaha@localhost tmp]# c++ prova.cpp -Wall -o prova
prova.cpp:22: return type for `main' changed to `int'
prova.cpp: In function `int main (...)':
prova.cpp:25: warning: unused variable `int (Foo::*i_c) (int) const'
prova.cpp:26: warning: unused variable `int (Foo::*ir) (int &)'
prova.cpp:27: warning: unused variable `int (Foo::*ir_c) (int &) const'
prova.cpp:28: warning: unused variable `int (Foo::*cintr) (const int &)
'
prova.cpp:29: warning: unused variable `int (Foo::*cintr_c) (const int
&)'
Forse il problema e' dovuto a qualche corruzione del filesystem a
seguito del reboot

 generi tutto 'sto pandemonio per una mancata inizializzazione ??? mha!
benvenuto nel mondo dell'undefined behaviour. In genere si usa dire 
scherzosamente che "quando capita un undefined behaviour puo` succedere 
di tutto, compresa la formattazione del tuo disco fisso": in questo caso 
pare che tu ci sia andato molto vicino :-))
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it