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 ?
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 ?