/ 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
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
ny ud i kunsten at kode i C
Fra : carsten


Dato : 05-10-06 20:10

Hej NG
jeg har programmeret en del i Pascal, men da jeg har skiftet OS
har jeg også valgt at prøve kræfter med C

og har fundet dette eksempel på
http://www.linuxbog.dk/c/c/filter-programmer.html

men der meller sig straks et par spørgsmål!

jeg er med på at main og de dertilhørende {}
er hoved koden, men hvorfor skal der stå int forand ?
int = integer !!
og hvad er den dybere mening med int argc, char *argv[]
i int main(int argc, char *argv[])

/Carsten
-----------------------------------------------------

/* ibm2iso0v1.c, forstadium til konverteringsprogram
* Codepage 865 -> iso8859.1
*/

#include <stdio.h>

static char conv[256];

int main(int argc, char *argv[])
{
int c;
int jj;

for (jj = 0; jj < 256 ; ++jj)
conv[jj] = jj;

while ( (c=getchar()) != EOF)
putchar(conv[c]);

return 0;
}

 
 
Kent Friis (05-10-2006)
Kommentar
Fra : Kent Friis


Dato : 05-10-06 20:31

Den Thu, 05 Oct 2006 21:09:50 +0200 skrev carsten:
> Hej NG
> jeg har programmeret en del i Pascal, men da jeg har skiftet OS
> har jeg også valgt at prøve kræfter med C
>
> og har fundet dette eksempel på
> http://www.linuxbog.dk/c/c/filter-programmer.html
>
> men der meller sig straks et par spørgsmål!
>
> jeg er med på at main og de dertilhørende {}
> er hoved koden, men hvorfor skal der stå int forand ?
> int = integer !!

int main()

Fordi main() er en funktion, der returnerer en integer. Denne integer
returneres til OS'et, som ofte giver mulighed for at teste på værdien.

Fx, DOS:

MITPROGRAM
IF ERRORLEVEL 1 GOTO FEJL

Eller Unix:

if mitprogram
then

OS-uafhængigt skal main returnere enten 0 for OK eller 1 for fejl, men
begge ovennævnte OS'er tillader andre værdier, så man kan skelne imellem
forskellige fejl.


> og hvad er den dybere mening med int argc, char *argv[]
> i int main(int argc, char *argv[])

C:\> mitprogram hello world

Nu er
argc=3
argv[0]="mitprogram"
argv[1]="hello"
argv[2]="world"
argv[3]=NULL

Og lige en detalje - main() kan se ud på to måder:

int main()
int main(int argc, char ** argv)

Hvis man ikke skal bruge argc og argv, vil man typisk bruge den første.

Mvh
Kent

PS: Hvis du ser nogen skrive "void main()", så lad være med at høre
efter, uanset hvor meget de påstår at vide om C. De er tydeligvis ikke
engang nået til side et endnu.
--
"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).

carsten (05-10-2006)
Kommentar
Fra : carsten


Dato : 05-10-06 20:57

Kent Friis wrote:

> int main()
> Eller Unix:
>
> if mitprogram
> then

fiks lille detalje !!

>
>> og hvad er den dybere mening med int argc, char *argv[]
>> i int main(int argc, char *argv[])
>
> C:\> mitprogram hello world
>
> Nu er
> argc=3
> argv[0]="mitprogram"
> argv[1]="hello"
> argv[2]="world"
> argv[3]=NULL

argc = argument counter
argv = argument

> Og lige en detalje - main() kan se ud på to måder:
>
> int main()
> int main(int argc, char ** argv)
>
> Hvis man ikke skal bruge argc og argv, vil man typisk bruge den første.


> PS: Hvis du ser nogen skrive "void main()", så lad være med at høre
> efter, uanset hvor meget de påstår at vide om C. De er tydeligvis ikke
> engang nået til side et endnu.

og så den lille detalje med void som man ser mange steder !
void = tomrum; hulrum
/Carsten

Arne Vajhøj (06-10-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 06-10-06 00:09

Kent Friis wrote:
> OS-uafhængigt skal main returnere enten 0 for OK eller 1 for fejl, men
> begge ovennævnte OS'er tillader andre værdier, så man kan skelne imellem
> forskellige fejl.

OS uafhængigt bruger man EXIT_SUCCESS og EXIT_FAILURE fra
stdlib.h (cstdlib i C++).

Jeg kender f.eks. en platform hvor de ikke er 0 og 1 men
derimod 1 og 44.

Arne

Peter Wing Larsen (06-10-2006)
Kommentar
Fra : Peter Wing Larsen


Dato : 06-10-06 00:50

"Arne Vajhøj" <arne@vajhoej.dk> wrote in message
news:4ggVg.20564$2g4.19476@dukeread09...
> Kent Friis wrote:
>> OS-uafhængigt skal main returnere enten 0 for OK eller 1 for fejl, men
>> begge ovennævnte OS'er tillader andre værdier, så man kan skelne imellem
>> forskellige fejl.
>
> OS uafhængigt bruger man EXIT_SUCCESS og EXIT_FAILURE fra
> stdlib.h (cstdlib i C++).
>
> Jeg kender f.eks. en platform hvor de ikke er 0 og 1 men
> derimod 1 og 44.

Af nysgerrighed: hvilken?



Arne Vajhøj (06-10-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 06-10-06 01:05

Peter Wing Larsen wrote:
> "Arne Vajhøj" <arne@vajhoej.dk> wrote in message
> news:4ggVg.20564$2g4.19476@dukeread09...
>> Jeg kender f.eks. en platform hvor de ikke er 0 og 1 men
>> derimod 1 og 44.
>
> Af nysgerrighed: hvilken?

VMS

Arne

Peter Wing Larsen (06-10-2006)
Kommentar
Fra : Peter Wing Larsen


Dato : 06-10-06 01:55

"Arne Vajhøj" <arne@vajhoej.dk> wrote in message
news:_4hVg.20579$2g4.15465@dukeread09...
> Peter Wing Larsen wrote:
>> "Arne Vajhøj" <arne@vajhoej.dk> wrote in message
>> news:4ggVg.20564$2g4.19476@dukeread09...
>>> Jeg kender f.eks. en platform hvor de ikke er 0 og 1 men
>>> derimod 1 og 44.
>>
>> Af nysgerrighed: hvilken?
>
> VMS

Jeg tænkte det nok. Ligger der nogen fornuft bag valget af værdier?



Arne Vajhøj (06-10-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 06-10-06 02:35

Peter Wing Larsen wrote:
> "Arne Vajhøj" <arne@vajhoej.dk> wrote in message
> news:_4hVg.20579$2g4.15465@dukeread09...
>> Peter Wing Larsen wrote:
>>> "Arne Vajhøj" <arne@vajhoej.dk> wrote in message
>>> news:4ggVg.20564$2g4.19476@dukeread09...
>>>> Jeg kender f.eks. en platform hvor de ikke er 0 og 1 men
>>>> derimod 1 og 44.
>>> Af nysgerrighed: hvilken?
>> VMS
>
> Jeg tænkte det nok. Ligger der nogen fornuft bag valget af værdier?

Hvordan definerer du fornuft for den slags værdier ?

De er ikke helt tilfældige !

På VMS angiver de laveste 3 bit status:

000 = warning but should continue
001 = ok
010 = error but should continue
011 = informational but should continue
100 = fatal and error should stop

så det er givet at EXIT_SUCCESS skal slutte
med 001 og EXIT_FAILURE skal slutte med 100.

Imidlertid havde forskellige status allerede fået værdier
langt tid inden den første C compiler blev lavet til
VMS og søger man i dem efter 001'ere, så falder man
hurtigt over:

#define SS$_NORMAL 1

som ser OK ud til en EXIT_SUCCESS og søger man efter
100'ere, så finder man:

#define SS$_ACCVIO 12
#define SS$_BADPARAM 20
#define SS$_EXQUOTA 28
#define SS$_NOPRIV 36
#define SS$_ABORT 44
#define SS$_BADATTRIB 52
#define SS$_BADESCAPE 60
....

og SS$_ABORT lyder altså helt klart som det bedste
bud på EXIT_FAILURE.

Så der er en vis logik bagved omend der selvfølgelig
også er truffet nogle valg af C compiler teamet.

(jeg har taget C definitionen af SSDEF, da jeg ikke
ved om du læser Macro-32)

Arne


Bertel Lund Hansen (05-10-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-06 20:43

carsten skrev:

> og hvad er den dybere mening med int argc, char *argv[]
> i int main(int argc, char *argv[])

Meningen er at man skal kunne overføre parametre fra en
kommandolinje. Hvis man f.eks. vil have et testprogram som skal
kunne køre vidt forskellige antal gennemløb, kan man starte det
med:

   test(1000)

I programkoden skal man så omsætte char-variablen argv[1] med
værdien "1000" til en int med værdien 1000.

I mange programmer får man ikke brug for den slags. Så kan man
lade main-parentesen være tom.

Jamen hov! Hvorfor var det ikke argv[0]?
Fordi den pr.vedtægt altid skal returnere navnet på programmet
selv. Det kender du fra Pascal ... æh, og derfra kender du også
overførsel af kommandoparametre, eller hva'?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

carsten (05-10-2006)
Kommentar
Fra : carsten


Dato : 05-10-06 21:07

Bertel Lund Hansen wrote:

> carsten skrev:
>
>> og hvad er den dybere mening med int argc, char *argv[]
>> i int main(int argc, char *argv[])
>
> Meningen er at man skal kunne overføre parametre fra en
> kommandolinje. Hvis man f.eks. vil have et testprogram som skal
> kunne køre vidt forskellige antal gennemløb, kan man starte det
> med:
>
> test(1000)
>
> I programkoden skal man så omsætte char-variablen argv[1] med
> værdien "1000" til en int med værdien 1000.
>
> I mange programmer får man ikke brug for den slags. Så kan man
> lade main-parentesen være tom.
>
> Jamen hov! Hvorfor var det ikke argv[0]?
> Fordi den pr.vedtægt altid skal returnere navnet på programmet
> selv. Det kender du fra Pascal ... æh, og derfra kender du også
> overførsel af kommandoparametre, eller hva'?

jo det gør jeg da vist bare på en lidt anden måde, så vidt jeg husker
det er ved at være, et par dage siden, jeg sidst var ombord i pascal
/Carsten


carsten (05-10-2006)
Kommentar
Fra : carsten


Dato : 05-10-06 21:15

carsten wrote:

> Bertel Lund Hansen wrote:
>
>> carsten skrev:
>>
>>> og hvad er den dybere mening med int argc, char *argv[]
>>> i int main(int argc, char *argv[])
>>
>> Meningen er at man skal kunne overføre parametre fra en
>> kommandolinje. Hvis man f.eks. vil have et testprogram som skal
>> kunne køre vidt forskellige antal gennemløb, kan man starte det
>> med:
>>
>> test(1000)
>>
>> I programkoden skal man så omsætte char-variablen argv[1] med
>> værdien "1000" til en int med værdien 1000.
>>
>> I mange programmer får man ikke brug for den slags. Så kan man
>> lade main-parentesen være tom.
>>
>> Jamen hov! Hvorfor var det ikke argv[0]?
>> Fordi den pr.vedtægt altid skal returnere navnet på programmet
>> selv. Det kender du fra Pascal ... æh, og derfra kender du også
>> overførsel af kommandoparametre, eller hva'?
>
> jo det gør jeg da vist bare på en lidt anden måde, så vidt jeg husker
> det er ved at være, et par dage siden, jeg sidst var ombord i pascal
> /Carsten

fandt lige et gammelt pascal program,
parmcount & parmstr()
er såvidt jeg kan tolke
argc & argv[]
/Carsten

Bertel Lund Hansen (05-10-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-06 23:12

carsten skrev:

> fandt lige et gammelt pascal program,
> parmcount & parmstr()
> er såvidt jeg kan tolke
> argc & argv[]

Just præcis.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Michael Rasmussen (05-10-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 05-10-06 23:43

On Thu, 05 Oct 2006 22:14:34 +0200, carsten wrote:

>
> fandt lige et gammelt pascal program, parmcount & parmstr()
Det er godt nok nogen år siden, jeg sidst har skrevet et program i Pascal
- Turbo Pascal i ovenstående tilfælde, men hedder de ikke paramcount og
paramstr?

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


Per Abrahamsen (06-10-2006)
Kommentar
Fra : Per Abrahamsen


Dato : 06-10-06 13:18

Arne Vajhøj <arne@vajhoej.dk> writes:

> Kent Friis wrote:
>> OS-uafhængigt skal main returnere enten 0 for OK eller 1 for fejl, men
>> begge ovennævnte OS'er tillader andre værdier, så man kan skelne imellem
>> forskellige fejl.
>
> OS uafhængigt bruger man EXIT_SUCCESS og EXIT_FAILURE fra
> stdlib.h (cstdlib i C++).
>
> Jeg kender f.eks. en platform hvor de ikke er 0 og 1 men
> derimod 1 og 44.

exit (0) er garanteret af C standarden til at indikere success. For
operativsystemer der bruger andre værdier, er det op til C runtime at
oversætte.

exit (1) kan (som i eksemplet overfor) også indikere success.

Søg
Reklame
Statistik
Spørgsmål : 177416
Tips : 31962
Nyheder : 719565
Indlæg : 6407859
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste