Avatar billede skwat Praktikant
17. januar 2007 - 13:28 Der er 8 kommentarer og
1 løsning

va_list AnsiString null - hjælp

jeg har lavet en hjælpe metode som skal gemme nogle strenge til strenge.
AnsiString EncodeList( AnsiString strSep, ... )
{
AnsiString strOutput;
va_list ap;
va_start( ap, strSep );
char* cArg;
while (  ( cArg = va_arg( ap, char* ) ) != 0x00 )
{
  AnsiString strCurrentValue = cArg;
  strOutput    += EncodeTagString( strCurrentValue );
  strOutput    += strSep;
};
va_end(ap);
return strOutput;
}

Mit problem er så når man så kalder denne metode som eks.

EncodeList("^", "1","2","","3", 0x00 );

Får man kun "1^2^" tilbage og ikke "1^2^^3^" som egentligt var forventet.

Altså "" bliver opfattet som null, er der nogen der har en workaround til det? Eller er der noget jeg har misforstået.
Avatar billede segmose Nybegynder
17. januar 2007 - 14:29 #1
Bjarne skriver i sin forkyndelse:
for(;;) {
  char *p = va_arg(ap, char*);
  if (p == 0) break;
  cerr <<< p << ' ';
}
Hvilket ligner hvad du skriver temlig meget.

Du skulle vel ikke køre en MS compiler til 64 bit?
Avatar billede skwat Praktikant
17. januar 2007 - 14:41 #2
nope, det er en borland til 32bit pingvin os
Avatar billede skwat Praktikant
17. januar 2007 - 15:41 #3
men jeg fatter ikke en lyd af hvad det er du forsøger at fortælle mig ;)
Avatar billede noerbo Nybegynder
17. januar 2007 - 16:52 #4
Jeg har ikke før set AnsiString så vil ikke ligge hovedet på blokken, men vil tro at dit problem ligger i at de ligesom arrays af chars ender på null. Dvs "" har ingen elementer og derfor er der 0 element null.

  Men kan ikke lige sige, hvordan det kan løses. Måske ved at sende antallet af elementer i stedet for en "stopklods"

  Skal det være rent C eller?
Avatar billede skwat Praktikant
17. januar 2007 - 20:55 #5
Det er c++.

Men jeg har løst det ved at lave det om til
AnsiString EncodeList( AnsiString strSep, int iNoOfElements, ...)

Alt andet end lige, så må klienten altid vide hvor mange elementer han vil kalde med.

Jeg vil lige lade denne stå lidt endnu, i håb om at der dukker en borland ekspert op ;)
Avatar billede segmose Nybegynder
18. januar 2007 - 11:12 #6
Jeg prøve at sætte din kode ind i min kylix, og den kommer et trin videre end du gør "1^2^^" hvorefter den crasher når den forsøger at find "3".

Jeg havde dog lavet
strOutput    += EncodeTagString( strCurrentValue );
om til
strOutput    += strCurrentValue;
da jeg ikke viste hvordan den virkede.
Avatar billede segmose Nybegynder
18. januar 2007 - 12:04 #7
while (  ( cArg = va_arg( ap, char* ) ) != 0x00 )
skal ændres til
while (  ( cArg = va_arg( ap, char* ) ) != (char *)0x00 )

men hvorfor kan jeg ikke rigtigt fortælle, cArg er en char *, den sammenlignes med en char(0x00), også ok da en af dem ville blive type cast til den andens type, men her sker der noget underligt.
cArg bliver åbenbart checket om det den peger på er NULL og ikke om den selv er NULL ... for med optionen "merge duplicate strings" til peger den på 0x00000000, men med den på off peger den på en 0x00xxxxxx, hvor xxx er det der tilfældigvis står efter.
Avatar billede segmose Nybegynder
18. januar 2007 - 12:04 #8
svar
Avatar billede skwat Praktikant
19. januar 2007 - 14:32 #9
Mega fedt.
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