ANSI C - Funktion wird nicht kompiliert - Warum?

Gast #7286462
Lesenswert?

Hallo Leute,

Ich bin noch Anfänger, darum möchte ich mich vorab für "dumme" Fragen 
entschuldigen.
Ich bin weder faul, noch möchte ich meine Hausübung weiterdelegieren.

Bei meinem Compiler (MIKROE) wird der Aufruf einer Funktion nicht 
kompiliert.
Wie ich das merken: Ganz einfach. Egal ob ich den Aufruf ausklammer oder 
nicht, Die Programmgrößße ist immer 1 Byte :-/

Also 1 Byte:
1
void Config(){
2
     ANSELA     = 0;
3
     PORTA      = 0;
4
     TRISA      = 0xCA;
5
     OSCCON = 0x7B;
6
}
7

8
void main() {
9
     Config();
10
}

Und ebenso 1 Byte:
1
void Config(){
2
     ANSELA     = 0;
3
     PORTA      = 0;
4
     TRISA      = 0xCA;
5
     OSCCON = 0x7B;
6
}
7

8
void main() {
9
     //Config();
10
}

Also gehe ich davon aus, dass die Function "Config" nicht compiliert 
wird.
Aber warum?
Ideen?
Gast #7286518
Lesenswert?

Hallo,

svs schrieb:
> Also gehe ich davon aus, dass die Function "Config" nicht compiliert
> wird.
> Aber warum?
> Ideen?

Mach erstmal weiter. So hat das noch nichts mit einem Programm im dem 
Sinne zu tun, der Compiler optimiert alles weg!

Für welches System (PC,µController, usw) willst du denn ein C Programm 
schreiben ?
Gast #7286525
Lesenswert?

Georg G. schrieb:
> und woher kennt der Compiler dann die Adresse von zB ANSELA?
> Meine Kristallkugel sagt, dass der Compiler mit einem Fehler abbricht...

Du hast doch beim erstellen des Programms sicher angegeben was du 
Programmieren möchtest. Wenn deine IDE das nicht automatisch machst must 
du halt auch den #include <µController.h>, so weiß der Compiler was 
ANSELA ist und wo es er das Register findet.
Beitrag #7286555 wurde von einem Moderator gelöscht.
#7286587
Lesenswert?

svs schrieb:
> Wie ich das merken: Ganz einfach. Egal ob ich den Aufruf ausklammer oder
> nicht, Die Programmgrößße ist immer 1 Byte :-/

Die Programmgröße sind 12 Worte.

Jetzt müsste nur noch jemand sich mit dem 'P12F1572' auskennen, ob das 
vom Startupcode so hin kommt. Denn für die 'Config()' fängt der Compiler 
nicht an, extra 'ne Funktion zu basteln. Das wird einfach nebenbei mit 
'ausgefüllt'.

(Wieso braucht man in dieser 'IDE' eigentlich keine '*.h'?)
Gast #7286591
Lesenswert?

Ralf G. schrieb:
> (Wieso braucht man in dieser 'IDE' eigentlich keine '*.h'?)

Weil das „Device“ beim Anlegen des IDE-Projekts angegeben wird (im 
Screenshot links ersichtlich), und die IDE damit automatisch die 
benötigten Header einbindet. Ist beim Microchip Studio übrigens genauso.
#7287100
Lesenswert?

Rolf M. schrieb:
> Jörg W. schrieb:
>> Nein. Es müsste
>> int main(void) …
>> oderint main(int argc, char **argv) …
>> heißen.
>>
>> Die leere Klammer ist in C nicht gleichbedeutend zu "(void)".
>
> Gerade bei main() ist es egal, weil das nur für den Aufrufer relevant
> ist, main() aber nicht explizit aufgerufen wird.

In einem hosted-environment (mit OS) sind die Signaturen
1
int main()

und
1
int main(int, char**)

standardisiert. Beliebig viele weitere sind aber möglich durch die 
Implementierung.

