Avatar billede oddi Nybegynder
10. november 2008 - 13:16 Der er 12 kommentarer og
1 løsning

int array til streng

Hej Eksperter.

Hvordan får jeg indeholdet fra et int array nemest til en streng.

eks.:

int test[] = {1,0,1,0,1};

Indeholdet af dette array skal ende med at blive til en streng ("{1,0,1,0,1}")

Tak på forhånd Oddi.
Avatar billede oddi Nybegynder
10. november 2008 - 13:18 #1
Jeg glemte at sige at det skal være i c ikke c++
Avatar billede segmose Nybegynder
10. november 2008 - 14:12 #2
Du kunne bruge en passende mængde sprintf og strcat.
Avatar billede oddi Nybegynder
10. november 2008 - 14:40 #3
Jeg har løst det på følgende måde:

#include <stdio.h>

int main()
{
    int a[] = {1,2,3,4,5,6,7,8,9};
 
    int size = (sizeof(a)/4)+2+(sizeof(a)/4-1);

    char buf[size];
    char *ptr;
    int i;

    ptr = buf;

    buf[0] = '{';

    ptr++;

    for(i = 0; i < (sizeof(a)/4); i++)
    {
        sprintf(ptr, "%d", a[i]);
        ptr++;
        sprintf(ptr, "%s", ",");
        ptr++;
    }

   
    buf[size-1] = '}';

    printf("%s\n", buf);

    return 0;

}

Hvis nogen har et bedre forslag, eller forbedringer til det jeg har gjort, vil jeg være meget taknemlig!
Avatar billede oddi Nybegynder
10. november 2008 - 14:42 #4
Der er f.eks en "bug" hvis f.eks a[] = {10,20,30,40} vil printf udskrive: {1,2,3,4}...
Avatar billede segmose Nybegynder
10. november 2008 - 14:49 #5
udskift den midterste ptr++ med
I size skal den første (sizeof(a)/4) skal ganges med det maximale antal cifre i tallet.

while (*(++ptr)); // skip to zero termination
Avatar billede arne_v Ekspert
10. november 2008 - 15:04 #6
#include <stdio.h>

int main()
{
    int i;
    int a[] = {1,22,333,4444,55555,666666,7777777,88888888,999999999};
    int size = 11*sizeof(a)/sizeof(int)+3;
    char buf[size]; // requires a C99 compliant compiler
    char *ptr = buf;
    *ptr = '{';
    ptr++;
    for(i = 0; i < sizeof(a)/sizeof(int); i++)
    {
        ptr += sprintf(ptr, "%d", a[i]);
        ptr += sprintf(ptr, "%s", ",");
    }
    ptr--;
    *ptr = '}';
    printf("%s\n", buf);
    return 0;
}
Avatar billede oddi Nybegynder
10. november 2008 - 15:06 #7
Tusind tak arne_v! Smid et svar
Avatar billede arne_v Ekspert
11. november 2008 - 04:14 #8
ok
Avatar billede oddi Nybegynder
11. november 2008 - 08:47 #9
Nu har jeg accepteret dit svar. Men lige det sidste spørgsmål: Vil I/Du mene at det er en effektiv måde at løse dette på?
Avatar billede segmose Nybegynder
11. november 2008 - 10:19 #10
Jeg vil mene det er en rimelig måde at løse problemet på (under antagelse af:
- at der ikke ske nogen fejl i sprintf
- det ikke er bundet til en bestemt cpu arkitektur
- int altid er 32 bit (11-tal skal ændres hvis ikke)
- C99 kan omgåes ved en new, husk fejl check.
- programmet kun kaldes få gange med små data set.
- at
        ptr += sprintf(ptr, "%d", a[i]);
        ptr += sprintf(ptr, "%s", ",");
udskiftes med
        ptr += sprintf(ptr, "%d,", a[i]);
  sparer et funktions kald

Hvis programmet her var en funktion kunne man køre en profiler på det og se om her bruges for meget tid i den.

Hvis det var tilfældet kan man gå videre og kikke på indholdet af funktionen.
Se på sprintf som er en generel funktion til formatering og lave en egen version af den som er specialliceret til int. Jeg ville estimere at man kunne speede den op med en faktor 2 ved at gå fra generel til specialiseret.

En yderligere specialisering ved at gå fra kald til inline spare yderligere noget stack administration (push og pop af adresser, push af argumenter, pop af retur værdi) og med det korte kald af funktionen bliver det måske en faktor 1,5 til 2.

For løkkens hastighed er begrændset af at næste iteration er afhængig af den tidligere gennem opdateringen af ptr, dette skjules måske af kald til sprintf, hukommelses tilgang og cpu arkitektur.

Ved rigtig store data set kan må så splitte det op mellem 2 eller flere cpu'er, det kræver dog noget mere arbejde og er ikke direkte understøttet af C. Data settet splittes i X lige store dele og køre det på X cpu, de færdige char arrays lægges derefter sammen.

Ved rigtig tids eller plads kritiske funktioner kan man også overveje:
- Er dette den rigtige måde at løse problemet på.
- Hånd optimeret assembler kode.
- Hvad er omkostningerne ved at lave bedre kode i forhold til at købe større computer.

Også målet for koden har indflydelse på om det er godt nok:
- Til windows programmer er den vigtigste parameter at det går hurtigt at skrive, tid og plads forbrug er ligegyldige kunden kan bare købe en større computer. Features er vigtigere end hastighed, plads og korrekthed.
- Til forbruger elektronik er det din omkostning at sætte større cpu og mere ram i, så her tænkes meget mere på plads, tid og korrekthed, da det koster at lave fejl.
- Til kritiske applikationer tænkes først og fremmest på indbygget korrekthed, funktionen skal også være færdig på en forud defineret tid, plads er vigtig fordi plads er også tid.
- Til videnskabelige/visse økonomiske/databaser tænkes meget på  korrekthed og hastighed,en del på plads hvor plads helst skal begrændses da plads er tid.
- Til spil tænkes først på hastighed, nogenlunde korrekthed, og plads er noget man som regel bare har ellers må brugeren opgraderer.

Dette var ordene eller de første tanker :)
Avatar billede oddi Nybegynder
11. november 2008 - 10:53 #11
Tak for dit svar segmose! Denne funktion bliver brugt i noget embedded system, de arrays som skal konverteres til en streng, er heldigvis ikke ret store, så denne løsning er udmærket, ligebortset fra at jeg laver:

        ptr += sprintf(ptr, "%d,", a[i]);

istedet for:

        ptr += sprintf(ptr, "%d", a[i]);
        ptr += sprintf(ptr, "%s", ",");

Hvis du vil ha' point vil jeg gerne oprette et ny spg. og acceptere dit svar.

Mvh Oddi
Avatar billede segmose Nybegynder
11. november 2008 - 11:46 #12
Hvis size er en const eller du har meget få varianter over den kan du måske erstatte hele funktionen med et kald med sprintf og en lang format felt.

Skal vi ikke bare sige at det er fint :)
Avatar billede oddi Nybegynder
11. november 2008 - 11:54 #13
Ok, tak for det :)
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