Seite 2 von 2

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 13:32
von Hyperion
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 ;-)

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 13:49
von b.esser-wisser
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

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 13:52
von Hyperion
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...

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 13:59
von b.esser-wisser
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..

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 14:16
von Darii
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.

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 15:11
von Dauerbaustelle
Darii hat geschrieben:da gcc anscheinend nicht vor ungenutzten Variablen warnt
Dochdoch, -Wextra (oder sogar in -Wall?)

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 15:17
von 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!"

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 11. Mai 2010, 15:19
von Hyperion
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$ 

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Mittwoch 12. Mai 2010, 09:21
von sma
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

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Mittwoch 12. Mai 2010, 11:22
von 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 ()

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Mittwoch 12. Mai 2010, 11:39
von Hyperion
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!

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Mittwoch 12. Mai 2010, 11:41
von derdon
lunar: print_endline existiert ;)

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

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Mittwoch 12. Mai 2010, 15:34
von lunar
derdon hat geschrieben:lunar: print_endline existiert ;)
Stimmt :|
Ansonsten schöner Code, OCaml macht Spaß :)
Danke, auf jeden Fall :)

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 29. Juni 2010, 07:41
von pythonkönig24
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 :!: :!: :!: :!: :!: :!: :!:

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 29. Juni 2010, 08:50
von Darii
Sonst gehts dir aber schon gut, oder?

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 29. Juni 2010, 09:06
von BlackJack
@Darii: Natürlich geht's ihm gut. Er hat immerhin eine 1- (oder eine 3) bekommen. Damit hat echt niemand gerechnet. :twisted:

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 29. Juni 2010, 09:37
von b.esser-wisser
@depp24:
die Note hat aber nix mit deinen Python-Kenntnissen zu tun, oder?

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 29. Juni 2010, 13:24
von philistion
@BlackJack: Du meinst -O3 sollte man einmal zum Debuggen verwenden, um etwaige Warnungen zu erkennen?
Für ein Release reicht dann wohl -O2, ansonsten sind die Programme doch gar ein bisschen groß, oder? ;)

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Dienstag 29. Juni 2010, 23:09
von Leonidas
Also -O2 hat mit der größe ja eher wenig zu tun. Wenn man nach größe optimieren will dann wählt man eher -Os, aber das will man aber bis auf einige Sonderfälle üblicherweise nicht.

Re: Brauche Übersetzungshilfe vom Programm C zum Programm Py

Verfasst: Mittwoch 30. Juni 2010, 09:17
von lunar
@Leonidas: -O3 kann die Größe und die Abhängigkeiten einer erzeugten Binärdatei durchaus „aufblasen“ (z.B. durch die implizite Parallelisierung von Schleifen, durch das Entfalten von Schleifen oder das „Inlinen“ von Funktionen). Davon abgesehen sind diese Optimierungen sehr aggressiv und verändern Kontrollfluss sowie Semantik des Programms. Deswegen sollte man sie auch vermeiden, sofern sie nicht spürbar positiven Einfluss auf die Laufzeitgeschwindigkeit haben.