Seite 1 von 1

Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: Do Dez 13, 2012 8:15 am
von bowie_22
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

Re: Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: Do Dez 13, 2012 9:36 am
von cloidnerux
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?

Re: Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: Fr Dez 14, 2012 6:15 pm
von Xin
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!?)

Re: Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: So Dez 16, 2012 10:24 pm
von bowie_22
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.

Re: Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: So Dez 16, 2012 10:32 pm
von fat-lobyte
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.

Re: Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: Do Dez 20, 2012 5:34 am
von bowie_22
... 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.

Re: Funktionsprototyp ungleich Definition und kein Fehler

Verfasst: Mi Jan 16, 2013 5:21 pm
von mfro
... 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!