Brauche Übersetzungshilfe vom Programm C zum Programm Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@lunar
Ohne Optimierung ist doof ;)
.. und zwischen -Os -O2 und -O3 besteht auf dem PC zumindest größenmäßig kein Unterschied.

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich fordere ``-Wall`` ``-Werror`` und ``-pedantic`` ;) Wenn nicht gar noch ``-Wextra`` :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

@BlackJack: Die einzige -Wall-Warnung, die von Optimierungen abhängt, ist -Warray-bounds, und die wird auch bereits mit -O2 aktiviert. -O3 ist extrem aggressiv, und hat bei den meisten Programmen eher gegenteilige Effekte.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na, da muss noch ein wenig was getan werden:

Code: Alles auswählen

nelson@MECL-LAP3:~/src/C/snippets$ gcc -o guessanumber -Wall -O3 -Werror -pedantic guessanumber.c 
cc1: warnings being treated as errors
guessanumber.c: In function ‘main’:
guessanumber.c:21: error: ISO C90 forbids mixed declarations and code
guessanumber.c: In function ‘prompt_user’:
guessanumber.c:33: error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result
guessanumber.c:44:2: error: C++ style comments are not allowed in ISO C90
guessanumber.c:44:2: error: (this will be reported only once per input file)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@Hyperion
Ich hab doch 'C99' geschrieben, oder? (-std=c99, oder gnu99 angeben)
edit: hab den gcc-aufruf korrigiert
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, das hatte ich überlesen.

Aber man muss dennoch beim Aufruf, wie von Leonidas gefordert, den Rückgabewert von scanf abfangen:

Code: Alles auswählen

char prompt_user(char msg[]){
    char taste;
    int status;
    puts(msg);
    status = scanf("%c", &taste);
    fflush(stdin);
    return taste;
}
Wobei ich mich frage, was das genau bringt - Java würde mir nun meckern, dass ich mit status ja nix mache ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Hmm ich schaff's nicht, dass mein GCC so 'ne Meldung ausspuckt :(
Was die scanf-geschichte bringt (-en soll)?
scanf() liefert zurück wieviele Werte gelesen wurden, so kann/soll man abbrechen wenn's nicht stimmt.
IIRC ist scanf aber in sich eine Unsicherheit - man sollte da auf jeden Fall verhindern, dass das Programm beliebig viele/'unendlich viele' Bytes einliest (fgets() + sscanf(), oder so ähnlich war da die kombo).

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

b.esser-wisser hat geschrieben:Hmm ich schaff's nicht, dass mein GCC so 'ne Meldung ausspuckt :(
Hm... arbeite hier aufm lappi mit gcc 4.4.3 unter ubuntu 10.4
Was die scanf-geschichte bringt (-en soll)?
scanf() liefert zurück wieviele Werte gelesen wurden, so kann/soll man abbrechen wenn's nicht stimmt.
Nee, wieso er meckert, wenn man das ganze nicht abfragt. Denn so wie ich es vorgeschlagen habe, nutzt das einem ja noch nix ;-) Also ist es eigentlich keine Verbesserung.

Edit: Na gut, ich zeige dem Compiler, dass ich den Rückgabewert nicht einfach vergessen habe...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Also ein 'patch' :P

Code: Alles auswählen

char prompt_user(char msg[]){
	char taste;
	puts(msg);
	if(scanf("%c", &taste) != 1)
		exit(EXIT_FAILURE);
	fflush(stdin);
    return taste;  
}
und nach "getchar(); //empty prompt" in run_game() gehört noch ein "fflush(stdin);" falls da jemand doch was eingibt..
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Hyperion hat geschrieben:Nee, wieso er meckert, wenn man das ganze nicht abfragt. Denn so wie ich es vorgeschlagen habe, nutzt das einem ja noch nix Also ist es eigentlich keine Verbesserung.
So für sich genommen ist diese Warnung in der Tat recht wertlos, da gcc anscheinend nicht vor ungenutzten Variablen warnt. Das verschiebt das Problem im Zweifelsfall nur.

Da gibts dann zum Glück andere Tools für:

Code: Alles auswählen

$ scan-build gcc -std=c99 pf.c
ANALYZE: pf.c main
ANALYZE: pf.c prompt_user
pf.c:34:2: warning: Value stored to 'status' is never read
        status = scanf("%c", &taste);
        ^        ~~~~~~~~~~~~~~~~~~~
ANALYZE: pf.c run_game
1 warning generated.
scan-build: 1 bugs found.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Darii hat geschrieben:da gcc anscheinend nicht vor ungenutzten Variablen warnt
Dochdoch, -Wextra (oder sogar in -Wall?)
BlackJack

Ich wollte nur mal den Syntax-Highligher ausprobieren. In FreeBASIC:

Code: Alles auswählen

Function YesNo(prompt As String) As Integer
    Dim antwort As String
    Print prompt;
    Input  " (y/n)"; antwort
    Return Left(antwort, 1) = "y"
End Function

Sub Intro
    Dim antwort As String
    Print
    Print
    Print
    Print "            Denke dir eine Zahl zwischen 1 und 100 aus."
    Print "            Ich werde versuchen, diese Zahl zu erraten."
    Print
    Print "            Gib ein:"
    Print "            + , wenn mein Tipp zu klein ist."
    Print "            - , wenn mein Tipp zu gross ist."
    Print "            = , wenn mein Tipp stimmt."
    Print
    Print "            Hast du deine Zahl? Dann druecke die Eingabetaste!"
    Input "", antwort
End Sub

Sub Spiel
    Dim As Integer unten = 0, oben = 100, erraten = 0, versuche = 0
    Dim tipp As Integer, antwort As String
    Intro
    While Not erraten
        versuche = versuche + 1
        tipp = (unten + oben) / 2
        Print "Ist Deine Zahl"; tipp;
        Input antwort
        Select Case antwort
        Case "+"
            unten = tipp + 1
        Case "-"
            unten = tipp - 1
        Case "="
            erraten = -1
        Case Else
            Print "Das ist eine ungueltige Antwort!"
            Print "Antworte mit +/=/-"
            versuche = versuche - 1
        End Select
        If unten = oben Then
            tipp = unten
            erraten = -1
        End If
    Wend
    Print "Ich habe mit"; versuche; " Fragen herausgefunden:"
    Print "Deine Zahl ist"; tipp; "!"
End Sub

Dim weiterspielen As Integer = -1

Print
Print
Print
Print
Print "            Z A H L E N R A T E N"
Print "            ====================="
Print
While weiterspielen
    Spiel
    weiterspielen = YesNo("Noch ein Spiel")
Wend
Print
Print "Ich hoffe, Du hattest Spass mit mir!"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dauerbaustelle hat geschrieben:
Darii hat geschrieben:da gcc anscheinend nicht vor ungenutzten Variablen warnt
Dochdoch, -Wextra (oder sogar in -Wall?)
Weder noch... zumindest bei meinem Vorschlag von oben:

Code: Alles auswählen

nelson@MECL-LAP3:~/src/C/snippets$ gcc -o guessanumber -Wall -O3 -Werror -pedantic -std=c99 -Wextra guessanumber.c 
nelson@MECL-LAP3:~/src/C/snippets$ 
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Na gut, dann werde ich mal die Aufgabe lösen:

Code: Alles auswählen

import re
s = """...."""
s = "\n".join(s.splitlines()[6:])
s = re.sub(r'(?s)(["\'])(.*?)\1', lambda m:'%s%s%s' % (m.group(1), m.group(2).replace("\n", "\\n"), m.group(1)), s)
s = re.sub(r"(?s)/\*.*?\*/", "", s)
s = re.sub(r"\w+\s+(\w+)\(void\)\{", "def \\1():", s)
s = re.sub(r"int\s+(\w+)\(char\s+(\w+)\s*\[\]\s*\)\{", "def \\1(\\2):", s)
s = re.sub(r"while\(getchar\(\) != '\\n'\);", "pass", s)
s = re.sub(r"int (tipp)?", "", s)
s = re.sub(r"char \w+;", "", s)
s = re.sub(r"else if", "elif", s)
s = re.sub(r"else(\s*\{)?", "else:", s) 
s = re.sub(r"(if\s*\(.*\))\n", "\\1:\n", s)
s = re.sub(r"\{", ":", s)
s = re.sub(r"\}", "", s)
s = re.sub(r'printf\((".*?"),', "print(\\1 % ", s)
s = re.sub(r'printf\(', "print(", s)
s = re.sub(r'scanf\("%c",\s*&(\w+)\)', "\\1 = input()", s)
s = re.sub(r"\(! ", "(not ", s)
exec(s)
main()
Einfach bei "..." den Originalquelltext einfügen, die Einrückung von dem einen "if" korrigieren und voilá, Zahlenraten in Python.

Stefan
lunar

Ocaml scheint auch zu funktionieren ;)

Code: Alles auswählen

open Printf

type guess_match = TooLow | TooHigh | Matches

let rec does_guess_match guess =
  printf "Ist Deine Zahl %i?\n" guess;
  (print_string "> ");
  let resp = read_line () in
    match resp with
      | "=" -> Matches
      | "-" -> TooHigh
      | "+" -> TooLow
      | _ ->
          print_newline
            (print_string "Ungültige Eingabe, nur =,-,+ erlaubt");
          does_guess_match guess

let rec guess min max =
  let guessed = (min + max) / 2 in
  let next_try (guessed, tries) = (guessed, tries + 1) in
    match does_guess_match guessed with
      | Matches -> (guessed, 1)
      | TooLow -> next_try (guess (guessed+1) max)
      | TooHigh -> next_try (guess min (guessed-1))

let intro () =
  print_newline ();
  print_newline ();
  print_newline ();
  print_newline (print_string  "            Denke dir eine Zahl zwischen 1 und 100 aus.");
  print_newline (print_string  "            Ich werde versuchen, diese Zahl zu erraten.");
  print_newline ();
  print_newline (print_string  "            Gib ein:");
  print_newline (print_string  "            + , wenn mein Tipp zu klein ist.");
  print_newline (print_string  "            - , wenn mein Tipp zu gross ist.");
  print_newline (print_string  "            = , wenn mein Tipp stimmt.");
  print_newline ();
  print_newline (print_string  "            Hast du deine Zahl? Dann druecke die Eingabetaste!");
  read_line ()


let rec yes_no prompt =
  printf "%s [j|n] >" prompt;
  let response = read_line () in
    match String.lowercase response with
      | "j" -> true
      | "n" -> false
      | _ ->
          print_newline (print_string "Ungültige Antwort");
          yes_no prompt


let rec game () =
  intro ();
  let guessed, tries = guess 1 100 in
    printf "Ich habe Deine Zahl mit %i Versuche herausgefunden\n" tries;
    printf "Deine Zahl ist %i\n" guessed;
    if yes_no "Neues Spiel?" then
      game ()


let _ = game ()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sma hat geschrieben:Na gut, dann werde ich mal die Aufgabe lösen:

Code: Alles auswählen

import re
...
Einfach bei "..." den Originalquelltext einfügen, die Einrückung von dem einen "if" korrigieren und voilá, Zahlenraten in Python.

Stefan
:mrgreen: Very nice!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

lunar: print_endline existiert ;)

Ansonsten schöner Code, OCaml macht Spaß :)
lunar

derdon hat geschrieben:lunar: print_endline existiert ;)
Stimmt :|
Ansonsten schöner Code, OCaml macht Spaß :)
Danke, auf jeden Fall :)
pythonkönig24
User
Beiträge: 4
Registriert: Dienstag 2. März 2010, 08:57

Alles Deppen hier!
Keiner kann einem einem ne vernünftige Antwort geben....Trotzdem 1- in informatik ihr Versager!!!!!!!!!!
whooooooooooooooooooooooooooooooooo :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :!: :!: :!: :!: :!: :!: :!:
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Sonst gehts dir aber schon gut, oder?
Antworten