Avatar billede the_saint Nybegynder
23. februar 2005 - 12:16 Der er 11 kommentarer og
1 løsning

Access violation at adress. bla bla.

Hej..
Er ved at lave et program, som modtager noget data fra com porten.
Den modtager dataen som den skal, og alt virker som om det fungere..
Men... Når programmet når til den sidste '}' i min kode til timeren, så får jeg en access violation. "Access violation at address 008F6F1D. Write of address FFFFFF65"..
Min kode:

void __fastcall TfrmMain::tmrDoLogTimer(TObject *Sender)
{
    //  Vejret vejr; //Opretter et nyt objekt af classen Vejret
        //Henter aktuel tid
        time_t tmtTime;
        struct tm *ts;
        tmtTime = time(NULL);
        ts = localtime(&tmtTime);
        sprintf(vejr.Dato, "%u-%u-%u", ts->tm_mday, ts->tm_mon + 1, ts->tm_year + 1900);
        sprintf(vejr.Tid, "%u:%u:%u", ts->tm_hour, ts->tm_min, ts->tm_sec);

        InitModtag();
        vejr.SetLabels();
        vejr.Tick();
        if(vejr.IsLoggin == TRUE)
        {
                if(vejr.Ticks == (atoi(vejr.LogInterval) * 100))
                {
                        vejr.DoLog();
                        vejr.SaveLog();
                        vejr.Ticks = 0;
                }
        }
} //Efter denne linje får jeg fejl.


Hvis jeg udkommentere InitModtag(); så virker den fint.
Min InitModtag():

      void InitModtag()
        {
                char chrChar;
                char chrString[30] = "";
                char chrLog[3] = "";
                int i = 0, x = 0, y = 0;;
                unsigned long int ByteTransferred;
                        do
                        {
                                do
                                {
                                        ReadFile(CommPortHandle,&chrChar,1,&ByteTransferred,NULL);
                                }while(!ByteTransferred);
                        }while(chrChar!='{');
                        do{
                                do{
                                        ReadFile(CommPortHandle,&chrChar,1,&ByteTransferred,NULL);
                                }while(!ByteTransferred);
                                        chrString[i] = chrChar;
                                i++;
                        }while(chrChar!='}');

                        for(i = 0;i < strlen(chrString);i++)
                        {
                                        if(chrString[i] != ',' && chrString[i] != '}')
                                        {
                                                chrLog[x] = chrString[i];
                                                x++;
                                        }
                                        else
                                        {
                                                if(y == 0)
                                                {
                                                        vejr.Grader = atoi(chrLog);
                                                }
                                                else if(y == 1)
                                                {
                                                        vejr.Luft = atoi(chrLog);
                                                }
                                                else if(y == 2)
                                                {
                                                        vejr.Vind = atoi(chrLog);
                                                }
                                                strcpy(chrLog, "    ");
                                                y++;
                                                x = 0;
                                        }
                        }
        }


Den skriver værdien korrekt, og jeg ved at de også bliver skrevet til mine Label felter...
Avatar billede arne_v Ekspert
23. februar 2005 - 12:22 #1
Du kalder strlen(chrString) uden at den nødvendigvis har en termirende nul byte.
Avatar billede arne_v Ekspert
23. februar 2005 - 12:23 #2
}while(!ByteTransferred);
                                        chrString[i] = chrChar;
                                        chrString[i+1] = '\0';
                                i++;
                        }while(chrChar!='}');
Avatar billede arne_v Ekspert
23. februar 2005 - 12:24 #3
Jeg vil måske også være lidt bekymret for om x kan blive større end 2
Avatar billede the_saint Nybegynder
23. februar 2005 - 12:37 #4
Hvis jeg kører igennem scriptet, så ser alt korrekt ud..
Den har de korrekte værdier..
Avatar billede the_saint Nybegynder
23. februar 2005 - 12:46 #5
chrString indeholder: "0,6,2}\0\0\0..." -> når den nå til forløkken
strlen retunere værdien 6, hvilket også er korrekt.
x får aldrig en værdi over 0, da alle cifre er 1 tegn, (de kan komme op på max 2 tegn)...
Og den ligger værdierne ind i min classe korrekt.
Avatar billede the_saint Nybegynder
23. februar 2005 - 12:51 #6
!!! :D
Hvis jeg udkommentere:
strcpy(chrLog, "    ");
i min funktion virker det, hvad kan jeg gøre der for at nulstille variablen..
Har prøvet med strcpy(chrLog, '\0') - der får jeg også en access violation :(
Avatar billede the_saint Nybegynder
23. februar 2005 - 12:53 #7
Det virker!!! :D
Men, vil stadig godt have en lidt pænere funktion til at nulstille variablen..
Istedet for 4 x " ", bruger jeg nu kun 2, det virker? (Underligt)
Avatar billede arne_v Ekspert
23. februar 2005 - 13:00 #8
"  " (altså 3 mellemrum) er jo 4 tegn p.g.a. den terminerende nul byte
og strLog er jo kun 3 tegn
Avatar billede arne_v Ekspert
23. februar 2005 - 13:01 #9
Jeg tror at du skal ændre størrelsen af den til 4 og strcpy'e de 3 mellemrum.
Avatar billede arne_v Ekspert
23. februar 2005 - 13:02 #10
Hvis du ikke har brug for den terminerende nul byte kan du memset'e de
3 bytes til ' '.

Hvis den ikke behøver have længden 3 kan du strcpy'e "".
Avatar billede the_saint Nybegynder
23. februar 2005 - 13:23 #11
Smider du et svar? :)
Avatar billede arne_v Ekspert
23. februar 2005 - 13:31 #12
ok
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