EmbeddedRelated.com
Forums
The 2024 Embedded Online Conference

How does can you use all functions lpc230x.c

Started by jefspalace April 27, 2008
Hi,

I think Paul Curtis is 100% right, but at the same time I think Paul Claessen's formulation "that functions have universal scope" nicely illustrates what he is trying to say, especially given he is trying to answer relative-c-newbie question. The scope he means is not the scope of a declaration, but can be very well seen as a scope of a symbol for the linker. Which of course is a linkage class, and here this word game starts again :-)

Regards,
Jan

----- Original Message -----
From: Paul Curtis
To: l...
Sent: Monday, April 28, 2008 5:37 PM
Subject: RE: [lpc2000] Re: How does can you use all functions lpc230x.c

Mark,

> I don't think that is correct.

Oh, by jove, is is correct.

> By declaring it as "extern" you are
> explicitly telling the compiler that storage is allocated elsewhere.

Actually, no. You're telling it that it has external linkage.

> What you wrote does not declare a local variable.

Oh, it's not an "auto" variable for sure. However, the declaration of x has
LOCAL SCOPE. You cannot assign to "x" outside the function unless you have
another declaration or a definition.

> If x is not declared elsewhere, the linker will generate an error.

Correct. That's linkage and storage class. It has ZERO, NOTHING, NADA to
do with the scope of a declaration.

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

#ygrp-mkp { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 14px; BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 14px; PADDING-BOTTOM: 0px; MARGIN: 14px 0px; BORDER-LEFT: #d8d8d8 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #d8d8d8 1px solid; FONT-FAMILY: Arial}#ygrp-mkp HR { BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid; BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid}#ygrp-mkp #hd { FONT-WEIGHT: bold; FONT-SIZE: 85%; MARGIN: 10px 0px; COLOR: #628c2a; LINE-HEIGHT: 122%}#ygrp-mkp #ads { MARGIN-BOTTOM: 10px}#ygrp-mkp .ad { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px}#ygrp-mkp .ad A { COLOR: #0000ff; TEXT-DECORATION: none}

---------------------------------
Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it now.


An Engineer's Guide to the LPC2100 Series

Hi Jan at al,

The following code demonstrates scope:

void foo(void)
{
while (1) // don't confuse the unwary, wrap a block in a construct
{
extern int x;
x = 1;
}
x = 2;
}
Here, x in foo is addressing something called "x" that is allocated storage
over the lifetime of the application. The scope of the declaration of "x"
in "foo" is only for the inner block. The line x=2 will generate an error
even though something called "x" exists in the universe and is seen by the
linker, it's just that the compiler can't see it at that point.

C is a language that separates scope from storage class. In other
algorithmic languages, most notably the Pascal and Modula languages, scope
and storage class are combined into one and can never be separated: "global"
variables are declared at the outermost level and all variables in functions
or procedures get "auto" storage class and local scope. (For those that
know Modula-2, please don't interject and chime on about import, export, and
local modules, those were severely brain-dead constructs.)

Note that storage class is inferred, if it is not specified, and depends
where the variable is declared.

At top-level, and without contrary declarations, "int x" declares an integer
with file scope and extern storage class. In a function block, "int x"
declares an integer with block scope and auto storage class.

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

