Symptomer
Tenk deg følgende.
-
Du oppretter et program som laster inn en byteverdi fra en struktur eller en klasse i Microsoft Visual Studio 2008 Service Pack 1 (SP1).
-
Du aktiverer alternativet /Ox optimalisering eller den /O2 optimalisering.
-
Du kompilere programmet ved hjelp av en release-konfigurasjon for x64 plattform.
I dette scenariet er ikke riktig forskyvningen som genereres for å få tilgang til medlemmet struktur eller klasse-medlem.
Dette problemet oppstår bare når strukturen størrelsen og forskyvningen eller klasse størrelsen og forskyvningen er lik ett av de følgende par:
-
(14,13)
-
(15,13)
-
(22,21)
-
(23,21)
-
(30,29)
-
(31,29)
Løsning
Informasjon om hurtigreparasjon
En støttet hurtigreparasjon er nå tilgjengelig fra Microsoft. Det er imidlertid ment å løse problemet som er beskrevet i denne artikkelen. Bruk den bare på systemer som har dette bestemte problemet. Denne hurtigreparasjonen kan gjennomgå ytterligere testing. Hvis du ikke er alvorlig påvirket av dette problemet, anbefaler vi derfor at du venter på neste oppdateringspakke for Visual Studio 2008 som inneholder denne hurtigreparasjonen.
Hvis du vil løse dette problemet umiddelbart, kontakter du Microsoft Kundestøtte for å få hurtigreparasjonen. For en fullstendig liste over telefonnumre for Microsofts kundestøttetjenester og informasjon om støttekostnader, kan du gå til følgende Microsoft-webområde:
http://support.microsoft.com/contactus/?ws=supportObs! I spesielle tilfeller kan avgifter som vanligvis påløper for oppringinger til kundestøtte kanselleres hvis en Microsoft-tekniker avgjør at en bestemt oppdatering løser problemet. Vanlige kundestøttekostnader gjelder for ytterligere kundestøttespørsmål og problemer som ikke dekkes av den gjeldende oppdateringen.
Forutsetninger
Du må ha Visual Studio 2008 Service Pack 1 installert for å bruke denne hurtigreparasjonen.
Krav om omstart
Du trenger ikke å starte datamaskinen på nytt etter at du har installert denne hurtigreparasjonen.
Informasjon om erstatning av hurtigreparasjoner
Denne hurtigreparasjonen erstatter ikke andre hurtigreparasjoner.
Filinformasjon
Den engelskspråklige versjonen av denne hurtigreparasjonen har filattributtene (eller senere filattributter) som er oppført i følgende tabell. Datoene og klokkeslettene for disse filene er oppført i Coordinated Universal Time (UTC). Når du viser filinformasjonen, konverteres den til lokal tid. Hvis du vil finne forskjellen mellom UTC og lokal tid, kan du bruke kategorien tidssone under dato og klokkeslett i Kontrollpanel.
Filnavn |
Filversjon |
Filstørrelse |
Dato |
Tid |
Plattform |
---|---|---|---|---|---|
C2.dll |
15.0.30729. 4082 |
2,283,320 |
19-mars 2009 |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
2,36 1,656 |
19-mars 2009 |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
3,01 7,528 |
19-mars 2009 |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
1,0 54,520 |
19-mars 2009 |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
799, 032 |
19-Mar-2009 |
05:13 |
x86 |
Løsning
Hvis du vil omgå dette problemet, legger du til én eller flere midlertidige "usignerte char" medlemmer for å øke størrelsen på strukturen eller i klassen til minste multiplum av åtte byte. Hvis du for eksempel utvide 14 byte til 16 byte.
Status
Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen "Gjelder for".
Hvis du vil ha mer informasjon
Hvis du vil ha mer informasjon om terminologi for programvareoppdatering, kan du klikke følgende artikkelnummer for å vise artikkelen i Microsoft Knowledge Base:
824684 beskrivelse av standardterminologien som brukes til å beskrive oppdateringer av Microsoft-programvare
Fremgangsmåte for å gjenskape problemet
-
Opprette et program som heter Test.cpp ved hjelp av følgende kode i Visual Studio 2008 SP1:
typedef struct DskDecimal
{
unsigned char precision;
unsigned char scaleFactor;
unsigned short value[ 5];
unsigned char maxPrecision;
unsigned char maxScaleFactor;
} DskDecimal;
int main()
{
DskDecimal decimal;
decimal.maxScaleFactor = 4;
DskDecimal self = decimal;
return self.maxScaleFactor;
} -
Kompiler programmet ved å bruke følgende kommando:
CL-test.cpp/MD /O2
Det forventede resultatet er 4. Men er faktisk resultatet 0.