Avatar billede leoprd Nybegynder
28. august 2002 - 13:03 Der er 12 kommentarer og
1 løsning

Hvad er i vejen med dette stykke kode ?

jeg sidder og leger i c++ og lige nu forsøger jeg at lave et meget simpelt starfield som scroller fra venstre mod højer.

men allerede inden jeg får udskrevet mine "stars" på skærmen får jeg denne fejl
"Unhandled exception in main.exe: 0xC0000005: Access Violation"

#include <iostream>
#include "grafix.h"

using namespace std;


struct STAR
{
    int    posx,
        posy,
        speed;
};


void main()
{
    open_window(400, 400, "S t a r f i e l d");

    STAR star[1000];   
   
    int n = 0;
   
    while (n<1000)
    {
        n++;
        star[n].posx = rand()%400;
        star[n].posy = rand()%400;
        star[n].speed = (rand()%3) + 1;
    }       

    get_char();
}

hvad er der galt!

på forhånd tak !
Avatar billede chries Nybegynder
28. august 2002 - 13:09 #1
det må være din open_window eller get_char() der fejler.

Er det noget "dos" gfx bibliotekter du bruger ? de virker muligvis ikke under windows 8især w2k/nt), da de plejer at skrive direkte på hukommelses adresser.
Avatar billede disky Nybegynder
28. august 2002 - 13:09 #2
den første fejl ( er dog ikke skyld i dit problem) er at du ikke bruget en 'antal' variable til antallet af stjerne, det giver altid problemmer at glemme det :)
Avatar billede chries Nybegynder
28. august 2002 - 13:12 #3
damn, jeg fangede ikke den med n++ før den bliver brugt (1-1000, istedet for 0-999) :-) jeg er ved at blive gammel.
Avatar billede chries Nybegynder
28. august 2002 - 13:12 #4
while (n<1000)
    {
        star[n].posx = rand()%400;
        star[n].posy = rand()%400;
        star[n].speed = (rand()%3) + 1;
        n++;
    }
Avatar billede disky Nybegynder
28. august 2002 - 13:15 #5
chries:
Du er da ikke gammel, du er kun lige holdt op med at være teenager :)

p.s. Hils Lars og rødderne
Avatar billede soepro Nybegynder
28. august 2002 - 13:24 #6
Problemet er dit while loop - den kører een gang igennem loopet med værdien 1000, fordi du starter dit loop med at tælle en op. (N starter på 1 og ender på 1000 - men i C er starter indexes fra 0, dvs. 0-999.)

Du skal flytte n++; til bunden af din while løkke:

#define arraySize(x) sizeof(x)/sizeof(x[0])
n = 0;
while (n < arraySize(start))
{
  :
  n++;
};

Ved at tage størrelsen (i bytes) af hele tabellen, og dividere med størrelsen (i bytes) af eet element, får du antallet af elementer i tabellen. Hvis du udvider star til f.eks. 2000 elementer, vil koden så stadig virke, uden at du aktivt retter i den.
Avatar billede disky Nybegynder
28. august 2002 - 13:27 #7
soepro:
Det var da godt nok en besværlig måde at holde styr på størrelsen

Hvorfor ikke bare bruge:

#define antal=1000

Så skal man ikke først til at analysere din define, når en anden person om 6 måneder skal rette fejl i koden.

Keep it simple.
Avatar billede leoprd Nybegynder
28. august 2002 - 13:27 #8
Ahh! DOW ja det er jo ikke til at tage fejl af tak soepro!
Avatar billede disky Nybegynder
28. august 2002 - 13:28 #9
Imponerende

Chries kommer med løsningen, soepro sammensætter mit og chries svar og får point.

Nåå ja, chries havde ikke givet noget svar, men lidt snyd vil jeg da mene det er.
Avatar billede chries Nybegynder
28. august 2002 - 13:33 #10
lige en advarsel om brug af sizeof på array's. Den returner forskellige værdier afhæning af, om det er et array der kommer fra et kald eller en erklæring.

#include "stdafx.h"
#include <iostream.h>

void func( char array[] )
{
    cout << "func: " << sizeof( array ) << endl;
}

void main()
{
    char array[32];

    cout << "main: " << sizeof( array ) << endl;
   
    func( array );
}

output:
main: 32
func: 4
Avatar billede soepro Nybegynder
28. august 2002 - 13:39 #11
cries >> Og det er selvfølgelig det endegyldige argument for at benytte const int tblSize = 1000; og char array[tblSize]; samt while (n < tblSize) i stedet for mit bud. Det tager jeg til efterretning !
Avatar billede soepro Nybegynder
28. august 2002 - 13:40 #12
Pga. den tid det tager at flette et ordentligt svar sammen, kan der godt nå at være kommet andre svar, mellem man ser det tomme spørgsmål og får sendt sit eget svar - jeg er ked af hvis du synes jeg "stjal" point fra jer - men det er jo ikke mig der deler ud !
Avatar billede disky Nybegynder
28. august 2002 - 13:49 #13
soepro:
Jeg er skam ligeglad, jeg kommenterede alligevel kun den med de '1000'
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