|
| 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 |
| | |
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/
| |
|
|