Inlägg

Inlägg som Gego har skrivit i forumet
Av Gego

[MIPS Assembler] Selection sort

Hej alla glada, jag håller på att göra en Selection Sort i MIPS Assembler och har ett litet problem...
Den skriver ut fel element och sorterar inte alla element.

Vad kan vara för fel?
Kan ni vara vänliga att peka mig i rätt riktning? För jag kan icke se vad som är fel med koden.
(Ursäkta alla nop:ar de är där för säkerhets skull)

assembler koden:
http://pastebin.com/1dUiXpg7

C versionen som jag utgår i från:
http://pastebin.com/bMJDqgP3

ERRETA:

# $t9 innerloop slt -- set to one if innerloop has reached the end. # Do Not Change... # $t8 outerloop slt -- set to one if outerlaap has reached the end. # Do Not Change...

skall vara

# $t8 innerloop slt -- set to one if innerloop has reached the end. # Do Not Change... # $t9 outerloop slt -- set to one if outerlaap has reached the end. # Do Not Change...

( erreta versionen: http://pastebin.com/HnEwJFMK)

Av Gego
Skrivet av Elgot:

Ha, intressant att fel lyckas smyga sig in i så fundamentala språkdetaljer.

Kan även vaar så att .vapi filen hadde en felaktig "post" för Event.poll().... tror jag är mer troligt...
men man vet aldrig...

Av Gego

Jo, det var fel på kodgeneratorn, tankade hem en ny version och hey-presto:

$ make gego@Lappis:~/bzr/invaders_vala$ make valac-0.16 --pkg sdl --pkg sdl-gfx --pkg sdl-image --pkg sdl-ttf -X -lSDL_gfx -X -lSDL_image -X -lSDL_ttf -o bin/invaders src/*.vala src/Game.vala:68.18-68.22: error: Argument 1: Cannot pass value to reference or output parameter Event.poll(event); ^^^^^ Compilation failed: 1 error(s), 0 warning(s) make: *** [all] Fel 1

Och så ändrade jag koden llite:

gego@Lappis:~/bzr/invaders_vala$ make valac-0.16 --pkg sdl --pkg sdl-gfx --pkg sdl-image --pkg sdl-ttf -X -lSDL_gfx -X -lSDL_image -X -lSDL_ttf -o bin/invaders src/*.vala gego@Lappis:~/bzr/invaders_vala$ make run ./bin/invaders Running contructor... quiting...

@Elgot:
Tack så mycket för hjälpen!

Av Gego

Skitsamma... Det kan vara något fel på kod generatorn eller i någon .vapi fil.....

Testade nämigen den koden som finns på gnomes hemsida och där fungerade inte häller Händelse hanteringen.

Av Gego
Skrivet av Elgot:

Jo, det är det jag menar; motsvarigheten till &-tecken i c# är "ref " eller "out " (out-variabler kommer skrivas över och måste därför inte initieras innan de skickas till funktionen). Dock tycker man att din kompilator borde klaga (det gör som sagt min).

$ make valac --pkg sdl --pkg sdl-gfx --pkg sdl-image --pkg sdl-ttf -X -lSDL_gfx -X -lSDL_image -X -lSDL_ttf -o bin/invaders src/*.vala src/Game.vala:68.18-68.26: error: Argument 1: Cannot pass out argument to non-output parameter Event.poll(out event); ^^^^^^^^^ Compilation failed: 1 error(s), 0 warning(s) make: *** [all] Fel 1

och

$ make valac --pkg sdl --pkg sdl-gfx --pkg sdl-image --pkg sdl-ttf -X -lSDL_gfx -X -lSDL_image -X -lSDL_ttf -o bin/invaders src/*.vala src/Game.vala:68.18-68.26: error: Argument 1: Cannot pass ref argument to non-reference parameter Event.poll(ref event); ^^^^^^^^^ Compilation failed: 1 error(s), 0 warning(s) make: *** [all] Fel 1

Av Gego
Skrivet av Teknocide:

Du kör en while-loop runt pollen vilket innebär att du väntar tills där finns ett event.

Nej, så äl det inte, While loopen körs aldrig om det inte fins enhändelse i kön.

I alla fall:
här har vi c-outputen från game.vala: http://paste.ubuntu.com/787670/

@Elgot:

Humm, såhär gör man i allafall i C/C++....

SDL_PollEvent( &event ); switch(event.type){ case SDL_QUIT: isRun = false; printf("exiting?\n"); break; case SDL_KEYDOWN: eventBool[event.key.keysym.sym] = true; break; case SDL_KEYUP: eventBool[event.key.keysym.sym] = false; break; }

skanske skall försöka mig på det...

Edit:
Nope...

private void process_events(){ Event event = Event(); Event.poll(event); switch(event.type){ case EventType.QUIT: stdout.printf("quiting...\n"); this.isRun = false; break; case EventType.KEYDOWN: stdout.printf("keydown\n"); this.eventBool[event.key.keysym.sym] = true; break; case EventType.KEYUP: stdout.printf("keyup\n"); this.eventBool[event.key.keysym.sym] = false; break; } }

hjälpte föga...

Av Gego
Skrivet av Teknocide:

Det ser konstigt ut att du loopar inuti event-metoden då du anropar den från huvudloopen. Även om du hade fått events skulle programmet låsa sig tills du antingen tryckte en tangent, släppte den eller avslutade.

Det är event.poll, inte event.WaitEvent

Skickades från m.sweclockers.com

Av Gego
Skrivet av Elgot:

Är det då Event.poll() som returnerar 0 eller event.type som inte matchas i switch-satsen?

I det exempel som finns på GNOME.org skall det vara event.poll() == 1, men hittade på github någon som använt != 0, som logiskt är samma...

Och inget av dessa varianter fungerar..
Att använda event.poll() utan någon jämförelse är inte något som valac vill vara med om.

Skickades från m.sweclockers.com

Av Gego

lade

SDL.init(SDL.InitFlag.EVERYTHING);

i contruktorn utan att det fungerade...

Av Gego

nej, den körs, helatiden, har testat via att lägga dit en stdout.printf() men det är switch/case:n som inte fungerar....
altså, keydown skrivs inte ut på terminalen...
edit:
Valadocs på SDL:
http://valadoc.org/sdl/index.htm

Av Gego

[Vala][SDL] min händelsehantering fungerar ej...

[FIXAT]
Felet låg i Kodgeneratorn, valac-0.14 fungerar inte, medans valac-0.16 gör det
[FIXAT]

Hej, har börjat att hacka påen port på ett spel som jag har gjort till vala...
men kommer inte så långt: Min händelse hantering vill inte fungera, dvs. jag kan inte stänga proggrammet via att stänga fönstret, jag är tvungen att använda xkill/killall.
Min kod:
http://paste.ubuntu.com/787131/

det är alltså private void process_events() som ite fungerar...

Main.vala:

using SDL; namespace invadersGame{ int main(string[] args){ var g = new invadersGame.Game(); g.mainLoop(); return 0; } }

kompileras med:

valac --pkg sdl --pkg sdl-gfx -X -lSDL_gfx *.vala -o invaders

(vala är designat att vara likt C# och Java, fast kompileras som C kod).

Av Gego

Ok nu vet jag vad det var för fel....
jag hade placerad else satsen efter fel if satts...

void game::removeDeadObjects(){ object::objectVector tempVector; int tmpX; int tmpY; bool explode = false; for(object::objectVector::iterator i = mObjectVector.begin();\ i != mObjectVector.end(); i++ ){ object *tempObj = (*i); if(tempObj->isDead()){ if(tempObj->getClassification() != object::NONE){ tmpX = (*i)->getX(); tmpY = (*i)->getY(); explode = true; } //mObjectVector.erase(mObjectVector.begin() + i); } else { tempVector.push_back(tempObj); } if(explode){ tempVector.push_back(new objectExplotion(tmpX,tmpY)); } } mObjectVector = tempVector; }

skall det vara...

Av Gego

Jag kanse skall göra mig lite mer tydlig:

Jag vill kopiera en voktor till en annan.
Om jag tarbort objekt från vektorn så crashar spelet (Segmenteringnsfel).

froblemet uppstår när jag läggertill objectExplotion och objectExplotion::isDead() retunerar true så crachar spelet, inte för att det retunerar true utan för att det är det sista tillagda objectet i vectorn och då pekar iteratorn på ett icke exesterande objct.

Jag tänkte göra som min lärare visade i sina antekningar som vi fick som hjälp på vägen för att skapa spelet.

Det är altså denhär koden som inte fungerar:

void game::removeDeadObjects(){ int tmpX; int tmpY; bool explode = false; for(object::objectVector::iterator i = mObjectVector.begin();\ i != mObjectVector.end(); i++ ){ object *tempObj = (*i); if(tempObj->isDead()){ if(tempObj->getClassification() != object::NONE){ tmpX = (*i)->getX(); tmpY = (*i)->getY(); explode = true; } mObjectVector.erase(i); if(explode){ printf("a wild explosion!\n"); mObjectVector.push_back(new objectExplotion(tmpX,tmpY)); } } } //mObjectVector = tempVector; printf("mObjectVector size: %i\n", mObjectVector.size()); }

Av Gego

problemet är det att när jag kopierar vektorn så kopieras ingen tingen.
och när jag använder mObjectVector.erase(i) så får jag segmenteringsfel ty jag tar bort ett object och då slutar iteratron fungera.

alltså, dessutom så är den raden kod bort kommenterad...

Av Gego

Program:
ardour

Samples:
sedan finns det mycket ljud paket att köpa/ladda ner gratis...
freesound har CC samples..
soundcloud har också en CC avdelning..

kan alltid kolla in jamendo efter låtar som inte har ND i sin licens.

Av Gego

[c++][vector][g++] Vectorer vill inte bli kopierade/överskrivna?

Hej, jag har ett litet problem, jag kan ite få min vector att kopieras öven en annan och jag har inte en aning om vad som kan vara fel...

min kod ser (i stora drag) likadan ut som exempel koden som jag har, och den skall enligt utsago fungera.

void game::removeDeadObjects(){ object::objectVector tempVector; int tmpX; int tmpY; bool explode = false; for(object::objectVector::iterator i = mObjectVector.begin();\ i != mObjectVector.end(); i++ ){ object *tempObj = (*i); if(tempObj->isDead()){ if(tempObj->getClassification() != object::NONE){ tmpX = (*i)->getX(); tmpY = (*i)->getY(); explode = true; } else { tempVector.push_back(tempObj); } //mObjectVector.erase(mObjectVector.begin() + i); } } if(explode){ printf("a wild explosion!\n"); tempVector.push_back(new objectExplotion(tmpX,tmpY)); } mObjectVector = tempVector; printf("mObjectVector size: %i | tempVector size: %i \n", mObjectVector.size(), tempVector.size()); }

PS. ni kan ignorera printf() koden, den är bara till får debuging..

Av Gego

Tack för ett snabt svar, dock är jag lite förvirrad varför jag måste gör så, har skapat klasser förr som inte behöver detta och de har fungerar bra... ända tills jag lade till movmentVector och classification

i object.cpp finns en konstruktor för object.:

object::object(int Damage, int HitPoints,object::movementVector moveVec,\ object::classification Classification){ // Setting if the object is an enemy (EI: hurts the player) or a friendly. mClassification = Classification; //Set the hitPoints... mHP = HitPoints; // set damage mDamage = Damage; // Set the vector of movment. mMovmentVector = moveVec; // Example: set an objects mX to a random number, and mY to be -25. mX = game::getRandom(640); mY = -25; }

Besynnerligt.

men iallafall det som du postade fungerade i alla fall...

tack ännu en gång....

Av Gego

[c++] g++ tror att jag skapar ett object trotts att jag icke gör det.

hej har ett mysterium som jag hoppas att ni kan hjälpa mig med, jag dar typedef:at en struct och on enum i en klass:

class object{ public: typedef std::vector<object*> objectVector; typedef enum{ENEMY, FRIENDLY} classification; typedef struct movementvector{int x; int y;} movementVector; /* snipp */ object(int Damage, int HitPoints, object::movementVector moveVec,\ object::classification Classification); ~object(); /* snipp */ }

deklarerar en under klass:

objectPlayer::objectPlayer(int Damage, int HitPoints,\ object::movementVector moveVec, object::classification Classification){ /* snipp */ }

men är jag kompilerar så får jag:

src/objectPlayer.cpp: I konstruerare "objectPlayer::objectPlayer(int, int, object::movementVector, object::classification)": src/objectPlayer.cpp:18:78: fel: ingen matchande funktion för anrop av "object::object()" src/objectPlayer.cpp:18:78: anm: kandidater är: src/object.h:21:5: anm: object::object(int, int, object::movementVector, object::classification) src/object.h:21:5: anm: kandidaten förväntade sig 4 argument, 0 fanns src/object.h:10:7: anm: object::object(const object&) src/object.h:10:7: anm: kandidaten förväntade sig 1 argument, 0 fanns make: *** [obj/objectPlayer.o] Fel 1

varför tror g++ att jag försöker att skapa ett object objekt?
och hur fixar jag det?

Av Gego

Ok ignorera mig, det är bara jag som är dum i huvudet...

jag använde en felaktig vector för att kolla om det var slutet på vectorn...

inte bra när man har flera vektorer.... ^_^
skall nog lägga ihop dem till en...

Av Gego

Om det skulle hjälpa er att hjälpa mig så här är lite traces:

Här är min strace:
http://paste.ubuntu.com/771432/

min ltrace (nog inte så viktig):
http://paste.ubuntu.com/771434/

min etrace:
http://paste.ubuntu.com/771437/

Jag vet inte hur man skall utläsa något av dem dock.