Einfaches C-Programm läuft unter Win7, aber nicht unter Mac

B

Bemme90

Mitglied
Thread Starter
Dabei seit
29.09.2013
Beiträge
21
Reaktionspunkte
0
Hy Leute,

wieso preisen meine Dozenten C oder C++ immer als plattformunabhägig an, wenn sie schlussendlich Bibliotheken verwenden, die OS X nicht kennt oder ähnliches?

Eigentlich wollte ich komplett auf OS X umsteigen, aber das macht es mir ja fast unmöglich, wenn ich die Beispiele des Dozenten nicht nutzen kann und er dann eventuell mein erzeugtes Programm mit seinem Windowsrechner nicht lesen kann.

Eigentlich habe ich früher gerne laienhaft programmiert (VB oder VBA), aber zur Zeit kotzt es mich nur noch an, dass nichts richtig läuft.

Kann mir mal einer sagen, wieso dieser Code nicht läuft, jedoch unter Windows schon?

1.
Code:
#include <stdio.h>/***************** Addressen 1******************
* Eingabe der Adressdaten und des Alters         *
* einfache Eingabe von Strings mit scanf        *
**********************************************/


int main(void)
{
    // Variablen
    char  vorname[21],name[21],strasse[21],plz[21],stadt[21];
    int alter;


    // Eingabe
    printf("Vorname : ");scanf("%s",&vorname);
    printf("Name    : ");scanf("%s",&name);
    printf("Strasse : ");scanf("%s",&strasse);
    printf("PLZ     : ");scanf("%s",&plz);
    printf("Stadt   : ");scanf("%s",&stadt);
    printf("Ihr Alter   : ");scanf("%i",&alter);




    // Leerzeile
    printf("\n");


    // Ausgabe
    printf("Vorname : %s\n",vorname);
    printf("Name    : %s\n",name);
    printf("Strasse : %s\n",strasse);
    printf("PLZ     : %s\n",plz);
    printf("Stadt   : %s\n",stadt);
    printf("Sie sind %i Jahre alt\n",alter);


    return 0;

}

Gemeckert wird:
warning: format specifies type 'char *' but the argument has type 'char (*)[21]' [-Wformat]|

Ich werde dann wohl oder übel auf Win7 (in einer VM) programmieren müssen, aber ich will verstehen, was hier schief läuft.

Über jeglichen Kommentar würde ich mich freuen.
- Was ist da los?
- Wie programmiert ihr?
- Andere Tipps?
 
wieso preisen meine Dozenten C oder C++ immer als plattformunabhägig an,
Vielleicht weil sie einfach Ahnung haben?


Code:
#include <stdio.h>

int main(void)
{
    // Variablen
    char  vorname[21],name[21],strasse[21],plz[21],stadt[21];
    int alter;


    // Eingabe
    printf("Vorname : ");scanf("%s",vorname);
    printf("Name    : ");scanf("%s",name);
    printf("Strasse : ");scanf("%s",strasse);
    printf("PLZ     : ");scanf("%s",plz);
    printf("Stadt   : ");scanf("%s",stadt);
    printf("Ihr Alter   : ");scanf("%i",&alter);

Hat hier keine Fehlermeldung. Steht auch in meinem über 20 Jahre alten Kernigham/Richie so. ;)
 
hier gehts auch
aber auch mit folgenden Warnings:

mutest.c:15:37: warning: format specifies type 'char *' but the argument has
type 'char (*)[21]' [-Wformat]
printf("Vorname : ");scanf("%s",&vorname);
~~ ^~~~~~~~
mutest.c:16:37: warning: format specifies type 'char *' but the argument has
type 'char (*)[21]' [-Wformat]
printf("Name : ");scanf("%s",&name);
~~ ^~~~~
mutest.c:17:37: warning: format specifies type 'char *' but the argument has
type 'char (*)[21]' [-Wformat]
printf("Strasse : ");scanf("%s",&strasse);
~~ ^~~~~~~~
mutest.c:18:37: warning: format specifies type 'char *' but the argument has
type 'char (*)[21]' [-Wformat]
printf("PLZ : ");scanf("%s",&plz);
~~ ^~~~
mutest.c:19:37: warning: format specifies type 'char *' but the argument has
type 'char (*)[21]' [-Wformat]
printf("Stadt : ");scanf("%s",&stadt);
~~ ^~~~~~
5 warnings generated.
 
Es handelt sich um keinen Fehler, sondern um eine Warnung.

Der Format String '%s' in scanf erwartet einen Zeiger auf eine char Variable, aber Du übergibts ein char array, dass in einen Zeiger auf ein array der Länge 21 gecasted wird.

Programmtechnisch ist das zwar dasselbe, da ein "char *" unbestimmte Länge hat. Dein Array aber nicht.
Der Compiler warnt Dich ja nur.

Der Code unten wandelt Deine Pointer explizit um. Nach dem Motto "Ich weiss was ich tue".
Alternativ kannst Du die Warnung mit -Wno-format ausschalten.

Code:
    // Eingabe
    printf("Vorname : ");scanf("%s",&(vorname[0]));
    printf("Name    : ");scanf("%s",&(name[0]));
    printf("Strasse : ");scanf("%s",&(strasse[0]));
    printf("PLZ     : ");scanf("%s",&(plz[0]));
    printf("Stadt   : ");scanf("%s",&(stadt[0]));
    printf("Ihr Alter   : ");scanf("%i",&alter);

EDIT: Das alles hat übrigens nichts mit "Windoes oder OSX" zu tun, sondern nur damt dass man nicht nur eine Programmiersprache erlernt, sondern auch die Eigenheiten/Möglichkeiten des benutzen Compilers.

EDIT2: Bitte keine Kommentare über den Code oben. Es ging mir um das Prinzip der Typ-Konvertierung, nicht darum das ich sowas jemals schreiben würde...
 
Der Code ist plattform-unabhaengig. Es gibt auch keine Fehlermeldung wegen einer fehlenden Bibliothek (das waere bei stdio auch sehr komisch). Der Code gibt eigentlich garkeine Fehlermeldung (error) aus, sondern nur eine Warnung (warning). Den Unterschied lernst du hoffentlich noch. Das Programm wird trotzdem kompiliert und laeuft auch ohne Probleme. Welche Warnungen ein Compiler ausgibt oder nicht, kann vom Compiler und von den verwendeten Compiler-Flags abhaengen. Deshalb scheint der Code evtl unter einem Compiler fehlerfrei zu sein, und bei einem anderen nicht.

Der Code ist nicht korrekt. Wenn Du die &-Zeichen in den betreffenden Zeilen entfernst, verschwinden auch die Warnungen...
 
  • Gefällt mir
Reaktionen: iCode
Der Code ist nicht korrekt. Wenn Du die &-Zeichen in den betreffenden Zeilen entfernst, verschwinden auch die Warnungen...

Mein Teil-Code ist korrekt. Hatte die & an den falschen Stellen entfernt, wollte es dem TE nach dem ganzen Schimpfen nur nicht so leicht machen in der Hoffnung er würde den Unterschied beim Code erkennen. Denn das Problem saß auch in diesem Fall eher vor dem Rechner. ;)

EDIT2: Bitte keine Kommentare über den Code oben. Es ging mir um das Prinzip der Typ-Konvertierung, nicht darum das ich sowas jemals schreiben würde...

Nur ein sehr kurzer Kommentar. ;) Hatte in meinem Beispiel schon den Code so korrigiert dass es ohne Fehlermeldung funktioniert. scanf erwartet einen Zeiger, während man eine int-Variable dereferenzieren muss (was durch & geschieht), hat man beim Array den Zeiger indem man den Namen ohne [.] schreibt. Wie du richtig angefügt hast, liefert &Name[0] aber das gleiche Resultat. In meinem über 20 Jahre alten Kernigham/Richie wird aber nur der Name (ohne & und ohne [0]) verwendet).
 
wieso preisen meine Dozenten C oder C++ immer als plattformunabhägig an,

C ist auch plattformunabhägig, wenn man plattformunabhägigen Code schreibt.


In deinem Fall war es ja nur ein simpler Typfehler.

P.S.:
Gemeckert wird:warning: format specifies type 'char *' but the argument has type 'char (*)[21]' [-Wformat]|

In den Zeilen darunter zeigen Dir die Tilden den betroffenen Bereich und das Zirkumflex genau die bemängelte Stelle. Ist ja kein GCC mehr. :)
 
Zuletzt bearbeitet:
Der Code ist plattform-unabhaengig. Es gibt auch keine Fehlermeldung wegen einer fehlenden Bibliothek (das waere bei stdio auch sehr komisch).

Nein, das mit der Bibliothek meine ich bei einem anderen Code. Da verwendet unser Dozent:
#include <conio.h>
Soweit ich gelesen habe, ersetzt man das durch
. Aber sowas muss man erstmal wissen.

Ich war gestern Abend einfach total genervt, da nicht mal die Einführungsprogramme laufen, die wir eigentlich nur mal compilieren sollten, um zu gucken, was passiert.

Es handelt sich um keinen Fehler, sondern um eine Warnung.

Der Format String '%s' in scanf erwartet einen Zeiger auf eine char Variable, aber Du übergibts ein char array, dass in einen Zeiger auf ein array der Länge 21 gecasted wird.

Programmtechnisch ist das zwar dasselbe, da ein "char *" unbestimmte Länge hat. Dein Array aber nicht.
Der Compiler warnt Dich ja nur.

Der Code unten wandelt Deine Pointer explizit um. Nach dem Motto "Ich weiss was ich tue".
Alternativ kannst Du die Warnung mit -Wno-format ausschalten.

Danke für die gute Erklärung.

Ja, stimmt. Es sind nur Warnungen. Ich gucke mir das nochmal in Ruhe an.

Jetzt läuft es zumindest. Er hatte noch gemeckert, dass er den Speicherort der Datei nicht findet.
Hatte alles unter einem Shared-Ordner mit der VM gespeichert. Auf dem Schreibtisch läuft das Ding.

Muss ich auch nochmal näher untersuchen
 
conio.h kannst du nur bedingt durch curses ersetzen, da muss man den code trotzdem umschreiben.

warum verwendet der dozent denn noch so olle ms-dos includes statt ANSI-C?
 
Da verwendet unser Dozent: <conio.h>
Soweit ich gelesen habe, ersetzt man das durch <curses>.
Aber sowas muss man erstmal wissen.

Sowas sollte der Dozent wissen (und vermeiden), denn die conio ist kein Teil der C Standards. Das ist eine MS-DOS-Altlast.

Bin mal gespannt, ob der auch via fflush(stdin) den Eingabepuffer leeren will. :D
 
Zurück
Oben Unten