Avatar billede f2f4 Novice
08. november 2010 - 14:02 Der er 6 kommentarer og
1 løsning

char array

Jeg undrer mig over at en hardkodet værdi ændre sig!? Lidt kode info:

typedef char TDato[9]; //Input skal være DDMMYYYY

::

Funktion:
double TKlasse::Beholdning(TDato Dato)
{
    :: Dato værdien/arrayet kan ændrer værdi herinde i løbet af en beregning! Denne ændrede værdi skal ikke bruges udenfor funktionen.
}

Kald af funktion som fejler pånær ved 1. kald:
::
double res = Klasse.Beholdning("01012010\0");

Det er somom "01012010\0" fungerer som en variabel og ikke en konstant! Ved andet kald kan Dato have ændret sig indeni funktionen 'Beholdning', også selvom parameteren er hardkodet til "01012010\0"

Nogle idéer til hvorfor?

Tak for svar!
Avatar billede arne_v Ekspert
08. november 2010 - 14:12 #1
Lyder som om din compiler opsætning putter streng konstanter i writeable memory.

Prøv med:
  double TKlasse::Beholdning(const TDato Dato)

og opdater en kopi af argumentet fremfor argumentet!

PS: Du skal ikke eksplicit nul terminere en "" streng.
Avatar billede f2f4 Novice
08. november 2010 - 15:11 #2
Mange tak, giv et svar!
Avatar billede arne_v Ekspert
08. november 2010 - 15:35 #3
svar
Avatar billede arne_v Ekspert
08. november 2010 - 21:06 #4
Eksempel med VC++:

C:\>type wrtstr.c
#include <stdio.h>

void f(char *s)
{
    printf("%s\n", s);
    s[0] = s[0] + 1;
}

int main()
{
    int i;
    for(i = 0; i < 10; i++)
    {
        f("ABC");
    }
    return 0;
}


C:\>cl wrtstr.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

wrtstr.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:wrtstr.exe
wrtstr.obj

C:\>wrtstr
ABC
BBC
CBC
DBC
EBC
FBC
GBC
HBC
IBC
JBC

C:\>cl /GF wrtstr.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

wrtstr.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:wrtstr.exe
wrtstr.obj

C:\>wrtstr
ABC
(crashes)
Avatar billede segmose Nybegynder
09. november 2010 - 11:02 #5
Hvis du er sikker på at den funktion ikke ændre noget data så erklær hele funktionen const, det gør det også nemmere senere at se at den her gør ikke noget mærkeligt.

class TKlasse {
double Beholdning(TDato Dato) const;
// et al.
};
Avatar billede arne_v Ekspert
09. november 2010 - 22:24 #6
Den beskytter vel mod ændringer i TKlasse objektet ikke mod ændringer i TDato objektet??
Avatar billede segmose Nybegynder
10. november 2010 - 10:53 #7
Det har du ret i, Jeg skulle have skrevet

class TKlasse {
double Beholdning(const TDato& Dato) const;  // ie. jeg lover at jeg ikke vil ændre TKlasse og heller ikke Dato.
// et al.
};

ps.
Tilføjet referance for at man ikke kommer til at kopiere structurer ved et uheld.
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