In einem freestanding-Environment (bspw. auf µC ohne OS) ist es völlig 
implementation-defined, welche Funktion der entry-point ist. 
Üblicherweise ist es aber
1
[[noreturn]] int main(void)
#7287129
Lesenswert?

Harry L. schrieb:
> Wilhelm M. schrieb:
>> In einem hosted-environment (mit OS) sind die Signaturen
>> int main()
>>
>> und
>> int main(int, char**)
>>
>> standardisiert. Beliebig viele weitere sind aber möglich durch die
>> Implementierung.
>
> Nein!
> Standardisiert ist
>
1
> int main(int argc, char *argv[])
2
>

Nö. Schau nach unter

C-Standard:
5.1.2.1 Freestanding environment und
5.1.2.2.1 Program startup
Moderator Persönliche Seite #7287138
Lesenswert?

Wilhelm M. schrieb:
> In einem hosted-environment (mit OS) sind die Signaturen
>
> int main()

In C++ ist "int main()" gleichbedeutend mit "int main(void)". In C ist 
es das nicht.

Harry L. schrieb:
> char *argv[]

… ist dasselbe wie "char **argv". Die void-Version ist trotzdem auch 
explizit vom Standard vorgesehen.

Rolf M. schrieb:
> Gerade bei main() ist es egal, weil das nur für den Aufrufer relevant
> ist, main() aber nicht explizit aufgerufen wird.

Naja, habe nicht nachgeguckt, aber könnte genau genommen undefined 
behaviour sein, wenn man es nicht so deklariert. Außerdem wird es 
natürlich in vielen Fällen schon aufgerufen als
1
exit(main());

Selbst im Startup-Code der avr-libc ist das so, nur dass es dort kein 
argc/argv als Argument gibt. Prinzipiell würde es der Anwendung sogar 
offen stehen, in .init8 noch argc (in r24/r25) und argv (r26/r27) 
passend zu setzen. ;-)
#7287199
Lesenswert?

Harry L. schrieb:
> Nein!

Hier der Originaltext von
https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf

"The function called at program startup is named main. The 
implementation declares no prototype for this function. It shall be 
defined with a return type of int and with no parameters:

int main(void) { /* ... */ }

or with two parameters (referred to here as argc and argv, though any 
names may be used, as they are local to the function in which they are 
declared):

int main(int argc, char *argv[]) { /* ... */ }

or equivalent or in some other implementation-defined manner."

Man beachte insbesondere die letzte Zeile.

Jörg W. schrieb:
> Rolf M. schrieb:
>> Gerade bei main() ist es egal, weil das nur für den Aufrufer relevant
>> ist, main() aber nicht explizit aufgerufen wird.
>
> Naja, habe nicht nachgeguckt, aber könnte genau genommen undefined
> behaviour sein, wenn man es nicht so deklariert.

Nein, allerdings wohl implementation-defined, siehe oben.

> Außerdem wird es natürlich in vielen Fällen schon aufgerufen al
> exit(main());

Hmm, hab ich noch nie gesehen. In C++ wäre das verboten. Da ist explizit 
vorgegeben, dass man main() nicht aufrufen darf, aber diese Regel 
scheint es in C nicht zu geben.

> Selbst im Startup-Code der avr-libc ist das so, nur dass es dort kein
> argc/argv als Argument gibt.

Naja, Startup-Code ist dann doch noch was anderes, da Teil der 
Implementation.
#7287211
Lesenswert?

Wilhelm M. schrieb:
> Rolf M. schrieb:
>> Man beachte insbesondere die letzte Zeile.
>
> Genau das habe ich oben geschrieben und die entsprechenden Kapitel im
> C-Standard benannt.

Ich hab's lieber direkt zitiert, weil ich vermute, dass einige doch 
nicht nachschlagen, sondern lieber weiter hier was anderes behaupten.

> Das gilt wie gesagt in einem hosted-environment.
>
> Bei freestanding ist das anders (s. mein Beitrag oben).

Ja. Den Teil hab ich jetzt nicht extra mit zitiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren