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'
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:
Einfach bei "..." den Originalquelltext einfügen, die Einrückung von dem einen "if" korrigieren und voilá, Zahlenraten in Python.
Stefan

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

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.