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