/ 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
Underlig warning
Fra : Michael Rasmussen


Dato : 23-07-06 19:35

Hej NG,

Givet følgende struktur i en header fil,

static gchar *browser_list[][2] = {
{"firefox", "-new-window"},
{"konqueror", NULL},
{"mozilla", "-new-window"},
{"epiphany", "-new-window"},
{NULL, NULL}
};

Resulterer altid i denne warning, når jeg oversætter med pedantic:

utils.h:18: warning: 'browser_list' defined but not used.

Nogen der har et bud på, hvordan jeg slipper for denne warning? (Og nej,
forslag som at droppe option pedantic tager jeg ikke seriøst!)

options til gcc: gcc -g -W -Wall -pedantic

$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,ada,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu
--enable-libstdcxx-debug --enable-mpfr --with-tune=i686
--enable-checking=release i486-linux-gnu Thread model: posix
gcc version 4.1.2 20060715 (prerelease) (Debian 4.1.1-9)

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


 
 
Ivan Johansen (23-07-2006)
Kommentar
Fra : Ivan Johansen


Dato : 23-07-06 20:39

Michael Rasmussen wrote:
> Givet følgende struktur i en header fil,
>
> static gchar *browser_list[][2] = {
> {"firefox", "-new-window"},
> {"konqueror", NULL},
> {"mozilla", "-new-window"},
> {"epiphany", "-new-window"},
> {NULL, NULL}
> };
>
> Resulterer altid i denne warning, når jeg oversætter med pedantic:
>
> utils.h:18: warning: 'browser_list' defined but not used.

Det er normalt ikke nogen god ide at placere variabler i en header-fil.
Hver eneste c-fil som inkluderer din header-fil vil få sin egen kopi af
variablen, og din compiler advarer for hver c-fil som ikke bruger den. I
stedet bør du placere variablen i en enkelt c-fil.

