2013-05-19 11 views
6

Próbuję nauczyć się podstaw C stosując The C Programming Language - Brian Kernighan and Dennis RitchieW C jak ten parametr jest zadeklarowany w funkcji?

W poniższym programie, nie rozumiem gdzie wartość 'maxlineLength "pochodzi?

Pętla for jest ustawiona na pracę, podczas gdy "i" jest mniejsza niż maxLineLength-1, ale jaka jest wartość maxLineLength i skąd się ona bierze?

Z tego co rozumiem, kiedy parametry są zadeklarowane w funkcji podobnej do tej, przekazywana jest im wartość, więc z pewnością muszą zostać zadeklarowane gdzie indziej, aby wartość została przekazana?

#include <stdio.h> 
#define MAXIMUMLINELENGTH 1000 
#define LONGLINE 20 

main() { 
int stringLength; 
char line[MAXIMUMLINELENGTH]; 

    while((stringLength = getLineLength(line, MAXIMUMLINELENGTH)) > 0) 
    if(stringLength < LONGLINE){ 
    printf("The line was under the minimum length\n"); 
    } 
    else if (stringLength > LONGLINE){ 
     printf("%s", line); 
    } 
    return 0; 
} 


int getLineLength(char line[], int maxLineLength){ 
    int i, c; 

    for(i = 0; i< maxLineLength-1 && ((c = getchar())!= EOF) && c != '\n'; i++) 
    line[i] = c; 

    if(c == '\n') { 
     line[i] = c; 
     i++; 
    } 

    line[i] = '\0'; 
    return i; 
} 
+1

zdefiniowany jako makro '#define MAXIMUMLINELENGTH 1000' przechodzi funkcjonować' getLineLength() 'w podczas –

+0

Hi Grijesh są MAXIMUMLINELENGTH i maxLineLength dwóch zupełnie różnych zmiennych? –

+0

'MAXIMUMLINELENGTH' jest wartością stałą, która rozwija się do wartości kompilacji' 1000'at, Tak 'maxLineLength' to inna zmienna lokalna do funkcji' getLineLength() ', sprawdź ideę ponad [makro const stąd] (http: // stackoverflow. com/questions/3216752/what-is-the-the-difference-between-macro-constants-and-constant-in-c) –

Odpowiedz

5

Z tego co rozumiem, gdy parametry są deklarowane w zależności jak ta wartość jest przekazywana do nich, więc muszą być zadeklarowane na pewno gdzieś się wartość przekazana w?

W tym przypadku funkcja jest zadeklarowana i zdefiniowana w tym samym czasie. Pre-ANSI C dozwolone. Jest to dziś uważane za złą praktykę. Należy dodać poprzedającej deklaracji

int getLineLength(char line[], int maxLineLength); 

powyżej main w celu uniknięcia deklarując funkcję niejawnie.

Kiedy brakuje tej deklaracji, pierwsze użycie tej funkcji staje się jej domyślną deklaracją. Kompilator przyjmuje typy przekazywanych parametrów wyrażenia i przyjmuje, że funkcja przyjmuje odpowiednie typy jako swoje parametry. Zakłada się także, że funkcja zwraca wartość int. W tym przypadku kompilator ma wszystkie informacje niezbędne do wykrycia poprawnego podpisu, więc funkcja jest zdefiniowana poprawnie.Jednak w bardziej złożonych przypadkach (powiedzmy, jeśli maxLineLength został zadeklarowany jako long long, a nie int), doprowadziłoby to do niezdefiniowanego zachowania, dlatego zawsze powinieneś zawrzeć deklarację przekazania swoich funkcji.

2

Linia

#define MAXIMUMLINELENGTH 1000 

jest kluczem do zagadki

2
getLineLength(line, MAXIMUMLINELENGTH) 

MAXLINELENGTH jest określona stała

funkcji getLineLength Wewnątrz jest to wartość "zmapowane" na maxLineLength zmienna

3

maxLineLength to parametr/argument dla funkcji getLineLength. Podczas wywoływania tej funkcji oczekuje się podania maksymalnej długości linii.

W funkcji main, to zrobić tutaj:

getLineLength(line, MAXIMUMLINELENGTH) 

On przechodzi w MAXIMUMLINELENGTH jako długość linii Max, która jest równa 1000 jak widać tej definicji w kodzie:

#define MAXIMUMLINELENGTH 1000 

Te #define s są specyficzne dla preprocesora. Zastępuje wszystkie instancje MAXIMUMLINELENGTH zprzed kompilacją.

2

Pliki źródłowe C są wstępnie przetwarzane przed kompilacją.

#define MAXIMUMLINELENGTH 1000 jest dyrektywa C preprocessor który instruuje pre procesor zastąpić wszystkie wystąpienia ciągu MAXIMUMLINELENGTH z 1000.

Jeśli używasz konsekwentnie przez tę jednostkę kompilacji (plik .C) i decydujesz w późniejszym czasie, że długość linii powinna się zmienić, musisz tylko dokonać zmiany w dyrektywie preprocesora, a ta zmiana zostanie odzwierciedlona przez z tej jednostki kompilacji.

Więc linia getLineLength(line, MAXIMUMLINELENGTH) zostaje zwerbowany przez preprocesor do getLineLength(line, 1000)

Powiązane problemy