[C]Int naar chararray in rtlinux

Pagina: 1
Acties:

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 23:45
Hallo allemaal,

ik zit met een probleempje. In non-realtime C weet ik precies hoe ik de waarde van een integer in een chararray moet zetten (dus 445 naar "445").

Het probleem is dat de standaard functies die in dan gebruik (sprintf, itoa e.d.) niet werken in realtime linux C. Deze kan alleen rtlinuxfuncties gebruiken.

Ook heb ik het op de volgende manier geprobeerd:
C:
1
2
int integer = 1;
char * test = "" + integer;


Dit werkt ook niet, krijg het zelfs zo dat het complete systeem dan vastloopt.

Het nadeel is dat, voor zover ik weet, er geen standaard rtlinux alternatief is voor sprintf of itoa.

Ik heb het chararray nodig voor rtf_put(). Deze functie schrijft naar een eerder aangemaakt FIFO en heeft perse een chararray nodig voor de data.

Iemand een oplossing?

[ Voor 20% gewijzigd door RvL op 13-06-2006 11:58 ]

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

RvL schreef op dinsdag 13 juni 2006 @ 11:56:

Ook heb ik het op de volgende manier geprobeerd:
C:
1
2
int integer = 1;
char * test = "" + integer;
Zo werkt C inderdaad niet. Als je geen itoa() en sprintf() e.d. hebt zul je die zelf moeten implementeren of de code ervan overnemen uit libc. itoa() mag niet al te moeilijk zijn.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:20
erm ... rtl_printf ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RvL
  • Registratie: Maart 2002
  • Laatst online: 23:45
rtl_printf is hetzelfde als printf en toont een string op het beeldscherm. Zou zo niet weten hoe ik dit moet gebruiken om een int in een chararray te proppen.

Ik zal inderdaad eens kijken naar het omzetten van itoa()

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik vraag me af wat je belet om het zelf te doen. Ik neem aan dat je als programmeur toch wel het een en ander weet... (hoewel die char* + int me er toch aan doet twijfelen...)

C:
1
2
3
4
5
6
7
8
9
10
11
12
char* itoa(int n)
{
  int nchars = ceil(log(n))+1;
  char* ret = (char*)malloc(nchars);
  for (int i = 0; i < nchars-1; i++)
  {
     ret[nchars-2-i] = n%10;
     n /= 10;
  }
  ret[nchars-1]=0;
  return ret;
}


uit de losse pols.
Dit is normale C, misschien moet je die wiskundige functies en memory alloc omzetten of op een andere manier implementeren.

ASSUME makes an ASS out of U and ME


  • RvL
  • Registratie: Maart 2002
  • Laatst online: 23:45
Ik ben nog geen volleerd programmeur, laat daar geen twijfel over bestaan. Ik studeer TI aan Avans en dit is het eerste project wat wij in rtlinux doen.

Men heeft ons ook (nog?) niet geleerd om dergelijke zaken zelf te schrijven, onder het mom van het wiel niet opnieuw uitvinden. Tel daar een nog vrij gebrekkige kennis van c/c++ bij op and there you have it ;)

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025

Ivo

Het wiel heruitvinden? Dit zijn vingeroefeningen.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
HIGHGuY schreef op dinsdag 13 juni 2006 @ 22:54:
ik vraag me af wat je belet om het zelf te doen. Ik neem aan dat je als programmeur toch wel het een en ander weet... (hoewel die char* + int me er toch aan doet twijfelen...)

C:
1
2
3
4
5
6
7
8
9
10
11
12
char* itoa(int n)
{
  int nchars = ceil(log(n))+1;
  char* ret = (char*)malloc(nchars);
  for (int i = 0; i < nchars-1; i++)
  {
     ret[nchars-2-i] = n%10;
     n /= 10;
  }
  ret[nchars-1]=0;
  return ret;
}