> -----Original Message-----
> From: l... [mailto:l...] On
> Behalf Of Jan Vanek
> Sent: 28 April 2008 17:14
> To: l...
> Subject: Re: [lpc2000] Re: How does can you use all functions lpc230x.c
>
> Hi,
>
> I think Paul Curtis is 100% right, but at the same time I think Paul
> Claessen's formulation "that functions have universal scope" nicely
> illustrates what he is trying to say, especially given he is trying to
> answer relative-c-newbie question. The scope he means is not the scope
> of a declaration, but can be very well seen as a scope of a symbol for
> the linker. Which of course is a linkage class, and here this word game
> starts again :-)
>
> Regards,
> Jan
>
> ----- Original Message -----
> From: Paul Curtis
> To: l...
> Sent: Monday, April 28, 2008 5:37 PM
> Subject: RE: [lpc2000] Re: How does can you use all functions
> lpc230x.c
>
> Mark,
>
> > I don't think that is correct.
>
> Oh, by jove, is is correct.
>
> > By declaring it as "extern" you are
> > explicitly telling the compiler that storage is allocated
> elsewhere.
>
> Actually, no. You're telling it that it has external linkage.
>
> > What you wrote does not declare a local variable.
>
> Oh, it's not an "auto" variable for sure. However, the declaration of
> x has
> LOCAL SCOPE. You cannot assign to "x" outside the function unless you
> have
> another declaration or a definition.
>
> > If x is not declared elsewhere, the linker will generate an error.
>
> Correct. That's linkage and storage class. It has ZERO, NOTHING, NADA
> to
> do with the scope of a declaration.
>
> --
> Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
> CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors
>
> #ygrp-mkp { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT:
14px;
> BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 14px; PADDING-BOTTOM: 0px;
> MARGIN: 14px 0px; BORDER-LEFT: #d8d8d8 1px solid; PADDING-TOP: 0px;
> BORDER-BOTTOM: #d8d8d8 1px solid; FONT-FAMILY: Arial}#ygrp-mkp HR {
> BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid;
> BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid}#ygrp-
> mkp #hd { FONT-WEIGHT: bold; FONT-SIZE: 85%; MARGIN: 10px 0px; COLOR:
> #628c2a; LINE-HEIGHT: 122%}#ygrp-mkp #ads { MARGIN-BOTTOM:
> 10px}#ygrp-mkp .ad { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-
> BOTTOM: 0px; PADDING-TOP: 0px}#ygrp-mkp .ad A { COLOR: #0000ff;
TEXT-
> DECORATION: none}
>
> ---------------------------------
> Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try
> it now.
>
>
>
Hi Paul,

I agree. I'd like to find a weak point in your argumentation, but it is not possible :-) Unfortunately I don't know Modula-2.

Regards,
Jan

----- Original Message -----
From: Paul Curtis
To: l...
Sent: Monday, April 28, 2008 6:47 PM
Subject: RE: [lpc2000] Re: How does can you use all functions lpc230x.c

Hi Jan at al,

The following code demonstrates scope:

void foo(void)
{
while (1) // don't confuse the unwary, wrap a block in a construct
{
extern int x;
x = 1;
}
x = 2;
}

Here, x in foo is addressing something called "x" that is allocated storage
over the lifetime of the application. The scope of the declaration of "x"
in "foo" is only for the inner block. The line x=2 will generate an error
even though something called "x" exists in the universe and is seen by the
linker, it's just that the compiler can't see it at that point.

C is a language that separates scope from storage class. In other
algorithmic languages, most notably the Pascal and Modula languages, scope
and storage class are combined into one and can never be separated: "global"
variables are declared at the outermost level and all variables in functions
or procedures get "auto" storage class and local scope. (For those that
know Modula-2, please don't interject and chime on about import, export, and
local modules, those were severely brain-dead constructs.)

Note that storage class is inferred, if it is not specified, and depends
where the variable is declared.

At top-level, and without contrary declarations, "int x" declares an integer
with file scope and extern storage class. In a function block, "int x"
declares an integer with block scope and auto storage class.

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

