/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Konstanter og konstante arrays i C
Fra : Bertel Lund Hansen


Dato : 12-01-01 08:27

Hej alle

Jeg har to problemer:

1)
Jeg vil gerne ét sted kunne specificere hvor mange filer jeg skal
arbejde med og så benytte dette tal til at angive størrelsen på
et array. Jeg forestiller mig det således:

const int filer=25;
char filnavne[filer][50] = {
   "skraekeksempler.htm","splittet.htm", ...

Det virker ikke for compileren protesterer mod en variabel i
definitionen af et array. Hvordan kan jeg klare det?
(Hvis det havde været et endimensionsionalt array kunne det
klares med noget sizeof/sizeof)

Det er det værste problem, for tallet skal bruges i flere arrays,
og jeg benytter det også i selve programmet. Tallet vil ændre sig
når jeg ændrer på hjemmesiderne og deres opsætning.


2)
Jeg skal bruge det samme filnavn flere steder. Det er praktisk at
angive det således:

   const char indexfil[] = "index.htm";

Det vil jeg gerne benytte i et array således:

char filnavne[25][50] = {
   indexfil,"skraekeksempler.htm"...

Men det dur heller ikke. Er der en løsning på det problem?

Jeg kan naturligvis godt lave en programstump der lægger det
rigtige navn i et erklæret array, men jeg ville gerne ordne det i
erklæringen.

Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/

 
 
Igor V. Rafienko (12-01-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 12-01-01 09:26

* Bertel Lund Hansen

[snip]


> 1)
> Jeg vil gerne ét sted kunne specificere hvor mange filer jeg skal
> arbejde med og så benytte dette tal til at angive størrelsen på
> et array.


God ide, dårlig språk, bare for å oppsummere.


> Jeg forestiller mig det således:
>
> const int filer=25;
> char filnavne[filer][50] = {
>    "skraekeksempler.htm","splittet.htm", ...
>
> Det virker ikke for compileren protesterer mod en variabel i
> definitionen af et array. Hvordan kan jeg klare det? (Hvis det havde
> været et endimensionsionalt array kunne det klares med noget
> sizeof/sizeof)


Problemet er at C krever at indeksen skal være en "constant
expression". Av en eller annen helt uforståelig grunn er ikke
const-qualification nok for å være en "constant expression" (riktig så
hjernelamt[tm], but hey -- that's C).

Og da må man _dessverre_ falle tilbake på #define:


#define MAXFILES 25

char filenames[ MAXFILES ][ 50 ] = { "foo1.html",
             "foo2.html" };


Hverken C99 (som du neppe har en compiler til) eller C++ (som du ikke
programmerer i) har dette problemet, da begge støtter:


const size_t MAXFILES = 25;
char filenames[ MAXFILES ][ 50 ] = { "foo1.html",
             "foo2.html" };


(BTW, ikke bruk signed konstanter der du mener unsigned -- array
dimensjoner er typisk av størrelsen size_t, *ikke* int).


> Det er det værste problem, for tallet skal bruges i flere arrays, og
> jeg benytter det også i selve programmet. Tallet vil ændre sig når
> jeg ændrer på hjemmesiderne og deres opsætning.


Som sagt, #define. Eller dynamisk allokering via en passende "init"
funksjon. I den siste "løsningen" vil du også løse problemet under:


> Jeg skal bruge det samme filnavn flere steder. Det er praktisk at
> angive det således:
>
>    const char indexfil[] = "index.htm";
>
> Det vil jeg gerne benytte i et array således:
>
> char filnavne[25][50] = {
>    indexfil,"skraekeksempler.htm"...
>
> Men det dur heller ikke. Er der en løsning på det problem?


Ikke så vidt jeg ser utifra lettere overfladisk lesing av N869.

[snip]





ivr
--
Much of this software was user-friendly, meaning that it was intended
for users who did not know anything about computers, and furthermore
had absolutely no intention whatsoever of learning.
   -- A. S. Tanenbaum, "Modern Operating Systems, ch 1.2.4"

Mogens Hansen (12-01-2001)
Kommentar
Fra : Mogens Hansen


Dato : 12-01-01 09:22

Hej Bertel,

nospamto@lundhansen.dk (Bertel Lund Hansen) wrote in
<6mbt5tsa0cc7kel64765r5dpahlfmesf4i@news.tele.dk>:

>
>1)
>(Hvis det havde været et endimensionsionalt array kunne det
>klares med noget sizeof/sizeof)

Det er ikke noget problem for fler-dimensionelle arrays:

for arrayet "filnavne":
char filnavne[][50] =
{ "skraekeksempler.htm",
"splittet.htm"
};
kan du finde antellet af filer med udtrykket
sizeof(filnavne)/sizeof(filnavne[0])


>Det virker ikke for compileren protesterer mod en variabel i
>definitionen af et array. Hvordan kan jeg klare det?

Det ville kunne lade sig gøre, hvis du have en C99 compliant compiler - men du
behøver formodentlig ikke det, for at løse dit problem.

>
>Det er det værste problem, for tallet skal bruges i flere arrays,
>og jeg benytter det også i selve programmet. Tallet vil ændre sig
>når jeg ændrer på hjemmesiderne og deres opsætning.

Brug f.eks.

#define FILER 25
char filnavne[FILER][50] = {
"skraekeksempler.htm","splittet.htm", };

Har du en god grund til at hvert filnavn skal være 50 karakterer ?
Ønsker du at modificere dem dynamisk ?
Hvorfor 50 tegn og ikke 18, 51 eller 73 ?

Hvis du ikke vil modificerefilnavnene dynamisk, så skriv (det siger hvad du
mener, og sparer iøvrigt hukommelse):
#define FILER 25
const char* filnavne[FILER] = {
"skraekeksempler.htm","splittet.htm" };

eller hvis du kun vil vedligeholde "filnavne" og have resten til at følge dets
længde:

const char* filnavne[] = {
"skraekeksempler.htm","splittet.htm" };

#define FILER (sizeof(filnavne)/sizeof(filnavne[0]))


>
>
>2)
>Jeg skal bruge det samme filnavn flere steder. Det er praktisk at
>angive det således:
>
> const char indexfil[] = "index.htm";
>
>Det vil jeg gerne benytte i et array således:
>
>char filnavne[25][50] = {
> indexfil,"skraekeksempler.htm"...
>
>Men det dur heller ikke. Er der en løsning på det problem?

ja, lav det om til:

const char indexfil[] = "index.htm";

const char *filnavne[] =
{ indexfil,
"skraekeksempler.htm"
};

igen forudsat at du ikke ønsker at ændre filnavnene dynamisk i dit program.

Venlig hilsen

Mogens Hansen

Bertel Lund Hansen (12-01-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-01-01 10:19

Mogens Hansen skrev:

>Det er ikke noget problem for fler-dimensionelle arrays:

Mange tak til dig og Igor. Mit spørgsmål blev meget grundigt
besvaret.

Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/

Soeren Sandmann (13-01-2001)
Kommentar
Fra : Soeren Sandmann


Dato : 13-01-01 18:07

mogens_h@dk-online.dk (Mogens Hansen) writes:

> #define FILER 25

Jeg foretrækker

enum { FILER = 25 },

for så kan debuggeren FILER i stedet for 25.

Thorbjørn Ravn Ander~ (12-01-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 12-01-01 10:55

Bertel Lund Hansen wrote:

> Hej alle
>
> Jeg har to problemer:
>
> 1)
> Jeg vil gerne ét sted kunne specificere hvor mange filer jeg skal
> arbejde med og så benytte dette tal til at angive størrelsen på
> et array. Jeg forestiller mig det således:
>
> const int filer=25;
> char filnavne[filer][50] = {
> "skraekeksempler.htm","splittet.htm", ...

Mon ikke du er ude efter

#define filer 25

(hvilket overlader arbejdet til cpp). Bemærk, at det er god konvention
at skrive makroer med stort, som

#define FILER 25

--
Thorbjørn Ravn Andersen "...sound of...Tubular Bells!"
http://bigfoot.com/~thunderbear



Thomas L. Christense~ (12-01-2001)
Kommentar
Fra : Thomas L. Christense~


Dato : 12-01-01 13:49

Bertel Lund Hansen <nospamto@lundhansen.dk> wrote:

Jeg har (ved en fejl) sendt følgende svar til Bertel pr mail, men
jeg er ret ny indenfor C, så jeg vil lige høre jer kloge hoveder
om det er en okay løsning.

>1)

>const int filer=25;
>char filnavne[filer][50] = {
>   "skraekeksempler.htm","splittet.htm", ...
>
>Det virker ikke for compileren protesterer mod en variabel i
>definitionen af et array. Hvordan kan jeg klare det?

Jeg har selv haft det problem her for et par uger siden. Jeg
fandt løsningen i en FAQ

const int filer = 25
char *filnavne = (char *)malloc(filer * 50 * sizeof(char));

Nu kan du fylde navne i arrayet med

filnavne[i][j] = "bla bla bla";



--
Thomas L. Christensen - Svendborg, Denmark

Martin Moller Peders~ (12-01-2001)
Kommentar
Fra : Martin Moller Peders~


Dato : 12-01-01 14:49

In <o0vt5tg02mr0ghsrgkvl8o78mo6ip57j72@news.tele.dk> Thomas L. Christensen <tlc@get2net.dk> writes:

>Bertel Lund Hansen <nospamto@lundhansen.dk> wrote:

>Jeg har (ved en fejl) sendt følgende svar til Bertel pr mail, men
>jeg er ret ny indenfor C, så jeg vil lige høre jer kloge hoveder
>om det er en okay løsning.

>>1)

>>const int filer=25;
>>char filnavne[filer][50] = {
>>   "skraekeksempler.htm","splittet.htm", ...
>>
>>Det virker ikke for compileren protesterer mod en variabel i
>>definitionen af et array. Hvordan kan jeg klare det?

>Jeg har selv haft det problem her for et par uger siden. Jeg
>fandt løsningen i en FAQ

>const int filer = 25
>char *filnavne = (char *)malloc(filer * 50 * sizeof(char));

>Nu kan du fylde navne i arrayet med

>filnavne[i][j] = "bla bla bla";

Inden du begynder at bruge *filnavne skal du checke at den er iorden, da
malloc ikke garanterer at give dig pladsen.

Dvs.
if ( filnavne == NULL ) exit(1);
eller noget med ASSERT.

/Martin


Thomas L. Christense~ (12-01-2001)
Kommentar
Fra : Thomas L. Christense~


Dato : 12-01-01 15:52

tusk@daimi.au.dk (Martin Moller Pedersen) wrote:

>Inden du begynder at bruge *filnavne skal du checke at den er iorden, da
>malloc ikke garanterer at give dig pladsen.
>
>Dvs.
>if ( filnavne == NULL ) exit(1);
>eller noget med ASSERT.
>

Nu du siger det, så nævnte FAQ'en noget med at man burde checke
malloc'en - men der ikke stod *hvordan*, så... jeg takker for
oplysningen.



--
Thomas L. Christensen - Svendborg, Denmark

Bertel Lund Hansen (12-01-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-01-01 14:31

Thomas L. Christensen skrev:

>Nu du siger det, så nævnte FAQ'en noget med at man burde checke
>malloc'en - men der ikke stod *hvordan*, så... jeg takker for
>oplysningen.

På mit system kan jeg slå op i en hjælpefil og se hvad funktionen
returnerer, men man kan vist altid regne med at hvis den
returnerer en pointer, så vil værdien NULL fortælle at der var
ballade. NULL kan i en test erstatte FALSE, så man kan også
skrive:
if (!filnavn) ... problemer ...

Det er ikke nødvendigvis bedre end den anden skriveform.

Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/

Igor V. Rafienko (12-01-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 12-01-01 15:31

* Thomas L. Christensen

[snip]

> Jeg har selv haft det problem her for et par uger siden. Jeg
> fandt løsningen i en FAQ


Hvilken FAQ var det?


> const int filer = 25
       ^
       |

1. Syntax error
2. Feil type: dimensjoner av objekter kan _ikke_ være negative.
Dermed (det var faktisk en liten feil i min forrige posting):

const size_t FILES = 25U;


> char *filnavne = (char *)malloc(filer * 50 * sizeof(char));


char *filename = malloc( FILES * 50U );
if ( !filename ) {
fprintf( stderr, "eat flaming death\n" );
exit( 1 );
}


> Nu kan du fylde navne i arrayet med
>
> filnavne[i][j] = "bla bla bla";
^^^^^^


Say what? Dette er i det minste en typefeil, med mindre det er lov å
indeksere char's, hvilket jeg betviler.





ivr
--
Much of this software was user-friendly, meaning that it was intended
for users who did not know anything about computers, and furthermore
had absolutely no intention whatsoever of learning.
   -- A. S. Tanenbaum, "Modern Operating Systems, ch 1.2.4"

Thomas L. Christense~ (12-01-2001)
Kommentar
Fra : Thomas L. Christense~


Dato : 12-01-01 16:37

igorr@ifi.uio.no (Igor V. Rafienko) wrote:

>* Thomas L. Christensen
>> Jeg har selv haft det problem her for et par uger siden. Jeg
>> fandt løsningen i en FAQ
>
>Hvilken FAQ var det?

http://www.eskimo.com/~scs/C-faq/q6.16.html

[...]
>> Nu kan du fylde navne i arrayet med
>>
>> filnavne[i][j] = "bla bla bla";
> ^^^^^^
>
>
>Say what? Dette er i det minste en typefeil, med mindre det er lov å
>indeksere char's, hvilket jeg betviler.

Hmm.. Du har ret, jeg vrøvler. Beklager, Bertel. Jeg har rodet
lidt for meget med BASIC på det seneste, og er begyndt at blande
tingene sammen
Jeg er som sagt lidt ny her, så jeg har ikke noget bud på hvordan
Bertels problem løses.



--
Thomas L. Christensen - Svendborg, Denmark

Igor V. Rafienko (12-01-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 12-01-01 18:14

* Thomas L. Christensen

[snip]

> >Hvilken FAQ var det?
>
> http://www.eskimo.com/~scs/C-faq/q6.16.html


Det er ikke helt riktig. 6.16 bruker "pointers to pointers". Det
gjorde _ikke_ eksempelet ditt (og nei, jeg kan ikke fatte at S. Summit
typecast'et returverdien fra malloc til "riktig" type). Og char* har
generellt litt annen status enn alle andre pekere (sizeof(char) er
litt meningsløst, da sizeof(char) er _alltid_ 1).


> Hmm.. Du har ret, jeg vrøvler. Beklager, Bertel. Jeg har rodet
> lidt for meget med BASIC på det seneste, og er begyndt at blande
> tingene sammen


Jeg har _alltid_ sagt at VB ødelegger ens evner til å tenke: det bare
blir feil. Men fortvil deg ikke, såsnart du slutter å jobbe med dette
nissevåset, så blir alt bra igjen. BTDT.


> Jeg er som sagt lidt ny her, så jeg har ikke noget bud på hvordan
> Bertels problem løses.


Jeg tror man har løst det til en viss grad allerede. Dersom Bertel er
misfornøyd kommer han sikkert tilbake :)





ivr
--
Much of this software was user-friendly, meaning that it was intended
for users who did not know anything about computers, and furthermore
had absolutely no intention whatsoever of learning.
   -- A. S. Tanenbaum, "Modern Operating Systems, ch 1.2.4"

Bertel Lund Hansen (12-01-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-01-01 15:14

Thomas L. Christensen skrev:

>Hmm.. Du har ret, jeg vrøvler. Beklager, Bertel.

Det gør ikke noget. Jeg fik grundig hjælp fra de andre, og jeg
brugte bare dit forslag til inspiration.

>Jeg har rodet lidt for meget med BASIC på det seneste

Jeg vil råde dig til at glemme Basic og kun skrive i C. Selv
behersker jeg Pascal og har netop afsluttet et års undervisning i
C. Det forhaler indlæringen at falde tilbage på et velkendt
program.

Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste