@lunar
Ohne Optimierung ist doof
.. und zwischen -Os -O2 und -O3 besteht auf dem PC zumindest größenmäßig kein Unterschied.
hth, Jörg
Brauche Übersetzungshilfe vom Programm C zum Programm Python
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
@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.
- 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
assert encoding_kapiert
- 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
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!
- 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:
Wobei ich mich frage, was das genau bringt - Java würde mir nun meckern, dass ich mit status ja nix mache
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;
}
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- 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
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!
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hm... arbeite hier aufm lappi mit gcc 4.4.3 unter ubuntu 10.4b.esser-wisser hat geschrieben:Hmm ich schaff's nicht, dass mein GCC so 'ne Meldung ausspuckt
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.Was die scanf-geschichte bringt (-en soll)?
scanf() liefert zurück wieviele Werte gelesen wurden, so kann/soll man abbrechen wenn's nicht stimmt.
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
assert encoding_kapiert
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
Also ein 'patch'
und nach "getchar(); //empty prompt" in run_game() gehört noch ein "fflush(stdin);" falls da jemand doch was eingibt..
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;
}
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
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.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.
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.
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Dochdoch, -Wextra (oder sogar in -Wall?)Darii hat geschrieben:da gcc anscheinend nicht vor ungenutzten Variablen warnt
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!"
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Weder noch... zumindest bei meinem Vorschlag von oben:Dauerbaustelle hat geschrieben:Dochdoch, -Wextra (oder sogar in -Wall?)Darii hat geschrieben:da gcc anscheinend nicht vor ungenutzten Variablen warnt
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
assert encoding_kapiert
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
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()
Stefan
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 ()
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Very nice!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.Code: Alles auswählen
import re ...
Stefan
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Stimmtderdon hat geschrieben:lunar: print_endline existiert
Danke, auf jeden FallAnsonsten schöner Code, OCaml macht Spaß
-
- 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
Keiner kann einem einem ne vernünftige Antwort geben....Trotzdem 1- in informatik ihr Versager!!!!!!!!!!
whooooooooooooooooooooooooooooooooo