Funktionsprototyp ungleich Definition und kein Fehler

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
bowie_22
Beiträge: 20
Registriert: Sa Nov 24, 2012 5:52 am

Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von bowie_22 » Do Dez 13, 2012 8:15 am

Hallo Zusammen,

hier habe folgende Frage:

Ich definiere in einer Übersetzungseinheit (calc_xyz.c) folgende Funktion

Code: Alles auswählen

void calc_air_resistance(double A, double cw, double rho_air,double v_veh[], int length,double air_res[]){
	/*calculates the air resistance of a passenger car
	
	int i;
	for(i=0;i<length;++i)
		*(air_res+i)=0.5*rho_air*cw*A*(*(v_veh+i));

}
Damit ich die Funktion im Hauptmodul verwenden kann mach ich Folgendes:

Code: Alles auswählen

#include<stdio.h>
#include <process.h>

//constants
#define A_VEH 2.0
#define CW 0.33
#define RHO_AIR 1.3


//Prototypes
extern void calc_air_resistance(double A_veh, double cw, double rho_air,double v_veh[],double air_res[],int length);
extern int save_data(char test[], double x[], double y[], int length);

void main(void){
	double v_veh[]={30.0/3.6, 50.0/3.6, 120.0/3.6, 200/3.6};
	const int length = sizeof(v_veh)/sizeof(double);
	double air_res[4];
	calc_air_resistance(A_VEH,CW,RHO_AIR,v_veh,air_res,length);
	save_data("air_res.txt",v_veh,air_res,length);
	system("gnuplot -persist -e \"set title 'Air resistance'; plot 'air_res.txt'\"");


}
Ich habe die beiden relevanten Codezeilen hier nochmal untereinander kopiert:

Definition: void calc_air_resistance(double A, double cw, double rho_air,double v_veh[], int length,double air_res[])
Prototyp: extern void calc_air_resistance(double A_veh, double cw, double rho_air,double v_veh[],double air_res[],int length);

Man beachte, dass die Signaturen (fehlerhafterweise) unterschiedlich sind (ich habe die Signatur in der Definition nochmal geändert und vergessen, dass im Prototypen nachzuziehen).
Meine Frage: Ich hätte erwartet, dass der Compiler (VC++ 2012) hier Alarm schlägt?!
Aber weit gefehlt, ich kann den Code kompilieren und linken und bekomme dann eine Ausnahme erst zur Laufzeit geworfen!?

Bin ich irgendwie falsch gewicklet oder mache ich was grundsätzlich falsch?

Gruß

Marcus

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von cloidnerux » Do Dez 13, 2012 9:36 am

Signaturen angleichen sollte das ja beheben.
Ich nehme mal an, dass dein Compiler und Linker dachten, dass du das so haben willst.
Es kann aber auch sein, dass du *.dll nach lädst und dein Linker einfach dachte, dass die Funktion zur Laufzeit gelinkt wird. Was für einen Fehler erhälst du?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von Xin » Fr Dez 14, 2012 6:15 pm

bowie_22 hat geschrieben:Man beachte, dass die Signaturen (fehlerhafterweise) unterschiedlich sind (ich habe die Signatur in der Definition nochmal geändert und vergessen, dass im Prototypen nachzuziehen).
Meine Frage: Ich hätte erwartet, dass der Compiler (VC++ 2012) hier Alarm schlägt?!
Aber weit gefehlt, ich kann den Code kompilieren und linken und bekomme dann eine Ausnahme erst zur Laufzeit geworfen!?
Wie sieht denn eine Ausnahme zur Laufzeit bei Dir so aus?

Kompilierst Du nativ oder für .NET?
bowie_22 hat geschrieben:Bin ich irgendwie falsch gewicklet oder mache ich was grundsätzlich falsch?
Grundsätzlich erscheint mir Deine Erwartung nachvollziehbar. Daher wäre interessant zu wissen, was der Compiler denn so meldet (Warnings!?)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

bowie_22
Beiträge: 20
Registriert: Sa Nov 24, 2012 5:52 am

Re: Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von bowie_22 » So Dez 16, 2012 10:24 pm

Hallo,

Ausnahme:

Unbehandelte Ausnahme bei 0x0020162B in fuel_consumption.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000004

Ist ja auch klar, weil air_res irgendwo ins Nirvana zeigt.

Also ich habe jetzt nochmal 2 Versuche gemacht:

1) Prototyp und Definition mit vertauschter Signatur & Aufruf der Funktion wie Defintion --> hier gibt der Compiler Warnings aus.
Das Programm läuft aber richtig

2) Prototyp und Definition mit vertauschter Signatur & Aufruf der Funktion wie Protoyp --> keine Warning, Kompiliert erfolgreich,
Programm stürzt ab!!!

Fall 2 finde ich etwas helftig, da eine Inskonsistenz nicht erkannt wird und dies zu einem fehlerhaften Programm führt.
Selbst wenn ich alle Warnings bei Compiler und Linker an mache flutscht Fall 2 durch.
Das simmt mich doch nachdenklich ...

Gruß

Marcus

Der Compiler gibt tatsächlich Warnmeldungen aus.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von fat-lobyte » So Dez 16, 2012 10:32 pm

Vielleicht ist das eine der seltsamen Microsoft extensions? Füg mal die /Za-Option hinzu.

Alternativ in der GUI: http://mclserver.eecs.ucf.edu/trac/cour ... nsions.png

Außerdem: kompilierst du in C++- oder in C-Modus? Laut steinaltem C ist das glaube ich sogar erlaubt.
Haters gonna hate, potatoes gonna potate.

bowie_22
Beiträge: 20
Registriert: Sa Nov 24, 2012 5:52 am

Re: Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von bowie_22 » Do Dez 20, 2012 5:34 am

... es lag tatsächlich daran, dass ich im C-Modus war.
Im C++ Modus bekomme ich für den Fall 2 (Prototyp ungleich Definition) einen Linker-Fehler --> ok, das war meine Erwartung
Im C-Modus ist es tatsächlich so, dass für diesen Fall keine Fehlermeldung oder Warnung ausgegeben wird. Auch das Ausschalten der Spracherweiterung ändert hier nichts.

Danke nochmal für die Hinweise, ich lasse jetzt den C++-Mode an.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Funktionsprototyp ungleich Definition und kein Fehler

Beitrag von mfro » Mi Jan 16, 2013 5:21 pm

... jetzt mußt Du bloß noch Deine Formel korrigieren: der Luftwiderstand ist

Fw = 1/2 x rho x cw x A * (v^2)

Du hast das Quadrat vergessen!
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten