/ 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
void funktionsparameter
Fra : Troels Thomsen


Dato : 04-03-04 10:46

Jeg trode egentlig at dette var det samme

void myFunc()
void myFunc(void)

men er nu løbet ind i en compiler der synes at der skal stå PRÆCIST det
samme i c og h fil, ellers giver den en type konfikt. Er det bare en
spisfindighed, eller er der en historie bag ?

mvh Troels



 
 
Niels Dybdahl (04-03-2004)
Kommentar
Fra : Niels Dybdahl


Dato : 04-03-04 14:31

> void myFunc()
> void myFunc(void)
> men er nu løbet ind i en compiler der synes at der skal stå PRÆCIST det
> samme i c og h fil, ellers giver den en type konfikt. Er det bare en
> spisfindighed, eller er der en historie bag ?

I C++ er de to ens, men i C betyder void myFunc() at der er vilkårlige
parametre (ligesom void myFunc(...) i C++).

Niels Dybdahl




Troels Thomsen (04-03-2004)
Kommentar
Fra : Troels Thomsen


Dato : 04-03-04 16:44

>
> I C++ er de to ens, men i C betyder void myFunc() at der er vilkårlige
> parametre (ligesom void myFunc(...) i C++).
>

Ahhh !!! ...... f.eks. printf

Hvordan finder man egentlig ud af hvor mange parametre der er , hvis man
programmerer en sådan funktion selv?

mvh Troels



FePe (04-03-2004)
Kommentar
Fra : FePe


Dato : 04-03-04 18:02

Troels Thomsen wrote:

> >
> > I C++ er de to ens, men i C betyder void myFunc() at der er vilkårlige
> > parametre (ligesom void myFunc(...) i C++).
> >
>
> Ahhh !!! ...... f.eks. printf
>
> Hvordan finder man egentlig ud af hvor mange parametre der er , hvis man
> programmerer en sådan funktion selv?

Det kan gøres ved va_list, va_start() og va_end() som findes i stdarg.h. I
libc-manualen[1] er der et kapitel til de såkaldste "variadic functions". Og
der er også eksempler.

[1]: http://www.gnu.org/software/libc/manual/html_node/index.html. Under
"Variadic Functions"

Mvh. FePe.
--
Lægerne anbefaler: at man ser mindst 14 timers Simpsons hver dag.



Igor V. Rafienko (05-03-2004)
Kommentar
Fra : Igor V. Rafienko


Dato : 05-03-04 17:29

[ fepe@slettiscali.dk ]

[ ... ]

> > Hvordan finder man egentlig ud af hvor mange parametre der er ,
> > hvis man programmerer en sådan funktion selv?
>
> Det kan gøres ved va_list, va_start() og va_end() som findes i
> stdarg.h.


Åh? Nøyaktig hvordan forteller disse funksjonene/makroene _hvor mange_
parametre det er?

Til OP: Det korte svaret er at du har ingen mulighet til å finne ut av
det uten å supplere eksplisitt antall parametre på en eller annen
måte. *printf-familien gjør dette via formatstrengen, fx. Noe
tilsvarende vil du måtte bruke selv, dersom du bruker variadic
functions.

[ ... ]





ivr
--
<html><form><input type crash></form></html>

Byrial Jensen (06-03-2004)
Kommentar
Fra : Byrial Jensen


Dato : 06-03-04 10:29

Niels Dybdahl wrote:
>>void myFunc()
>>void myFunc(void)
>>men er nu løbet ind i en compiler der synes at der skal stå PRÆCIST det
>>samme i c og h fil, ellers giver den en type konfikt. Er det bare en
>>spisfindighed, eller er der en historie bag ?
>
>
> I C++ er de to ens, men i C betyder void myFunc() at der er vilkårlige
> parametre (ligesom void myFunc(...) i C++).

Erklæringen "void myFunc();" betyder ikke i C at der er et vilkårligt
antal parametre. Det er betyder simpelt hen at antallet og typen af
parametrene ikke er specificeret. Men ikke desto mindre skal funktionen
kaldes med det rette antal parametre med de rette typer. Da en
oversætter ikke kontrollere dette, bør man ikke bruge sådanne erklæringer.


Troels Thomsen (08-03-2004)
Kommentar
Fra : Troels Thomsen


Dato : 08-03-04 09:10

> Da en
> oversætter ikke kontrollere dette, bør man ikke bruge sådanne erklæringer.
>

Det går lige op for mig (med svarene i denne tråd) at jeg er løbet ind i
problemet engang. Dengang syntes jeg at compileren var ringe fordi den ikke
advarede mig om forkert antal parametre til funktionen. Men den blev jo
omdefineret til myFunc() og ikke myFunc(void), og dermed var det min egen
fejl.

Jeg prøver at forestille mig hvordan det er implementeret i compileren. Det
må være forholdsvist nemt: Ved funktionskaldet pusher den bare alle de
specificerede parametre på stacken, og ved RET sætter den stack pointeren
det tilsvarende antal bytes tilbage. Alt dette er kendt compile time, så man
kan ikke komme i tvivl om hvor meget man skal pushe / poppe. Noget i den
stil ??
(hvis altså stacken bruges til overførsel af parametre)

Kan man egentlig få printf til at lave en segfault eller lignende hvis man i
formatstrengen angiver mange integers, og kun overfører én ?

mvh Troels



Byrial Jensen (08-03-2004)
Kommentar
Fra : Byrial Jensen


Dato : 08-03-04 22:15

Troels Thomsen wrote:
> Jeg prøver at forestille mig hvordan det er implementeret i compileren. Det
> må være forholdsvist nemt: Ved funktionskaldet pusher den bare alle de
> specificerede parametre på stacken, og ved RET sætter den stack pointeren
> det tilsvarende antal bytes tilbage. Alt dette er kendt compile time, så man
> kan ikke komme i tvivl om hvor meget man skal pushe / poppe. Noget i den
> stil ??

Ja, parameteroverførsel foregår typisk sådan, men der er mange
variationsmuligheder for eksempel: rækkefølgen som parametrene pushes i,
om nogle og i givet fald hvor mange kan overføres i registre, om
kaldende eller kaldt funktion fjerner dem fra stakken igen, osv.

> Kan man egentlig få printf til at lave en segfault eller lignende hvis man i
> formatstrengen angiver mange integers, og kun overfører én ?

Det giver udefineret adfærd at forsøge at læse flere parametre end
specificeret i kaldet til en funktion som tager et variablet antal
parametre, så princielt må alt må ske hvis man gør det.

Hvad der sker i praksis afhænger af ens oversætter. Man vil sikkert ofte
få nogle værdien i hukommelsen fortolket som int, men der er ingen
garanti for at programmet ikke går ned.

Det omvendte, nemlig at den kaldte funktion ikke læser alle parametre,
er i øvrigt tilladt.


Niels Dybdahl (08-03-2004)
Kommentar
Fra : Niels Dybdahl


Dato : 08-03-04 11:07

> Erklæringen "void myFunc();" betyder ikke i C at der er et vilkårligt
> antal parametre.

Set fra compilerens side gør det. Compileren er nødt til at acceptere et
vilkårligt antal parametre ved kald af myFunc. Muligvis er implementeringen
af myFunc sådan at kun et bestemt antal parametre er tilladt.

> Da en oversætter ikke kontrollere dette, bør man ikke bruge sådanne
erklæringer.

Ja det er mig en gåde hvorfor man har tilladt sådan en erklæring.

Niels Dybdahl



Byrial Jensen (08-03-2004)
Kommentar
Fra : Byrial Jensen


Dato : 08-03-04 22:18

Niels Dybdahl wrote:
>>Erklæringen "void myFunc();" betyder ikke i C at der er et vilkårligt
>>antal parametre.
>
> Set fra compilerens side gør det. Compileren er nødt til at acceptere et
> vilkårligt antal parametre ved kald af myFunc. Muligvis er implementeringen
> af myFunc sådan at kun et bestemt antal parametre er tilladt.

Deklarationen af myFunc skal være til et bestemt antal parametre. Det
giver udefineret adfærd at kalde en funktion som kan tage et variable
parametre, uden en fuld erklæring af funktionen.

>>Da en oversætter ikke kontrollere dette, bør man ikke bruge sådanne
>>erklæringer.
>
> Ja det er mig en gåde hvorfor man har tilladt sådan en erklæring.

Den type erklæringer er også kaldt forældet i C99-standarden og kan
måske forventes at udgå i en senere standard.


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

Månedens bedste
Årets bedste
Sidste års bedste