uit de losse pols.
Ergens heb ik het vermoeden dat een RTOS zonder sprintf ook geen ceil en log heeft. Dat zijn allemaal vrij complexe functies vanwege floating point support. Bovendien lek je memory en gebruik je ook nog eens malloc. Signed werkt niet, log(0) is onbepaald, ceil(log(1)) + 1 = 1 ipv 2 sizeof("1"), je mist een + '0' achter (n%10), en dan durf ik niet te zeggen dat ik alle problemen heb.

Het kan overigens wel goed:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* out should be big enough - caller can figure it out or just allocate enough */
char* rtl_itoa(int n, char* out)
{
  if (n<0) { out[0] = '-'; n = -n; ++out } /* sign */
  int nchars = 1;
  /* How many digits? */
  int n2 = n;
  while ( n2 > 10) {
    n2 /= 10;
    nchars += 1;
  }
  /* Fill from the end */
  for (int i = 0; i  != nchars; i++)
  {
     out[nchars-i] = '0'+ n%10; /* 012345789 is contiguous */
     n /= 10;
  }
  ret[nchars]=0;
  return out + nchars + 1;
}

[ Voor 8% gewijzigd door MSalters op 13-06-2006 23:54 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je bedoelt trouwens out[nchars-i-1] op regel 15 (je schrijft nu positie 1 t/m nchars).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Coca-Cola
  • Registratie: Maart 2001
  • Laatst online: 21:26
C:
1
2
3
4
5
6
7
8
char* itoa(int val, int base = 10)
{
        static char buf[32] = {0};
        int i = 30;
        for(; val && i ; --i, val /= base)
            buf[i] = "0123456789abcdef"[val % base];
        return &buf[i+1];
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:20
RvL schreef op dinsdag 13 juni 2006 @ 22:39:
rtl_printf is hetzelfde als printf en toont een string op het beeldscherm. Zou zo niet weten hoe ik dit moet gebruiken om een int in een chararray te proppen.
Ik zal inderdaad eens kijken naar het omzetten van itoa()
Eerm sorry niet goed gelezen. Je zou natuurlijk ( als dat mogelijk is ) de info naar een linux process kunnen brengen en daar je ding doen.

Mag ik vragen waarom je die info als string nodig hebt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Coca-Cola schreef op woensdag 14 juni 2006 @ 07:47:
C:
1
2
3
4
5
6
7
8
char* itoa(int val, int base = 10)
{
        static char buf[32] = {0};
        int i = 30;
        for(; val && i ; --i, val /= base)
            buf[i] = "0123456789abcdef"[val % base];
        return &buf[i+1];
}
val moet hier unsigned zijn, of je moet negatieven goed afhandelen :). Bovendien is hij niet thread-safe, en heeft het nog wat andere implicaties (Show2Strings(itoa(23), itoa(465));)

[ Voor 14% gewijzigd door .oisyn op 14-06-2006 11:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

MSalters schreef op dinsdag 13 juni 2006 @ 23:50:
[...]

Ergens heb ik het vermoeden dat een RTOS zonder sprintf ook geen ceil en log heeft. Dat zijn allemaal vrij complexe functies vanwege floating point support. Bovendien lek je memory en gebruik je ook nog eens malloc. Signed werkt niet, log(0) is onbepaald, ceil(log(1)) + 1 = 1 ipv 2 sizeof("1"), je mist een + '0' achter (n%10), en dan durf ik niet te zeggen dat ik alle problemen heb.

Het kan overigens wel goed:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* out should be big enough - caller can figure it out or just allocate enough */
char* rtl_itoa(int n, char* out)
{
  if (n<0) { out[0] = '-'; n = -n; ++out } /* sign */
  int nchars = 1;
  /* How many digits? */
  int n2 = n;
  while ( n2 > 10) {
    n2 /= 10;
    nchars += 1;
  }
  /* Fill from the end */
  for (int i = 0; i  != nchars; i++)
  {
     out[nchars-i] = '0'+ n%10; /* 012345789 is contiguous */
     n /= 10;
  }
  ret[nchars]=0;
  return out + nchars + 1;
}
zoals ik al zei:
uit de losse pols. eerder een proof of concept dan een werkende implementatie

ASSUME makes an ASS out of U and ME

Pagina: 1