> -----Original Message-----
> From: l... [mailto:l...] On
> Behalf Of Jan Vanek
> Sent: 28 April 2008 17:14
> To: l...
> Subject: Re: [lpc2000] Re: How does can you use all functions lpc230x.c
>
> Hi,
>
> I think Paul Curtis is 100% right, but at the same time I think Paul
> Claessen's formulation "that functions have universal scope" nicely
> illustrates what he is trying to say, especially given he is trying to
> answer relative-c-newbie question. The scope he means is not the scope
> of a declaration, but can be very well seen as a scope of a symbol for
> the linker. Which of course is a linkage class, and here this word game
> starts again :-)
>
> Regards,
> Jan
>
> ----- Original Message -----
> From: Paul Curtis
> To: l...
> Sent: Monday, April 28, 2008 5:37 PM
> Subject: RE: [lpc2000] Re: How does can you use all functions
> lpc230x.c
>
> Mark,
>
> > I don't think that is correct.
>
> Oh, by jove, is is correct.
>
> > By declaring it as "extern" you are
> > explicitly telling the compiler that storage is allocated
> elsewhere.
>
> Actually, no. You're telling it that it has external linkage.
>
> > What you wrote does not declare a local variable.
>
> Oh, it's not an "auto" variable for sure. However, the declaration of
> x has
> LOCAL SCOPE. You cannot assign to "x" outside the function unless you
> have
> another declaration or a definition.
>
> > If x is not declared elsewhere, the linker will generate an error.
>
> Correct. That's linkage and storage class. It has ZERO, NOTHING, NADA
> to
> do with the scope of a declaration.
>
> --
> Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
> CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors
>
> #ygrp-mkp { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT:
14px;
> BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 14px; PADDING-BOTTOM: 0px;
> MARGIN: 14px 0px; BORDER-LEFT: #d8d8d8 1px solid; PADDING-TOP: 0px;
> BORDER-BOTTOM: #d8d8d8 1px solid; FONT-FAMILY: Arial}#ygrp-mkp HR {
> BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid;
> BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid}#ygrp-
> mkp #hd { FONT-WEIGHT: bold; FONT-SIZE: 85%; MARGIN: 10px 0px; COLOR:
> #628c2a; LINE-HEIGHT: 122%}#ygrp-mkp #ads { MARGIN-BOTTOM:
> 10px}#ygrp-mkp .ad { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-
> BOTTOM: 0px; PADDING-TOP: 0px}#ygrp-mkp .ad A { COLOR: #0000ff;
TEXT-
> DECORATION: none}
>
> ---------------------------------
> Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try
> it now.
>
>
>
>
>
>
>
Jan,



I can find myself in your statement.



And while I now, too, agree that Paul Curtis is correct, Id like to come
back to my earlier statement that storage class affects scope



Curiously, I found this statement in the errata part of K&Rs second edition
C book:



195(A4.1) The first few sentences might be reworded a bit to emphasize
that there is a distinction between storage duration and scope, though both
are influenced by explicit and implicit storage-class specifiers



Read that? storage duration and SCOPE are INFLUENCED BY STORAGE-CLASS
specifiers



To be sure, this was written by Brian Kernighan and Dennis Ritchie
themselves. Were they wrong?



Just to keep the discussion alive ;-)



~ Paul



Link: http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html





From: l... [mailto:l...] On Behalf Of
Jan Vanek
Sent: Monday, April 28, 2008 12:14 PM
To: l...
Subject: Re: [lpc2000] Re: How does can you use all functions lpc230x.c



Hi,

I think Paul Curtis is 100% right, but at the same time I think Paul
Claessen's formulation "that functions have universal scope" nicely
illustrates what he is trying to say, especially given he is trying to
answer relative-c-newbie question. The scope he means is not the scope of a
declaration, but can be very well seen as a scope of a symbol for the
linker. Which of course is a linkage class, and here this word game starts
again :-)

Regards,
Jan

----- Original Message -----
From: Paul Curtis
To: l...
Sent: Monday, April 28, 2008 5:37 PM
Subject: RE: [lpc2000] Re: How does can you use all functions lpc230x.c
Mark,

> I don't think that is correct.

Oh, by jove, is is correct.

> By declaring it as "extern" you are
> explicitly telling the compiler that storage is allocated elsewhere.

Actually, no. You're telling it that it has external linkage.

> What you wrote does not declare a local variable.

Oh, it's not an "auto" variable for sure. However, the declaration of x has
LOCAL SCOPE. You cannot assign to "x" outside the function unless you have
another declaration or a definition.

> If x is not declared elsewhere, the linker will generate an error.

Correct. That's linkage and storage class. It has ZERO, NOTHING, NADA to
do with the scope of a declaration.

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

#ygrp-mkp { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 14px;
BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 14px; PADDING-BOTTOM: 0px;
MARGIN: 14px 0px; BORDER-LEFT: #d8d8d8 1px solid; PADDING-TOP: 0px;
BORDER-BOTTOM: #d8d8d8 1px solid; FONT-FAMILY: Arial}#ygrp-mkp HR {
BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid; BORDER-LEFT:
#d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid}#ygrp-mkp #hd {
FONT-WEIGHT: bold; FONT-SIZE: 85%; MARGIN: 10px 0px; COLOR: #628c2a;
LINE-HEIGHT: 122%}#ygrp-mkp #ads { MARGIN-BOTTOM: 10px}#ygrp-mkp .ad {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP:
0px}#ygrp-mkp .ad A { COLOR: #0000ff; TEXT-DECORATION: none}

---------------------------------
Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it
now.






Hi Paul,

my mail client won't put > before your text :-(

----- Original Message -----
From: "Paul Claessen"
To:
Sent: Monday, April 28, 2008 7:11 PM
Subject: RE: [lpc2000] Re: How does can you use all
functions lpc230x.c
> Jan,

> I can find myself in your statement.

> And while I now, too, agree that Paul Curtis is
correct, I'd like to come
> back to my earlier statement that storage class
affects scope.
> Curiously, I found this statement in the errata part
of K&R's second
> edition
> "C" book:

> "195(A4.1) The first few sentences might be
reworded a bit to emphasize
> that there is a distinction between storage duration
and scope, though
> both
> are influenced by explicit and implicit
storage-class specifiers"

> Read that? "storage duration and SCOPE . are
INFLUENCED BY .
> STORAGE-CLASS
> specifiers"

> To be sure, this was written by Brian Kernighan and
Dennis Ritchie
> themselves. Were they wrong?
Strange. If the scope they refer to is the scope of a
declaration, then I
think they were wrong. Which is unlikely, so I think
they meant it in
linker-context, i.e. scope of a symbol. At least I
can't find out any
example where storage-class specifier would influence
the visibility of a
declaration for a compiler. Well if this exist, it
would surprise me a lot.
> Just to keep the discussion alive. ;-)
Actually the very original question was about
functions, where the storage
class is not relevant, so I hoped the thread would be
stopped soon :-)

> ~ Paul
With regards,
Jan

Link:
http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html

From: l...
[mailto:l...] On Behalf Of
Jan Vanek
Sent: Monday, April 28, 2008 12:14 PM
To: l...
Subject: Re: [lpc2000] Re: How does can you use all
functions lpc230x.c

Hi,

I think Paul Curtis is 100% right, but at the same
time I think Paul
Claessen's formulation "that functions have universal
scope" nicely
illustrates what he is trying to say, especially given
he is trying to
answer relative-c-newbie question. The scope he means
is not the scope of a
declaration, but can be very well seen as a scope of a
symbol for the
linker. Which of course is a linkage class, and here
this word game starts
again :-)

Regards,
Jan

----- Original Message -----
From: Paul Curtis
To: l...

Sent: Monday, April 28, 2008 5:37 PM
Subject: RE: [lpc2000] Re: How does can you use all
functions lpc230x.c
Mark,

> I don't think that is correct.

Oh, by jove, is is correct.

> By declaring it as "extern" you are
> explicitly telling the compiler that storage is
allocated elsewhere.

Actually, no. You're telling it that it has external
linkage.

> What you wrote does not declare a local variable.

Oh, it's not an "auto" variable for sure. However, the
declaration of x has
LOCAL SCOPE. You cannot assign to "x" outside the
function unless you have
another declaration or a definition.

> If x is not declared elsewhere, the linker will
generate an error.

Correct. That's linkage and storage class. It has
ZERO, NOTHING, NADA to
do with the scope of a declaration.

--
Paul Curtis, Rowley Associates Ltd
http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now
Cortex-M3 processors

#ygrp-mkp { BORDER-RIGHT: #d8d8d8 1px solid;
PADDING-RIGHT: 14px;
BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 14px;
PADDING-BOTTOM: 0px;
MARGIN: 14px 0px; BORDER-LEFT: #d8d8d8 1px solid;
PADDING-TOP: 0px;
BORDER-BOTTOM: #d8d8d8 1px solid; FONT-FAMILY:
Arial}#ygrp-mkp HR {
BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8
1px solid; BORDER-LEFT:
#d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px
solid}#ygrp-mkp #hd {
FONT-WEIGHT: bold; FONT-SIZE: 85%; MARGIN: 10px 0px;
COLOR: #628c2a;
LINE-HEIGHT: 122%}#ygrp-mkp #ads { MARGIN-BOTTOM:
10px}#ygrp-mkp .ad {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM:
0px; PADDING-TOP:
0px}#ygrp-mkp .ad A { COLOR: #0000ff; TEXT-DECORATION:
none}

---------------------------------
Be a better friend, newshound, and know-it-all with
Yahoo! Mobile. Try it
now.





____________________________________________________________________________________
Be a better friend, newshound, and
know-it-all with Yahoo! Mobile. Try it now. http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ

Jan,

> Actually the very original question was about
> functions, where the storage class is not relevant, so I hoped the thread
would be
> stopped soon :-)

Sure it's important. You leave it off (assumed extern), you put it in
(static, extern, inline) and it affects the storage class...

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

Paul,

> Curiously, I found this statement in the errata part of K&Rs second
> edition C book:
>
> 195(A4.1) The first few sentences might be reworded a bit to
> emphasize that there is a distinction between storage duration and scope,
though
> both are influenced by explicit and implicit storage-class specifiers
>
> Read that? storage duration and SCOPE are INFLUENCED BY STORAGE-
> CLASS specifiers

Storage duration is certainly influenced by storage class specifiers. I
believe they are referring to top-level static and extern qualifiers which
limit the visibility of a declaration between files.

> To be sure, this was written by Brian Kernighan and Dennis Ritchie
> themselves. Were they wrong?

As there are errata in the book and a moving C standard, it is entirely
reasonable that they could be incorrect. I would direct you to the way that
static, extern, and plain declarations affect each other in the same file.
For that you need to read the standard which codifies what must happen, not
what just happened to fall out of the wash in pcc (the Portable C Compiler).

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

Paul,

as I read your emails I start to think I don't know C at all. :-)

Foltos

Paul Curtis wrote:
> Mark,
>
>
>> I don't think that is correct.
>>
>
> Oh, by jove, is is correct.
>
>
>> By declaring it as "extern" you are
>> explicitly telling the compiler that storage is allocated elsewhere.
>>
>
> Actually, no. You're telling it that it has external linkage.
>
>
>> What you wrote does not declare a local variable.
>>
>
> Oh, it's not an "auto" variable for sure. However, the declaration of x has
> LOCAL SCOPE. You cannot assign to "x" outside the function unless you have
> another declaration or a definition.
>
>
>> If x is not declared elsewhere, the linker will generate an error.
>>
>
> Correct. That's linkage and storage class. It has ZERO, NOTHING, NADA to
> do with the scope of a declaration.
>
> --
> Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
> CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors
>
>
Hi,

> Paul,
>
> as I read your emails I start to think I don't know C at all. :-)

It's not uncommon for productive programmers to use a pragmatic non-tricksy
subset of the language to get stuff done. I don't hold with adding more and
ore toppings to a simple language to build a monster nobody understands. I
don't expect many programmers to know the full set of language rules.

Hands up who can recite the precedence and associativity of each C operator?
I can't and that's why I use parentheses.

(Modula-2, Pascal, and Oberon had the right idea, only two levels precedence
associativity you needed to remember, both in line with mathematical
notation...)

--
Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk
CrossWorks for ARM, MSP430, AVR, MAXQ, and now Cortex-M3 processors

Hi Paul,

----- Original Message -----
From: "Paul Curtis"
To:
Sent: Monday, April 28, 2008 9:19 PM
Subject: RE: [lpc2000] Re: How does can you use all
functions lpc230x.c
> Jan,
>
>> Actually the very original question was about
>> functions, where the storage class is not relevant,
so I hoped the thread
> would be
>> stopped soon :-)
>
> Sure it's important. You leave it off (assumed
extern), you put it in
> (static, extern, inline) and it affects the storage
class...
>

You're right. I thought for the function only the
linkage is important, but
in fact the storage class specifier determines the
linkage for the function.
I should have not separated those two and thus my
formulation was not
correct.

On the other hand, the storage class specifiers for a
C function are
"extern" and "static". The "inline" is not a storage
class specifier, it is
a function specifier.

> --
> Paul Curtis, Rowley Associates Ltd
http://www.rowley.co.uk
> CrossWorks for ARM, MSP430, AVR, MAXQ, and now
Cortex-M3 processors

Regards,
Jan

____________________________________________________________________________________
Be a better friend, newshound, and
know-it-all with Yahoo! Mobile. Try it now. http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ


The 2024 Embedded Online Conference