Avatar billede tula Nybegynder
24. maj 2004 - 17:29 Der er 18 kommentarer

String med række af tal til float!

Hej!

Jeg tager en række værdier ind fra min seriel port som en String. Det drejer sig om 4 værdier i intervallet 0-99, der er adskilt af et mellemrum. Eksempler:

99 14 56 99
43 89 99 13
32 67 56 78
osv.

Som sagt bliver de indlæst som String med metoden readLine:

public void readLine() {
    String line = null;
    while(true) {
      try {
        line = in.readLine();
        System.out.println(line);
      } catch( IOException e ) {
        error("readLine " + e );
      }
    }
}

Jeg behøver værdierne én for én og konverteret til float-værdier. Dvs. sige at jeg skal kunne sende dem videre enkeltvist som float-værdier. Nogen der har gode forslag?
Avatar billede soreno Praktikant
24. maj 2004 - 17:31 #1
Hvad med at bruge en StringTokenizer til at splitte strengen på mellemrum, så vil hver token være tal som kan konverteres til float med:
float tmp = Float.parseFloat("22");
Avatar billede rasmusbg Nybegynder
24. maj 2004 - 17:37 #2
Du kan bruge en StringTokenizer, hvor mellemrum bliver brugt som adskillelse mellem tokens, og de 4 tokens, du får kan du konvertere til f.eks. int vha. Integer.parseInt(String s).
En implementation kunne se således ud:

int readInt = 0;
String s = "99 14 56 99"
StringTokenizer st = new StringTokenizer(s, " ");
while (st.hasMoreTokens()) {
  readInt = Integer.parseInt(st.nextToken();
  //behandling af readInt
}
Avatar billede rasmusbg Nybegynder
24. maj 2004 - 17:37 #3
Okay ups...float istedet for int ;o)
Avatar billede soreno Praktikant
24. maj 2004 - 17:40 #4
Du får også lige mit eksempel (nu jeg alligevel havde lavet det, det kompilerer endda :-)

import java.util.*;

public class MainTester
{
    public static float[] getFloats(String str)
    {
        StringTokenizer st = new StringTokenizer(str, " ");
        float array[] = new float[st.countTokens()];
        int i = 0;
        while(st.hasMoreTokens())
        {
            array[i] = Float.parseFloat(st.nextToken());
            i++;
        }
        return array;
    }
   
    public static void printArray(float array[])
    {
        for(int i=0;i<array.length;i++)
        {
            System.out.print(array[i] + "\t");
        }
        System.out.println();
    }
   
    public static void main(String[] args)
    {
        printArray(getFloats("99 14 56 99"));
        printArray(getFloats("43 89 99 13"));       
        printArray(getFloats("32 67 56 78"));
    }   
}
Avatar billede soreno Praktikant
24. maj 2004 - 17:47 #5
Oven i hatten får du også lige et svar.
Avatar billede tula Nybegynder
24. maj 2004 - 17:54 #6
Jeg får løbende værdier, ja faktisk værdier ind hver 7 ms. Vil det så stadig fungere? Det virker lidt til, at du samler op åp værdierne og så udskriver tilsidst.
Avatar billede rasmusbg Nybegynder
24. maj 2004 - 17:57 #7
Det er højst sandsynligt hurtigere, end hvad man ellers selv kan lave af krumspring...
Avatar billede soreno Praktikant
24. maj 2004 - 17:58 #8
Min kode illustrerer blot et eksempel på brug af StringTokenizer. Hvordan du optimalt kan flette den ind i din kode kan jeg ikke udtale mig om på baggrund af info.

Hvad skal data bruges til ?
Hvad sker der når data er konverteret til floats ?
Avatar billede tula Nybegynder
24. maj 2004 - 18:03 #9
Dataen skal bruges til at regulere en synth i programmet MAX/MSP. Jeg har allerede lavet synth'en men mangler nu at få den styret af værdierne. Float-værdierne skal altså senden til interfacet mellem Java-programmet og MAX/MSP.
Avatar billede soreno Praktikant
24. maj 2004 - 18:04 #10
Skal de sendes enkeltvis eller hvad ?
Avatar billede tula Nybegynder
24. maj 2004 - 18:06 #11
ja..det tror jeg er bedst. Der er ialt fire synt'er, så det vil være mest hensigtsmæssigt at splitte værdierne op her. Vil du ikke tro det?
Avatar billede tula Nybegynder
24. maj 2004 - 18:11 #12
Det vil også være rart, ligesom at kunne nummere dem, så jeg ved hvilken værdi, der står først, nummer to osv.
Avatar billede soreno Praktikant
24. maj 2004 - 18:13 #13
Hvordan sendes floats til "MAX/MSP" ?
Der må være et metode kald eller hvad ?
Avatar billede tula Nybegynder
24. maj 2004 - 18:18 #14
Ja, de sendes med metoden:

public void doSendOn(float freq, int node)

hvor jeg skal styre frekvensen. Node er nummeret på tonen, som derfor skal være ligemed værdi 1-4, altså svarene til antal værdier fra seriel porten.
Avatar billede soreno Praktikant
24. maj 2004 - 18:22 #15
Så må det være noget ala:

public void readLine() {
    String line = null;
    int channel;
    StringTokenizer st;

    while(true) {
      try {
        channel = 0;
        st = new StringTokenizer(in.readLine(), " ");
        while(st.hasMoreTokens())
        {
            float tmp = Float.parseFloat(st.nextToken());
            doSendOn(tmp, channel);
            channel++;
        }

      } catch( IOException e ) {
        error("readLine " + e );
      }
    }
}
Avatar billede tula Nybegynder
24. maj 2004 - 18:32 #16
Ja, det ser super ud! Du får point...bare lige to sidste spørgsmål. Tror du ikke, at det belaster systemet en anelse, at man skal oprette StringTokenizer objekter for hver værdier, der kommer ind hvert 7 ms. Er der ikke en eller anden måde, man kan "rense" systemt på?
Og så vil eg også lige høre om du har en idé til, hvordan jeg undgår at systemet går istå, hvis der kommer værdier med fejl i? Systemet har lige crashet fordi der kom en værdi efterfulgt af en mystisk firkant.

På forhånd mange tak for hjælpen!
Avatar billede soreno Praktikant
24. maj 2004 - 18:41 #17
Den her metode ser ud til at være noget mere fejltolerant:
import java.util.*;

public class MainTester

    public static void main(String[] args)
    {
        String input = "99 eef f14w 56sse e 99a";
        String values[] = input.split("[^0-9]");
        for(int i=0;i<values.length;i++)
        {
            if(values[i].length() != 0)
            {
                float tmp = Float.parseFloat(values[i]);
                System.out.println(tmp);
            }
        }
    }   
}

Output:
99.0
14.0
56.0
99.0

Men et regulært udtryk er ikke gratis at eksekvere.
Avatar billede tula Nybegynder
24. maj 2004 - 18:45 #18
Tusind tak!
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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Energy Trading Project Manager – Consulting

Arbejdernes Landsbank

Fullstack-udvikler med fokus på AI

Cognizant Technology Solutions Denmark ApS

Test Manager