Nu ved jeg ikke hvad en gchar er, men en string literal er altid const
og jeg går ud fra at du ikke vil ændre på pointerne i browser_list, så
din definition bør i stedet være:
static const char * const browser_list[][2] = {

Ivan Johansen

Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 21:26

On Sun, 23 Jul 2006 21:38:55 +0200, Ivan Johansen wrote:

>
> Det er normalt ikke nogen god ide at placere variabler i en header-fil.
> Hver eneste c-fil som inkluderer din header-fil vil få sin egen kopi af
> variablen, og din compiler advarer for hver c-fil som ikke bruger den. I
> stedet bør du placere variablen i en enkelt c-fil.
>
Hvis variablen findes i sin egen c-fil, hvordan gør jeg variablen, med
dens indhold, tilgængelig i andre c-filer?

Formålet er, at variablen skal være tilgængelig i en række funktioner
spredt ud på en række forskellige c-filer.

> Nu ved jeg ikke hvad en gchar er, men en string literal er altid const
gchar er en string literal defineret i glib - abstraktion over
værtsmaskinens char. Det har den fordel, at du ikke skal bekymre dig om
størrelsen på en char <=> fuld portabel char.

> og jeg går ud fra at du ikke vil ændre på pointerne i browser_list,
> så din definition bør i stedet være: static const char * const
> browser_list[][2] = {
Point taken
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (23-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 23-07-06 21:39


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.23.20.26.27.733057@miras.org...

[8<8<8<]
> Det har den fordel, at du ikke skal bekymre dig om
> størrelsen på en char <=> fuld portabel char.

Ikke forstået.
Der gælder pr. definition
sizeof(char) == 1

Venlig hilsen

Mogens Hansen



Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 22:16

On Sun, 23 Jul 2006 22:38:56 +0200, Mogens Hansen wrote:

>
> Ikke forstået.
> Der gælder pr. definition
> sizeof(char) == 1
>
Ifølge (K&R: 195), C99 og vist også POSIX "Objects declared as
characters (char) are large enough to store any member of the execution
character set. If a genuine character from that set is stored in a char
object, its value is equivalent to the integer code for the character, and
is non-negative." Dvs størrelsen af char afhænger af størrelsen af int.
Størrelsen på int er defineret som en logisk størrelse.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (23-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 23-07-06 22:30


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.23.21.16.01.755944@miras.org...
> On Sun, 23 Jul 2006 22:38:56 +0200, Mogens Hansen wrote:
>
>>
>> Ikke forstået.
>> Der gælder pr. definition
>> sizeof(char) == 1
>>
> Ifølge (K&R: 195), C99

Ok - jeg snakker om C++.

Venlig hilsen

Mogens Hansen



Bertel Brander (23-07-2006)
Kommentar
Fra : Bertel Brander


Dato : 23-07-06 22:50

Michael Rasmussen wrote:
> On Sun, 23 Jul 2006 22:38:56 +0200, Mogens Hansen wrote:
>
>> Ikke forstået.
>> Der gælder pr. definition
>> sizeof(char) == 1
>>
> Ifølge (K&R: 195), C99 og vist også POSIX "Objects declared as
> characters (char) are large enough to store any member of the execution
> character set. If a genuine character from that set is stored in a char
> object, its value is equivalent to the integer code for the character, and
> is non-negative." Dvs størrelsen af char afhænger af størrelsen af int.
> Størrelsen på int er defineret som en logisk størrelse.

Ikke forstået, sizeof(char) er pr. definition 1
også ifølge C standarden. Den har intet med
int at gøre.

/b

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 23:07

On Sun, 23 Jul 2006 23:50:07 +0200, Bertel Brander wrote:

>
> Ikke forstået, sizeof(char) er pr. definition 1 også ifølge C
> standarden. Den har intet med int at gøre.
>
Ja, sizeof(char) = 1 = 1 tegn. På en IBM-PC anvendes ASCII for det
grundliggende tegnsæt, hvorfor et tegn har en numerisk værdi
mellem 1 og 255, en byte. På z/OS og flere UNIX varianter benyttes
EBCDIC som det grundliggende tegnsæt, hvorfor et tegn har en numerisk
værdi mellem 1 og 32767, altså ikke en byte.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Bertel Brander (23-07-2006)
Kommentar
Fra : Bertel Brander


Dato : 23-07-06 23:30

Michael Rasmussen wrote:
> On Sun, 23 Jul 2006 23:50:07 +0200, Bertel Brander wrote:
>
>> Ikke forstået, sizeof(char) er pr. definition 1 også ifølge C
>> standarden. Den har intet med int at gøre.
>>
> Ja, sizeof(char) = 1 = 1 tegn. På en IBM-PC anvendes ASCII for det
> grundliggende tegnsæt, hvorfor et tegn har en numerisk værdi
> mellem 1 og 255, en byte. På z/OS og flere UNIX varianter benyttes
> EBCDIC som det grundliggende tegnsæt, hvorfor et tegn har en numerisk
> værdi mellem 1 og 32767, altså ikke en byte.

Nej, en char er altid en byte og har altid størrelsen 1

Hvis OS-whatever har tegnsæt med værdier op til 32767
bruger de enten wide/multibyte/whatever -chars, eller
deres char er 16 bit.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 23:41

On Mon, 24 Jul 2006 00:29:48 +0200, Bertel Brander wrote:

>
> Nej, en char er altid en byte og har altid størrelsen 1
Nej og ja. Nej, en char har ikke altid størrelsen en byte, og ja, en char
har altid størrelsen 1, da en char er defineret til at indeholde eet
tegn. Hvor meget et tegn fylder i hukommelsen, bestemmes af det
underliggende OS, og ikke af C-kompileren!

Har du en reference til C-standarden der dokumenterer din påstand?

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Bertel Brander (23-07-2006)
Kommentar
Fra : Bertel Brander


Dato : 23-07-06 23:54

Michael Rasmussen wrote:
> On Mon, 24 Jul 2006 00:29:48 +0200, Bertel Brander wrote:
>
>> Nej, en char er altid en byte og har altid størrelsen 1
> Nej og ja. Nej, en char har ikke altid størrelsen en byte, og ja, en char
> har altid størrelsen 1, da en char er defineret til at indeholde eet
> tegn. Hvor meget et tegn fylder i hukommelsen, bestemmes af det
> underliggende OS, og ikke af C-kompileren!
>
> Har du en reference til C-standarden der dokumenterer din påstand?

Fra en draft til C99:
"3.4
byte
addressable unit of data storage large enough to hold
any member of the basic character set of the
execution environment"

Og:

"3.5
character
bit representation that fits in a byte"

Der er ingen forskel på en byte og en char.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Arne Vajhøj (24-07-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 24-07-06 04:41

Bertel Brander wrote:
> Fra en draft til C99:
> "3.4
> byte
> addressable unit of data storage large enough to hold
> any member of the basic character set of the
> execution environment"
>
> Og:
>
> "3.5
> character
> bit representation that fits in a byte"
>
> Der er ingen forskel på en byte og en char.

Det er helt og aldeles korrekt.

Jeg mener at deres definition af byte er både
forkert og forældet.

Men selvom de opdaterede den definition, så
ville en char stadig være en byte.

Det som man i Java og C# kalder en byte kalder man
i C/C++ for en char.

Det som man i Java og C# kalde en char kalder man
i C/C++ for en wchar_t.

[Java og C# kræver at det er 8 og 16 bit, hvilket
C/C++ vist ikke gør, men ...]

Arne

Arne Vajhøj (24-07-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 24-07-06 04:22

Michael Rasmussen wrote:
> On Sun, 23 Jul 2006 23:50:07 +0200, Bertel Brander wrote:
>> Ikke forstået, sizeof(char) er pr. definition 1 også ifølge C
>> standarden. Den har intet med int at gøre.

> Ja, sizeof(char) = 1 = 1 tegn. På en IBM-PC anvendes ASCII for det
> grundliggende tegnsæt, hvorfor et tegn har en numerisk værdi
> mellem 1 og 255, en byte. På z/OS og flere UNIX varianter benyttes
> EBCDIC som det grundliggende tegnsæt, hvorfor et tegn har en numerisk
> værdi mellem 1 og 32767, altså ikke en byte.

ASCII er ikke 1-255 men 0-127.

Hvilke Unix varianter bruger EBCDIC ?

Alle EBCDIC Tabeller jeg har set har været 0-255.

Unicode har mere end 256 tegn.

Arne

Ukendt (24-07-2006)
Kommentar
Fra : Ukendt


Dato : 24-07-06 16:21

> Der gælder pr. definition
> sizeof(char) == 1
>

For at det hele kan hænge sammen, vil det så ikke sige, at malloc(10) ikke
nødvendigvis allokerer 80 bits, men rettere et område stor nok til at kunne
skrive 10 chars , f.eks. 160 bits ?

"The malloc() function shall allocate unused space for an object whose size
in bytes is specified by size and whose value is unspecified."

Dette er så rigtigt fordi ordet byte ikke skal forstås i sin mest
almindelige betydning, 8 bits, men i en C/C++ kontekst ?

tpt




Ukendt (24-07-2006)
Kommentar
Fra : Ukendt


Dato : 24-07-06 16:34


> For at det hele kan hænge sammen, vil det så ikke sige, at malloc(10) ikke
> nødvendigvis allokerer 80 bits, men rettere et område stor nok til at
> kunne
> skrive 10 chars , f.eks. 160 bits ?

(Hvis char størrelsen på en implementation er 16 bits)




Bertel Brander (24-07-2006)
Kommentar
Fra : Bertel Brander


Dato : 24-07-06 18:59

Troels Thomsen wrote:
>> Der gælder pr. definition
>> sizeof(char) == 1
>>
>
> For at det hele kan hænge sammen, vil det så ikke sige, at malloc(10) ikke
> nødvendigvis allokerer 80 bits, men rettere et område stor nok til at kunne
> skrive 10 chars , f.eks. 160 bits ?
>
> "The malloc() function shall allocate unused space for an object whose size
> in bytes is specified by size and whose value is unspecified."
>
> Dette er så rigtigt fordi ordet byte ikke skal forstås i sin mest
> almindelige betydning, 8 bits, men i en C/C++ kontekst ?


En char/byte er ikke nødvendigvis 8 bit i C og/eller C++
Den kan godt være 16, 19, 32 bit. Den er mindst 8 bit.

CHAR_BIT fra limits.h fortæller hvor mange bits der er.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Ukendt (25-07-2006)
Kommentar
Fra : Ukendt


Dato : 25-07-06 14:53


Jeg var bare overrasket over at ordet byte betyder noget lidt andet i C
terminologien, end sådan som man normalt går og bruger den.

tpt



Soeren Sandmann (24-07-2006)
Kommentar
Fra : Soeren Sandmann


Dato : 24-07-06 19:49

Michael Rasmussen <mir@miras.org> writes:

> gchar er en string literal defineret i glib - abstraktion over
> værtsmaskinens char. Det har den fordel, at du ikke skal bekymre dig om
> størrelsen på en char <=> fuld portabel char.

En gchar fra glib er noejagtig det samme som char, ligesom gint er
noejagtig det samme som int. Ja, det er lidt uklart hvad deres
egentlige formaal er.

I gtypes.h:

typedef char gchar;
typedef short gshort;
typedef long glong;
typedef int gint;
typedef gint gboolean;

Michael Rasmussen (24-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 24-07-06 20:16

On Mon, 24 Jul 2006 20:48:43 +0200, Soeren Sandmann wrote:

>
> En gchar fra glib er noejagtig det samme som char, ligesom gint er
> noejagtig det samme som int. Ja, det er lidt uklart hvad deres egentlige
> formaal er.
>
Portabilitet. En gint har altid samme størrelse uafhængigt af det
underliggende OS. GLib er ansvarlig for memory håndteringen. Betragt
derfor gint, gchar etc. som en højniveau API over simple datatyper.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (24-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 24-07-06 20:32


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.24.19.15.39.146218@miras.org...
> On Mon, 24 Jul 2006 20:48:43 +0200, Soeren Sandmann wrote:
>
>>
>> En gchar fra glib er noejagtig det samme som char, ligesom gint er
>> noejagtig det samme som int. Ja, det er lidt uklart hvad deres egentlige
>> formaal er.
>>
> Portabilitet. En gint har altid samme størrelse uafhængigt af det
> underliggende OS.

Fra http://developer.gnome.org/doc/API/2.0/glib/glib-Basic-Types.html#gint :
gint

typedef int gint;

Corresponds to the standard C int type. Values of this type can range from
G_MININT to G_MAXINT.

Du opnår altså absolut _intet_ i relation til portabilitet - tværtimod du
får tilføjet en binding til glib.
Tilsvarende er værdier svarende G_MININT to G_MAXINT defineret i både
Standard C og Standard C++.

Er du sikker på at du ikke tænker på gint8 etc. for at få integere af kendt
størrelse ?

Venlig hilsen

Mogens Hansen



Mogens Hansen (24-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 24-07-06 20:36


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:44c52031$0$67259$157c6196@dreader2.cybercity.dk...

[8<8<8<]
> Er du sikker på at du ikke tænker på gint8 etc. for at få integere af
> kendt størrelse ?

De findes iøvrigt også i C99, uden yderligere afhængigheder:
int8_t, int16_t
og de kommer også med i næste C++ standard.

Venlig hilsen

Mogens Hansen



Soeren Sandmann (24-07-2006)
Kommentar
Fra : Soeren Sandmann


Dato : 24-07-06 21:04

Michael Rasmussen <mir@miras.org> writes:

> > En gchar fra glib er noejagtig det samme som char, ligesom gint er
> > noejagtig det samme som int. Ja, det er lidt uklart hvad deres egentlige
> > formaal er.
> >
> Portabilitet. En gint har altid samme størrelse uafhængigt af det
> underliggende OS.

Nej, en gint har altid samme stoerrelse som en int, for det er den
samme type. Der er andre g-typer, som er mere brugbare:

guint32 unsigned 32 bits integer

gint32 signed 32 bits integer

guchar en forkortelse for "unsigned char".

gint8 signed 8 bits integer ("signed char"
hvis man lever i den virkelige
verden).

etc.

Men gint, gfloat, gdouble og gchar er ikke andet end synonymer for de
tilsvarende C-typer. Der er masser af brugbare ting i glib, men disse
typer er ikke saerlig nyttige.


Soren

Ukendt (24-07-2006)
Kommentar
Fra : Ukendt


Dato : 24-07-06 22:01


Ivan Johansen skrev:
>
> Nu ved jeg ikke hvad en gchar er, men en string literal er altid const
> og jeg går ud fra at du ikke vil ændre på pointerne i browser_list, så
> din definition bør i stedet være:
> static const char * const browser_list[][2] = {
>

Lidt ved siden af spørgsmålet, men hvorfor mener du en string literal
altid er const? Det er den ikke.
Eksempelvis, hvis en string literal var const ville følgende ikke kunne
compilere:
char * p1 = "string literal";
og ejheller
p1[0] = 'S';

Claus

Bertel Brander (24-07-2006)
Kommentar
Fra : Bertel Brander


Dato : 24-07-06 22:26

Claus Jensen wrote:
>
> Lidt ved siden af spørgsmålet, men hvorfor mener du en string literal
> altid er const? Det er den ikke.
> Eksempelvis, hvis en string literal var const ville følgende ikke kunne
> compilere:
> char * p1 = "string literal";
> og ejheller
> p1[0] = 'S';


Snakke vi C eller C++?

En string literal er en const char * i C++
Den er ikke (rigtig) const i C, da C ikke er
så typefast.

Men du må ikke ændre på indholdet af en
string literal hverken i C eller C++.

At du godt kan kompilere dit eksempel som
såvel C som C++ skyldes mest at man har
valgt nogen form for bagud-compatibilitet.

Første del af dit eksempel er "lovligt".
Anden del er ikke lovligt, men kan godt
kompileres da p1 ikke er const.
Havde p1 været const kunne det godt
oversættes som C (med en warning) men ikke
i C++.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (24-07-2006)
Kommentar
Fra : Kent Friis


Dato : 24-07-06 22:37

Den Mon, 24 Jul 2006 23:26:05 +0200 skrev Bertel Brander:
> Claus Jensen wrote:
>>
>> Lidt ved siden af spørgsmålet, men hvorfor mener du en string literal
>> altid er const? Det er den ikke.
>> Eksempelvis, hvis en string literal var const ville følgende ikke kunne
>> compilere:
>> char * p1 = "string literal";
>> og ejheller
>> p1[0] = 'S';
>
> Første del af dit eksempel er "lovligt".
> Anden del er ikke lovligt, men kan godt
> kompileres da p1 ikke er const.

Men at det kan compiles er ikke nødvendigvis nok.

$ cat const.c
int main() {
char * p1 = "string literal";
   p1[0] = 'S';
   return 0;
}
$ make const
cc -g -Wall const.c -o const
$ ./const
Segmentation fault
$



Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (24-07-2006)
Kommentar
Fra : Bertel Brander


Dato : 24-07-06 23:07

Kent Friis wrote:
>>> Eksempelvis, hvis en string literal var const ville følgende ikke kunne
>>> compilere:
>>> char * p1 = "string literal";
>>> og ejheller
>>> p1[0] = 'S';
>> Første del af dit eksempel er "lovligt".
>> Anden del er ikke lovligt, men kan godt
>> kompileres da p1 ikke er const.
>
> Men at det kan compiles er ikke nødvendigvis nok.

Som jeg skrev er det ikke lovligt, men:

C:\Program>type pop.cpp
#include <iostream>
int main()
{
char * p1 = "string literal";
p1[0] = 'S';
std::cout << p1 << std::endl;
}
C:\Program>bcc32 pop.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
pop.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\Program>pop
String literal

Og det beviser ingenting.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (23-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 23-07-06 20:49


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.23.18.35.25.24841@miras.org...
> Hej NG,
>
> Givet følgende struktur i en header fil,
>
> static gchar *browser_list[][2] = {
> {"firefox", "-new-window"},
> {"konqueror", NULL},
> {"mozilla", "-new-window"},
> {"epiphany", "-new-window"},
> {NULL, NULL}
> };
>
> Resulterer altid i denne warning, når jeg oversætter med pedantic:
>
> utils.h:18: warning: 'browser_list' defined but not used.

Bliver den brugt i alle filer der inkluderer header filen ?
Den er jo static, så hvis den ikke bliver brugt har compileren jo ret og den
kan slettes.

Problemet er vel at den står i en headerfil, når det ikke kun er en
erklæring. Du risikerer at unødvendigt teksten bliver lagt ud mange gange i
programmet.

For mig ser det ud som om den ikke skal være "static", men "const", og
erklæringen i headerfilen skal være noget i retningen af:
extern const char* const browser_list[][2];

og definitionen skal være
const char* const browser_list[][2] = {
{"firefox", "-new-window"},
{"konqueror", 0},
{"mozilla", "-new-window"},
{"epiphany", "-new-window"},
{0, 0}
};



Venlig hilsen

Mogens Hansen



Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 21:31

On Sun, 23 Jul 2006 21:48:52 +0200, Mogens Hansen wrote:

> For mig ser det ud som om den ikke skal være "static", men "const", og
> erklæringen i headerfilen skal være noget i retningen af: extern const
> char* const browser_list[][2];
>
> og definitionen skal være
> const char* const browser_list[][2] = {
> {"firefox", "-new-window"},
> {"konqueror", 0},
> {"mozilla", "-new-window"},
> {"epiphany", "-new-window"},
> {0, 0}
> };
Problemet, som beskrevet andet steds til Ivan, er, at erklæring samt
definition skal være tilgængelig i flere c-filer.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (23-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 23-07-06 21:40


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.23.20.30.39.393873@miras.org...

[8<8<8<]
> Problemet, som beskrevet andet steds til Ivan, er, at erklæring samt
> definition skal være tilgængelig i flere c-filer.

Det er den også med den erklæring jeg nævnte, du skal skrive i header-filen:
extern const char* const browser_list[][2];

Venlig hilsen

Mogens Hansen



Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 22:19

On Sun, 23 Jul 2006 22:39:53 +0200, Mogens Hansen wrote:

> Det er den også med den erklæring jeg nævnte, du skal skrive i
> header-filen:
> extern const char* const browser_list[][2];
>
Det kan jeg ikke få til at hænge sammen
Header-filen, hvor browser_list er erklæret, skal også samtidigt
indeholde definitionen. Hvordan skal det kunne gøres?

For hver c-fil der inkluderer header-filen, skal jeg fra header-filen
kunne finde både erklæringen og definition af browser_list. Hver fil der
inkluderer header-filen, må ikke selv erklære browser_list.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (23-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 23-07-06 22:36


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.23.21.19.12.858547@miras.org...
> On Sun, 23 Jul 2006 22:39:53 +0200, Mogens Hansen wrote:
>
>> Det er den også med den erklæring jeg nævnte, du skal skrive i
>> header-filen:
>> extern const char* const browser_list[][2];
>>
> Det kan jeg ikke få til at hænge sammen
> Header-filen, hvor browser_list er erklæret, skal også samtidigt
> indeholde definitionen.

Hvorfor er erklæringen ikke tilstrækkelig ?
Det giver muligvis "code bloat" og den warning du gerne vil af med når du
skriver definitionen i headerfilen som "static".

> Hvordan skal det kunne gøres?

Med erklæringen i headerfilen kan du ikke se definitionen, men du kan tilgå
indholdet, f.eks.
int i = 0;
while(browser_list[i][0]) {
// ...
}

Venlig hilsen

Mogens Hansen



Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 22:57

On Sun, 23 Jul 2006 23:36:25 +0200, Mogens Hansen wrote:

>
> Med erklæringen i headerfilen kan du ikke se definitionen, men du kan
> tilgå indholdet, f.eks.
> int i = 0;
> while(browser_list[i][0]) {
> // ...
> }
> }
Jeg forstår det stadigvæk ikke

util.h
extern const char* const browser_list[][2];

tilfældig.c
while(*browser_list) {
printf("%s\n", *browser_list++);
}

Hvor bliver browser_list så defineret? i util.c?
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Michael Rasmussen (23-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 23-07-06 23:08

On Sun, 23 Jul 2006 23:56:35 +0200, Michael Rasmussen wrote:

> tilfældig.c
#include "util.h"
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (24-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 24-07-06 00:10


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.23.21.56.35.863503@miras.org...

[8<8<8<]
> tilfældig.c
> while(*browser_list) {
> printf("%s\n", *browser_list++);

Nej.
browser_list er konstant og kan ikke incrementeres.

Jeg holder fast i
int i = 0;
while(browser_list[i][0]) {
// ...
}
eventuelt med "i" af typen "size_t" i stedet for "int".

> }
>
> Hvor bliver browser_list så defineret? i util.c?

Ja, i "util.c" (selvom det ikke et særligt unikt navn for en source-fil):
const char* const browser_list[][2] = {
{"firefox", "-new-window"},
{"konqueror", 0},
{"mozilla", "-new-window"},
{"epiphany", "-new-window"},
{0, 0}
};

Venlig hilsen

Mogens Hansen



Michael Rasmussen (24-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 24-07-06 02:00

On Mon, 24 Jul 2006 01:09:36 +0200, Mogens Hansen wrote:

>
> Nej.
> browser_list er konstant og kan ikke incrementeres.
>
Det giver ellers ingen warning eller error med pedantic?

>
> Ja, i "util.c" (selvom det ikke et særligt unikt navn for en source-fil):
Ok, det virker

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Michael Rasmussen (24-07-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 24-07-06 02:04

On Mon, 24 Jul 2006 03:00:28 +0200, Michael Rasmussen wrote:

> Det giver ellers ingen warning eller error med pedantic?
>
Det er også sådan, jeg gør:
for (i = 0; *browser_list[i] != NULL; i++)

Og det virker.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (24-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 24-07-06 06:26


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.24.01.04.17.647055@miras.org...
> On Mon, 24 Jul 2006 03:00:28 +0200, Michael Rasmussen wrote:
>
>> Det giver ellers ingen warning eller error med pedantic?
>>
> Det er også sådan, jeg gør:
> for (i = 0; *browser_list[i] != NULL; i++)
>
> Og det virker.

Ja - det er også noget helt andet end
browser_list++
hvor "browser_list" bliver ændret.

Venlig hilsen

Mogens Hansen



Mogens Hansen (24-07-2006)
Kommentar
Fra : Mogens Hansen


Dato : 24-07-06 06:18


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.07.24.01.00.26.654122@miras.org...
> On Mon, 24 Jul 2006 01:09:36 +0200, Mogens Hansen wrote:
>
>>
>> Nej.
>> browser_list er konstant og kan ikke incrementeres.
>>
> Det giver ellers ingen warning eller error med pedantic?

Det gør det hos mig med Borland C++Builder 6.0, Microsoft Visual C++ .NET
2005 og Comeau 4.3.3.
Det var også meningen med de const dekoreringer.

Hvis din compiler kan oversætte:

extern const char* const browser_list[][2];

int main()
{

++browser_list;
}

uden nogen form for brok vil jeg anse det for en fejl i compileren (indtil
andet er bevist).

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste