PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unterschiedliche syntax unter verschiedenen compilern mit C/c++ ?



doomcalyptica
27-11-2004, 15:43
hallo, ich habe das GOTO C programmierbuch (lehrbuch) und muss ja feststellen, das einige programm rezepte nicht unter jedem compiler lauffähig sind. ich beziehe mich auf den MSVC von M$.

ein besipiel:


#include <stdio.h>
#include <math.h>

#define PI 3.141529

double (*f)(); //man beachte diese zeile

int main() {

f=sin;

printf("%10f\n",sin(PI));
printf("%10f\n",(*f)(PI)); // man beachte diese zeile

return 0;
}

so dieses beispiel sollte ja unter JEDEm compiler lauffähig sein .... MSVC liefert ne tolle fehlerausgabe:


--------------------Configuration: neu - Win32 Debug--------------------
Compiling...
neu.cpp
G:\C\neu\neu.cpp(10) : error C2440: '=' : cannot convert from 'double (__cdecl *)(double)' to 'double (__cdecl *)(void)'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
G:\C\neu\neu.cpp(13) : error C2197: 'double (__cdecl *)(void)' : too many actual parameters
Error executing cl.exe.

neu.exe - 2 error(s), 0 warning(s)

laut dem GOTO C buch, sollte es unter dem gcc compiler 100% laufen (vom autor wurden alle rezepte getestet), leider habe ich keinen gcc compiler ...
und wenn da stehe, es sollte jeder compiler beherrschen .... ich vesteh das nicht, ich dachte C oder C++ ist auf jeder plattform und mit jedem compiler kompatibel ?

ein anderes beispiel:


#include <malloc.h>
#include <stdio.h>

int main() {
int size;
char *array;

size=10;

array = malloc(sizeof(char)*size);

return 0;
}

im buch steht, so solltes auf jedem compiler compiliert werden können .... MSVC liefert diese ausgabe:


--------------------Configuration: neu - Win32 Debug--------------------
Compiling...
neu.cpp
G:\C\neu\neu.cpp(10) : error C2440: '=' : cannot convert from 'void *' to 'char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
Error executing cl.exe.

neu.exe - 1 error(s), 0 warning(s)

unter win mit MSVC muss ich


array = malloc(sizeof(char)*size);

abändern in:


array = (char*)malloc(sizeof(char)*size);

1. warum diese unterschiede, was soll das?
2. was sagt ihr dazu und wie muss ich das erste beispiel abändern, damit ich pointer auf funktionen nutzen kann ?
3. kann jemand mal diese programme mit gcc unter linux testen ob dise auf funktionieren ?

wraith
27-11-2004, 15:55
Die Unterschiede sind nicht in den Compilern zu suchen; sie liegen den Sprachen.
C != C++.

Bei deinem zweiten Bsp.
In C ist der Cast von void* auf einen Objektpointer (also z.b char*) implizit.
In C++ mußt du explizit casten.
Außerdem ist der Header malloc.h falsch, der korrekte Header ist stdlib.h für malloc.

Zu deinem ersten Bsp.
C++: double (*f)(); ist ein Zeiger auf eine Funktion, die einen double zurückgibt, und _keinen_ Parameter erwartet.
C: double (*f)(); ist ein Zeiger auf eine Funktion, die einen double zurückgibt, und einen beliebige aber feste Anzahl von Parametern erwartet.

Also ist auch dieser Code korrekes C, aber kein C++.

doomcalyptica
27-11-2004, 16:03
ehm, ich verstehe nicht, was du mit dem casten meinst.
c!=c++, das ist mir klar.
und malloc.h oder stdlib.h stimmt, du hast recht ist aber nicht die lösung des problems
und ich wollte auch nur mit C programmierne.
nur leider geht dises programm nicht unter der entwicklungsumgebung MSVC von M$ ... laut büchlein, sollte es mit dem standart gcc welcher normalerweiße unter linux zu finden ist funktionieren ;)
naja, wie müsst ich das erste beispiel unter MSVC abändern, damit es funktionierrt ?

wraith
27-11-2004, 16:11
ehm, ich verstehe nicht, was du mit dem casten meinst.

Genau den Cast, den du in deinem zweiten Bsp benutzt.


c!=c++, das ist mir klar.

Ja, dein Code ist C, aber du benutzt einen C++ Compiler.
Dein MSVC ist standardmäßig ein C++ Compiler.
IIRC arbeitet der 6.0 (und älter) anhand der Dateiendung, also *.cpp (C++), und *.c (C).
Die neueren Versionen mußt du in den Projekteigenschaften umstellen, einfach mal suchen.


laut büchlein, sollte es mit dem standart gcc welcher normalerweiße unter linux zu finden ist funktionieren
Ja, wenn man ihn als C Compiler benutzt, als C++ Compiler nicht.


naja, wie müsst ich das erste beispiel unter MSVC abändern, damit es funktionierrt ?
double (*f)(); -> double (*f)(double);

doomcalyptica
28-11-2004, 11:13
danke für die hilfe, es funtkioniert ;)

doomcalyptica
28-11-2004, 12:18
naja, eine frage habe ich nochmal, gibt es einen c-compiler mit einer guten IDE für windows (win2k) ?
also kein hybrid kompiler sondern einen richtigen c compiler aber mit IDE

peschmae
28-11-2004, 13:48
z.B. das hier: http://www.bloodshed.net/devcpp.html - da kannst du sowohl C als auch C++ programmieren damit. Verwendet den MinGW-Port von GCC nach Windows und hat damit gcc und g++ zur Verfügung.

MfG Peschmä

panzi
28-11-2004, 13:48
hmmm
Es gibt MSVC(PP) 6.0 od. .NET, Borland C Builder, Dev-C++ (mit mingw32) und eclipse mit C/C++ plugin (kA ob man da immer noch die Makefile selber schreiben muss...).
Mehr weiß ich jetzt net. Naja, gVim mit gcc, aber das kann man net ne IDE nennen. ;)
Tja, KDevelop kann man mehr schlecht als recht unter cygwin mit X zum laufen bringen (suckt).

peschmae
28-11-2004, 15:10
Eclipse CDT kann mittlerweile selber Makefiles managen. Wäre aber trotzdem nicht meine erste Wahl. (Wer will schon ne IDE? ;))

MfG Peschmä