Anzeige:
Ergebnis 1 bis 9 von 9

Thema: unterschiedliche syntax unter verschiedenen compilern mit C/c++ ?

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.09.2004
    Beiträge
    69

    unterschiedliche syntax unter verschiedenen compilern mit C/c++ ?

    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:
    Code:
    #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:
    Code:
    --------------------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:
    Code:
    #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:
    Code:
    --------------------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
    Code:
    	array = malloc(sizeof(char)*size);
    abändern in:
    Code:
    	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 ?

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    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++.

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.09.2004
    Beiträge
    69
    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 ?

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von doomcalyptica
    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);

  5. #5
    Registrierter Benutzer
    Registriert seit
    12.09.2004
    Beiträge
    69
    danke für die hilfe, es funtkioniert

  6. #6
    Registrierter Benutzer
    Registriert seit
    12.09.2004
    Beiträge
    69
    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

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  8. #8
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    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).
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  9. #9
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Eclipse CDT kann mittlerweile selber Makefiles managen. Wäre aber trotzdem nicht meine erste Wahl. (Wer will schon ne IDE? )

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •