String to Integer (Character Probleem)

Status
Niet open voor verdere reacties.

sjoerdvo

Gebruiker
Lid geworden
19 jul 2005
Berichten
23
Hallo
Ik moet voor mijn school een java game maken, alleen nu heb ik een probleem:
Ik moet een een string omtoveren tot een integer, nu heb ik geprobeerd er eentje te maken maar hij geeft telkens dezelfde foutmelding. Ook de leraar wist dit probleem niet te fixen.

De code is:

Code:
public static int ConvertStringToInt(String data)
	{
	    int value = 0;        
	    int length = data.length();
	    fixed([U][COLOR="Red"]char* characters [/COLOR][/U]= data);
	    {
	        for (int i = 0; i < length; ++i)
	        {                    
	            value = 10 * value + ([U][COLOR="Red"]characters[[/COLOR][/U] i ] - 48);
	        }    
	    }
	    return value;
	}

De foutmelding is bij de eerste rode streep:
-Syntax error on Tokens, Delete this Tokens
-characters cannot be resolved

De foumelding bij de 2e streep is ook:
-characters cannot be resolved


Ik heb echt geen idee waarom die characters niet kent, misschien hebben jullie een oplossing


Alvas Bedankt!!!
En fijne feestdagen toegwenst
 
Laatst bewerkt door een moderator:
Waarom gebruik je niet gewoon:

Code:
String stringVariabele = "1";
int intVariabele Integer.valueOf(stringVariabele);

of

String stringVariabele = "1";
int intVariabele Integer.parseInt(stringVariabele);

Of moet je verplicht zelf een StrToInt schrijven?

Even over jouw code..
Doe je echt char*
Of is dat alleen om aan te geven waar de fout zit?

je doet nu dit:
Code:
fixed(char characters = data);
Waar haal je die fixed vandaan? is dat een zelfgeschreven functie?
Je kan niet een hele String (namelijk data) in 1 char verschuilen :D

Daarnaast is 'characters' verderop in de code ineens een array.
Code:
value = 10 * value + (characters[ i ] - 48);
 
Laatst bewerkt:
Waarom gebruik je niet gewoon:

Code:
String stringVariabele = "1";
int intVariabele Integer.valueOf(stringVariabele);

of

String stringVariabele = "1";
int intVariabele Integer.parseInt(stringVariabele);

Of moet je verplicht zelf een StrToInt schrijven?

Nee dat hoeft niet hoor.
Maar hoe kan ik die code die u geeft het beste intergreren in een nieuwe methode dan?
Sorry ik ben nog een beetje noob op dit gebied:o
 
Geef je hele code eens.
En geef ook even aan de plaatsen waar je een String moet converten naar een Int.
 
Geef je hele code eens.
En geef ook even aan de plaatsen waar je een String moet converten naar een Int.

Oke, dat is goed
Ik zal eerst even de situatie uitleggen:
Ik probeer een soort schietspelletje te makenn waarbij jij (gameplayer) een vliegtuigje ben waarmee je andere vliegtuigen moet proberen neer te schieten.

In de hoofdcode staat:

public int getPoints()
{
String puntenString;
int punten;

//pakt het aantal punten in het scorebord
puntenString = db.getItemValue("Pts");

//Hier moet hij worden omgezet naar int//
punten = ConvertStringToInt (puntenString);

return punten;
}

Hiermee worden de punten van het scoreboard afgehaald.
Maar het probleem is dat het scorebord alle waarden in strings heeft staan.
Ik heb het scorebord niet zelf gedefineerd want we maken gebruik van de phonegame package dus daar zat die al in.

Het is belangerijk dat de string omgezet moet worden naar een int omdat ik bijvoorbeeld extra punten erbij wil krijgen als ik een vliegtuig neerschiet.
Dan heb ik een collision in de klasse bullet, en dan moet hij dus punten bij de gameplayer optellen, maar deze zijn wel gewoon int en je kan niet een string met een int optellen

Alvast bedankt voor uw hulp:o
 
Dat zou dan worden:

Code:
    public int getPoints() {
        String puntenString;
        int punten;

        //pakt het aantal punten in het scorebord
        puntenString = db.getItemValue("Pts");

        //Hier moet hij worden omgezet naar int//
        punten = [COLOR="Red"]Integer.valueOf(puntenString);[/COLOR]

        return punten;
    }

Of... je kan onderstaande code implementeren.
Dan heb je een eigen String to Int.

Code:
    public int getPoints() {
        String puntenString;
        int punten;

        //pakt het aantal punten in het scorebord
        puntenString = db.getItemValue("Pts");

        //Hier moet hij worden omgezet naar int//
        punten = ConvertStringToInt(puntenString);

        return punten;
    }

    public int ConvertStringToInt(String data) {
        int value = 0;
        int rekenValue = 0;
        int length = data.length();
        for (int i = 0; i < data.length(); i++) {
            char ch = data.charAt(i);
            //nagaan of de character wel een getal is
            if (Character.isDigit(ch)) {
                //Typecasten naar een integer en er 48 vanaf halen.. omdat hij de ascii waarde van de char pakt.
                rekenValue = (int) ch - 48;
                rekenValue = rekenValue * macht(length - 1);
                value += rekenValue;
                length--;
            }
        }
        return value;
    }

    private int macht(int length) {
        if (length == 0) {
            return 1;
        } else {
            int result = 1;
            while (length > 0) {
                result = result * 10;
                length--;
            }
            return result;
        }
    }

Ik begrijp alleen niet dat de leraar het probleem in de eerst niet zag...
Is dat een doorgewinterde programmeur of een leraar waar ze tegen gezegt hebben.. "jij geeft nu programmeren" ? :D


Owja..
Zou je in het vervolg je code tussen codetags willen zetten? :)
Dat kan je zo doen:

Code:
hier dan regels code
 
Laatst bewerkt:
Haha, ik denk dat hij dat laatste is:cool:

Maar..Als ik de 1e methode van u probeer:
Code:
   public int getPoints() {
        String puntenString;
        int punten;

        //pakt het aantal punten in het scorebord
        puntenString = db.getItemValue("Pts");

        //Hier moet hij worden omgezet naar int//
        punten = Integer.valueOf(puntenString);

        return punten;
    }
Dan geeft hij de foutmelding: cannot convert Integer to int


Dus heb ik de tweede geprobeerd, die werkt gelukkig wel maar der is 1 probleempje:
Volgens mij zit er een fout in de code want ik krijg het volgende
1 vliegtuig heeft de waarde van 100 punten

Als ik er 1 neerhaal staat er keurig 100 punten, maar als ik er 2 neerhaal staat er ineens 1100 punten, en als ik de 3e neerhaal staat er 11100 en ga zo maar door.

Weet u waar deze fout ligt?


Ik waardeer echt dat u mij helpt:thumb:
 
Laatst bewerkt:
Ik denk dat er dan ergens anders een foutje in de code zit.
Want hij geeft een exacte weergave van de string terug die je hem geeft.

Geef je complete code eens, dan kan ik mogelijk zien waar het fout gaat.
 
oke:

De code van de level:
Code:
package vissenkom;

import phonegame.*;
import java.util.*;
import java.lang.*;

/**
 * De Vissenkom is het spel zelf (extends GameEngine!)
 
public class Vissenkom extends GameEngine implements IMenuListener
{
	// de GameItems waarmee we beginnen
             private Vis player;
       	private Controler cnt;
		// geeft score weer
	[B]private GameDashboard db;[/B]
	
	private static final String exitMenuItem = "Exit";
	private static final String[] vissenmenu = { exitMenuItem};
	
	/**
	 * Constructor van spel: maak de start layout.
	 */
	public Vissenkom()
	{
	    super();
	    // grenzen van de wereld
		setBounds(0, 0, 210, 500);
		// mooi blauwgroen.... uhhh.
		setBackgroundColor(0, 0, 190);
		;
		
		// Dashboard maken en plaatsen
		[B]db = new GameDashboard();[/B]
		db.setForegroundColor(255,255,255);
		db.setBackgroundColor(255,0,0);
		db.setSize(100,16);
		[B]db.addItem("Pts", "0!");[/B]
		addGameDashboard(db);
		
		makeMenu(vissenmenu, this);
		// tiles neerleggen
		buildEnvironment();
		
		spawnMonster();
	    
	    // maak de controler voor het neerzetten van Strawberry's
	    cnt = new Controler(this);
	    
	    // maak de Vis, dit is de speler dus 'addPlayer' en niet 'addGameItem'
	    player = new Vis(this);
	    this.addPlayer(player);
	    
       
        this.setPlayerPositionOnScreen(PLAYER_HCENTER | PLAYER_VCENTER);
        this.setPlayerPositionTolerance(0.3, 0.3);
        
	    // start het spel
	    startGame();
	}
	
	public void spawnMonster()
	{
		Monster monster1 = new Monster(this);
		monster1.setDirectionSpeed(270, 2);
		monster1.setPosition(100, 350);
		this.addGameItem(monster1);
	
		
		Monster monster2 = new Monster(this);
		monster2.setDirectionSpeed(270, 2);
		monster2.setPosition(100, 200);
		this.addGameItem(monster2);
	
		Monster monster3 = new Monster(this);
		monster3.setDirectionSpeed(270, 2);
		monster3.setPosition(80, 150);
		this.addGameItem(monster3);
	
		Monster monster4 = new Monster(this);
		monster4.setDirectionSpeed(270, 2);
		monster4.setPosition(80, 150);
		this.addGameItem(monster3);
	
	}

	   
	  
	
	
	/** 
	 * Acties op het menu afhandelen (dat is nu alleen exit).
	 * 
	 * @see phonegame.IMenuListener#menuAction(java.lang.String)
	 */
	public void menuAction(String label)
	{
	    if ( label.equals(exitMenuItem) )
	    {
	        exitGame();
	    } 
	} 
	
	/**
	 * Geef x-positie van speler
	 * 
	 * @return xpos, een int
	 */
	public int getPlayerX()
	{
		return player.getX();
	}
	
	/**
	 * Geef y-positie van speler
	 * 
	 * @return ypos, een int
	 */
	public int getPlayerY()
	{
		return player.getY();
	}
	
	/**
	 * Zet het puntenaantal op het dashboard
	 * 
	 * @param p het totaal aantal punten
	 */
	[B]public void setPoints(int p)
	{
		db.setItemValue("Pts", p+"!");
	}
	
	   public int getPoints() {
	        String puntenString;
	        int punten;

	        //pakt het aantal punten in het scorebord
	        puntenString = db.getItemValue("Pts");

	        //Hier moet hij worden omgezet naar int//
	        punten = ConvertStringToInt(puntenString);

	        return punten;
	    }

	    public int ConvertStringToInt(String data) {
	        int value = 0;
	        int rekenValue = 0;
	        int length = data.length();
	        for (int i = 0; i < data.length(); i++) {
	            char ch = data.charAt(i);
	            //nagaan of de character wel een getal is
	            if (Character.isDigit(ch)) {
	                rekenValue = (int) ch - 48;
	                rekenValue = rekenValue * macht(length - 1);
	                value += rekenValue;
	                length--;
	            }
	        }
	        return value;
	    }

	    private int macht(int length) {
	        if (length == 0) {
	            return 1;
	        } else {
	            int result = 1;
	            while (length > 0) {
	                result = result * 10;
	                length--;
	            }
	            return result;
	        }
	    }[/B]	/**
	 * bouw achtergrond van wereld (tiles) op.
	 */
	private void buildEnvironment()
	{   // get path to tile images
	    String[] imagePaths =
	    { 	"/res/images/tile1.png",
	        "/res/images/tile2.png",
	    };
	    // create map
	    byte[][] map = 
	    {
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	        {0, 0, 0, 0, 0, 0, 0, 0},
	    
	    };
	    
	    // add map
	    this.setTileImages(imagePaths, 10, 10);
	    this.addEnvironmentMap(map, 200, 200);	
	}
	
}

De code van de bullet, deze schiet het vliegtuig af om het vijandelijke toestel neer te halen:

Code:
/*
 * Voorbeeldspel (eigenlijk non-game) voor de studenten van course 4I, ICA, najaar 2005
 *
 */

package vissenkom;

import phonegame.*;
import java.util.*;

/**
 * Een Bullet wordt door de Vis afgevuurd en verdwijnt weer als ie buiten 
 * de wereldgrenzen komt. Doet verder (nog) niks, dus 'pretty useless'!
 * 
 * @author Paul Bergervoet
 * @version 1.0
 */

public class Bullet extends MoveableGameItem
{
	private Vissenkom mygame;
	private int points;
	
	/**
	 * Maak een Bullet op de opgegeven plaats, met kennis van het spel zelf ivm verwijderen
	 * 
	 * @param x De x-positie van de kogel
	 * @param y De y-positie van de kogel
	 * @param vg referentie naar het spel
	 */
	public Bullet(int x, int y, Vissenkom vg)
	{ 	mygame = vg;
		setImage("/res/images/fire_bullet1.png", 9, 20);
	    // plaatsen op de opgegeven positie
	    setPosition(x, y);
	    // snelheid 4, naar rechts
	    setDirectionSpeed(90, 60);
	    startMoving();
	}   

	/**
	 * De kogel verwijdert zichzelf als ie buiten de wereld geraakt.
	 * 
	 * @see phonegame.MoveableGameItem#outsideWorld()
	 */
	
	[B] public void collisionOccured(GameItem collidedItem)
	    { 	
		 if (collidedItem instanceof Monster)
	        { 
			 // geef de punten van het dashboard 
			 	 points = mygame.getPoints(); 
			  // tel de punten bij het scoreboard op
			 points = points + ((Monster)collidedItem).getPoints();
	            mygame.deleteGameItem(collidedItem);
	            //schrijf de punten op het scoreboard
	           mygame.setPoints(points);
	            System.out.println("Vliegtuig neergehaald");
	        } 
	    }
	 [/B]
	public void outsideWorld() 
	{	mygame.deleteGameItem(this);
	}
	//public int getPoints()
	//{	    return points;
	//}
}


In de klasse monster heb ik hem gewoon een waarde van 100 gegeven
Code:
 public Monster(Vissenkom mg)
    { 	// referentie onthouden
        mygame = mg;          
        setImage("/res/images/EnemyAirplane1.png", 25, 26);
        [B]points = 100;[/B]
        startMoving();
         }
de vissenkom = de level waarin de vliegtuigen zich bevinden
De vis=dus de gameplayer, hier het vliegtuig dus
Het Monster= het vijandelijke vliegtuig wat we moeten neerhalen
bullet = hiermee schiet het vliegtuig op het vijandelijke vliegtuig
 
Zet eens een breakpoint bij:

Code:
 points = points + ((Monster)collidedItem).getPoints();
in de class Bullet.
Vervolgens je programma gaan debuggen.

Kijken hoe hij tot de berekening komt.
 
Zet eens een breakpoint bij:

Code:
 points = points + ((Monster)collidedItem).getPoints();
in de class Bullet.
Vervolgens je programma gaan debuggen.

Kijken hoe hij tot de berekening komt.

Oke, dat heb ik gedaan maar ik snap van die debug code echt niks.
Er staan alleen maar cijfertjes, ik ben pas 1e jaars Informatica student

Maar weet u zeker dat daar het probleem ligt?
Want hij haalt die punten wel gewoon goed op want bij het eerste vliegtuig komt er gewoon 100 te staan.

Volgens mij zit het probleem in de methode dat hij de string naar de int convert.
Bij 1 vliegtuig neergehaald heb je 100 punten
en bij 2 vliegtuigen 1100 punten
en bij 3 vliegtuigen 11100.

Hij doet dus elke keer de score die je al heb x 10 en dan die score plus 100.

Of denkt u niet dat daar het probleem ligt?
 
Wil ik het goed kunnen debuggen, dan zou ik graag de code van het hele programma willen.
Je zou ook de projectmap in kunnen pakken met winrar en dan toevoegen aan je post :)

Ik ben ook nog maar 2e jaars informatica ;) en U klinkt zo duur :p
 
Wil ik het goed kunnen debuggen, dan zou ik graag de code van het hele programma willen.
Je zou ook de projectmap in kunnen pakken met winrar en dan toevoegen aan je post :)

Ik ben ook nog maar 2e jaars informatica ;) en U klinkt zo duur :p

Haha ok..:)

Ik heb de workspace ingepakt, ik gebruik eclipse
Je kan de classes vinden in: SjobiAirPlaneWar\src\vissenkom
Overigens heb je wel een Java WTK (Sun Wireless ToolKit) nodig om de game te runnen, want het wordt een telefoon game

Je kan het bestand vinden op:
HTML:
www.sjoerdvo.nl/GoedeWorkspace.rar

Succes ermee, en alvast bedankt
 
Ik zal er vanavond en/of morgen even naar kijken.
Meldt het wel als ik wat heb gevonden :)
 
Heb jij er nog een aparte debugtool bij?
Of draai je het meteen op een telefoon oid?
Want bij mij wil hij de debugger niet opstarten.

(ik ben niet zo'n held met eclipse :p gebruik netbeans)
 
Heb jij er nog een aparte debugtool bij?
Of draai je het meteen op een telefoon oid?
Want bij mij wil hij de debugger niet opstarten.

(ik ben niet zo'n held met eclipse :p gebruik netbeans)


Hahha , nou in eclipse zit een standaard debugger. En vannuit eclipse kan je hem runnen op een virtuele mobiel. Ma, je hebt gelijk eclipse is gewoon een *** programma haha, kreeg hem pas na 3 keer installeren goed werkend icm de wireless toolkit

Als het teveel moeite kost laat dan maar hangen hoor, dan vraag ik het nog wel een keer aan mijn leraar. Ik heb nu tenmiste al een '"half" werkende methode:)
 
Laatst bewerkt:
Eclipse een ***programma? En dat is eerstejaarsstudent informatica? Ga even heel gauw je mond spoelen.

Elke professionele JAVA-programmeur is het erover eens dat Eclipse een uitstekende ontwikkelomgeving is, hetzelfde geldt voor NetBeans. Je kunt een van de programma's beter vinden, maar Eclipse een '***programma' noemen vind ik wel een bizarre diskwalificatie van een in mijn ogen geniaal programma. Als ik JAVA programmeer, doe ik dat in een Eclipse-omgeving, en daar ben ik uiterst tevreden over.

Jouw gebrek aan programmeerkunsten hoef je niet te projecteren op een uitstekende IDE.
 
Eclipse een ***programma? En dat is eerstejaarsstudent informatica? Ga even heel gauw je mond spoelen.

Elke professionele JAVA-programmeur is het erover eens dat Eclipse een uitstekende ontwikkelomgeving is, hetzelfde geldt voor NetBeans. Je kunt een van de programma's beter vinden, maar Eclipse een '***programma' noemen vind ik wel een bizarre diskwalificatie van een in mijn ogen geniaal programma. Als ik JAVA programmeer, doe ik dat in een Eclipse-omgeving, en daar ben ik uiterst tevreden over.

Jouw gebrek aan programmeerkunsten hoef je niet te projecteren op een uitstekende IDE.

Hahha pardon meneer.....:shocked:

Maar het ging me een beetje om dat wij eclipse moeten gebruiken in combinatie met de Sun Wireless toolkit en die gaan niet evengoed samen.
Vooral niet als de leraren bestanden heeft die gemaakt zijn op oudere versies van jdk en het wireless toolkit

Excuses voor het verkeerd formuleren:confused:
 
Laatst bewerkt:
Als je het volgende gebruikt zul je geen foutmelding meer krijgen en moet je niet je eigen methode schrijven om strings te converten naar int's, het hergebruik van code is altijd aan te rade ;)


punten = Integer.parseInt(puntenString);

De valueOf() geeft als type Integer terug, wat niet helemaal hetzelfde is als int, vandaar.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan