Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

Fehler im C-Code

<<< zurück   -1- -2-  
Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 08.04.2010 um 19:42 Uhr

Zitat von Motocross_M:

ja in der entwicklungsumgebung Code::Blocks gibts glaub nen debugger, ich weiß aber nicht wirklich so recht wie der funktioniert, da in der anleitung nichts über die funktionsweise steht.

STFW/RTFM

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

bredator - 41
Champion (offline)

Dabei seit 03.2008
5319 Beiträge

Geschrieben am: 08.04.2010 um 19:44 Uhr

Zitat von Klischeepunk:

Hierzu allerdings mal wieder ein Snap von Wiki:

Zitat:

1968 sprach sich Edsger W. Dijkstra in seinem Aufsatz Go To Statement Considered Harmful (der Titel geht allerdings auf N. Wirth zurück), für eine Abschaffung des GOTO-Befehls in allen höheren Programmiersprachen aus. Das ist ohne weiteres möglich, da jedes GOTO-Programm durch ein While-Programm simuliert werden kann. Diese Meinung wurde in der Programmierausbildung bald zum Dogma erhoben; in einigen Sprachen wie Java wurde bewusst überhaupt kein GOTO-Befehl eingeführt (abgesehen von einem „gelabelten“ break – Schlüsselwort). Und dennoch behält man sich eine spätere Implementierung vor – GOTO ist als Schlüsselwort auch in Java reserviert. Andererseits unterstützen zahlreiche alte und neue imperative Programmiersprachen, z. B. Pascal, C, C++ und selbst das 2000 entwickelte C# und das 2007 publizierte D, noch GOTO. 2009 wurde GOTO nachträglich auch in die Skriptsprache PHP eingeführt (unter der Bezeichnung Jump Label).
Eine weniger kritisierte Variante des GOTO-Befehls ist das vorzeitige Verlassen eines Unterprogramms durch einen return-Befehl, das Abbrechen einer Schleife durch einen break-Befehl oder Abbrechen eines bestimmten Schleifendurchlaufs durch eine continue-Anweisung. Trotzdem gilt es in einigen Programmiersprachen als guter Programmierstil, wenn ein Block einen Einsprungpunkt und einen Ausstiegspunkt hat. In Sprachen, welche Ausnahmenbehandlung erlauben, wird dagegen die „Ein-Ausstiegpunkt“-Regel als obsolet angesehen, da throw-Anweisungen die Argumentation hinter dieser Regel ad absurdum führen.
In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf GOTO zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt. Besonders in zeitkritischen Programmteilen ist ein goto deutlich effektiver als am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchzuführen. Angesichts der Geschwindigkeit heutiger Prozessoren ist das Attribut zeitkritisch allerdings meist im Vergleich zu den Wartungskosten bei "Spaghetticode" vernachlässigbar.
Von einigen Entwicklern wurde auf der Linux Kernel Mailing List die häufige Verwendung von GOTO im Quellcode von Linux diskutiert. Linus Torvalds sagte dabei, dass die Verwendung von GOTO die Lesbarkeit des Quellcodes in vielen Fällen sogar deutlich erhöhen könne.


Gut platzierte Gotos können auch in OOP Zeiten sinnbringend sein. Man sollte sich nur nicht verleiten lassen sein Programm darauf aufzubauen, sondern sie selten und vernünftig einzusetzen.
Manchmal (und da muss ich Torvalds durchaus rechtgeben) bringen Gotos wesentlich klareres Verständnis als wenn man 12 Schleifen erstmal verinnerlichen muss, um zu begreifen wann wo welcher schritt erreicht wird und wo er endet.

Man sollte auch berücksichtigen, dass man bei einem Einsprung in Methoden ebenso diverse "gotos" hat. Das Argument "es ist besser" ist damit imho hinfällig - sollte es je gegolten haben.


Ja, da widerspreche ich dir auch gar nicht, dass einige gut plazierte Gotos sogar Arbeit sparen, gar keine Frage. Allerdings sollte kein Programm nur mit Gotos arbeiten, da es dann irgendwann nicht mehr vernünftig wartbar ist, bzw. das schon bei einigen Sprüngen hin und her nicht mehr gut lesbar ist. Das habe ich vielleicht etwas zu missverständlich ausgedrückt.

Lache nicht über jemanden, der einen Schritt zurück macht. Er könnte Anlauf nehmen.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 19:44 Uhr

okay danke werds gleich ausprobieren ^^

Ich hab keine Fußzeile nötig.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 08.04.2010 um 20:26 Uhr

Zitat von Motocross_M:

okay danke werds gleich ausprobieren ^^

Achja: build logs

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 15.04.2010 um 19:18 Uhr

So ich habe noch ein neues Programm geschrieben, bzw. eine neue Idee entwickelt: Ich wollte ein eingegebenes Wort ver- und auf Befehl wieder entschlüsseln, indem ich das eingegebene Wort zu einem int konvertiere und auch andersrum.
Doch ich weiß nicht so recht, wie ich das hinkriegen soll. Hier ein erster Versuch, der nicht funktioniert:

#include <stdio.h>

void VER (void)
{
char versch [100];
printf ("\n\nVerschlüsselung, bitte Wort eingeben:\n\n");
scanf ("%s", versch);
printf ("\n\nVerschlüsselt: %d", versch);
}

void ENT (void)
{
char entsch [100];
printf ("\n\nEntschlüsselung, bitte Zahlencode eingeben:\n\n");
scanf ("%d", &entsch);
printf ("\n\nEntschlüsselt: %s", entsch);
}
int main (void)
{
int wahl;
printf ("Ver-/Entschlüsselung (nur ein Wort):\n\t1.)Verschlüsseln\n\t2.)Entschlüsselung\n\n");
scanf ("%d", &wahl);
switch (wahl)
{
case 1 : VER();
break;
case 2 : ENT();
break;
default : printf ("\nUnbekannte Eingabe");
break;
}
}




Ich hab keine Fußzeile nötig.

TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 15.04.2010 um 19:36 Uhr

Naja, direkt Umwandeln geht nicht. Ein Text, also String ist ein Array von Chars. Jeder Char entspricht dabei einem 7-Bit-Zahlenwert (die so genannte ASCII-Tabelle). Ein Integer ist mit einem 32-Bit-Compiler 32 Bit groß.

Was du jetzt machen möchtest, ist, ein Array aus 100 Zeichen à 8 Bit in einen Wert von 32 Bit zu pressen. Sprich, du möchtest 800 Bit in 32 Bit packen, was nicht gehen kann.

Sicher, es gibt Kompressionsverfahren wie zip oder 7z. Allerdings sind die etwas komplexer, als dass man sie in 3 Zeilen runterschreiben könnte.

Mörps mörps blubbs!

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 15.04.2010 um 20:45 Uhr

Lösungsvorschläge?

Ich hab keine Fußzeile nötig.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 15.04.2010 um 20:50 Uhr

Zitat von Motocross_M:

Lösungsvorschläge?

Auch hier:
1. Lern deine Datentypen kennen
2. Lern C-Strings kennen (char arrays)
3. Lern typecasts kennen.

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 15.04.2010 um 20:55 Uhr

Zitat von Klischeepunk:

Zitat von Motocross_M:

Lösungsvorschläge?

Auch hier:
1. Lern deine Datentypen kennen
2. Lern C-Strings kennen (char arrays)
3. Lern typecasts kennen.


Danke :-D

Ich hab keine Fußzeile nötig.

Ketzu - 39
Experte (offline)

Dabei seit 11.2008
1535 Beiträge
Geschrieben am: 16.04.2010 um 07:04 Uhr
Zuletzt editiert am: 16.04.2010 um 11:31 Uhr

Ein Array in C ist ein Pointer auf das erste Feld des Arrays und enthält somit eine Adresse, die lässt sich ausgeben und all das, ja, aber wenn du sie beschreibst kann das zu witzigen Problemen führen. (Die selbe Sorte "witzig" wie ein Programm compilieren und den PC ausgehen sehen *gg*)

Einen komplexes Objekt (wie z.B. ein String) als einzelne Zahl (int) darzustellen wäre eine Hashfunktion, eine so genannte Einwegfunktion, die man nicht umkehren kann. (Man kann aus dem Wert also nicht direkt die Eingabe wieder zurückgewinnen)

Wenn du den String hashst und dann in einer Tabelle ablegen würdest, könntest du zumindest alle "verschlüsselten" (eigentlich: gespeicherten) Strings wieder umkehren indem du einfach an dem Tabellenplatz schaust, ob ein Eintrag vorhanden ist, oder nicht. (Sofern du keine Kollisionen, also Eingaben mit dem selben Hashwert, hast)

(edit)Normalerweise ist eine verschlüsselte Botschaft mindestens so lang, wie die ursprüngliche, da sie ja genau so viel Information enthält/enthalten soll, wie die Botschaft selbst.
Wenn du dich auf 100 Zeichen lange Strings mit Großbuchstaben+Leerzeichen+.+?+,+/0+! (ich wollte nur auf 32 kommen) beschränken würdest, bräuchtest du immernoch einen Zahlenbereich von 0 bis 32^100 (ohne sinnlose zeichen noch 27^100), das wären 2^500 = 500 Bit, du bräuchtest also 36 Ints (a 4 byte) um deine Texte zu codieren.

Am besten siehst du dir mal verschiedene (einfache) Kryptografische Verfahren an, dort wird meistens auch ein bisschen auf die Theorie dazu eingegangen :)


Eine Meinung vertreten, heißt nicht sie zu teilen, sondern versuchen sie zu verstehen.

TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 16.04.2010 um 09:51 Uhr

Schöner Beitrag. Wobei ich ehrlich gesagt bezweifle, dass er dem Threadersteller viel bringt. Wenn er gerade anfängt mit C Programmieren und noch nicht von TypeCasting gehört hat sowie sich noch nicht wirklich mit den Datentypen beschäftigt hat, ist Kryptografie doch etwas schwere Kost. An seiner Stelle wäre es evtl. sinnvoller, mit einfachereren Sachen anzufangen (was mir häufig für Anfänger vorgesetzt worden ist, war ein Spiel zum Zahlen raten. Der Computer generiert ne Zufallszahl und der Benutzer muss sie mit möglichst wenig Versuchen erraten. Dann das ganze erweitert um nen Zähler, der angibt, wie viele Versuche man benötigt hat etc.)

Mörps mörps blubbs!

Ketzu - 39
Experte (offline)

Dabei seit 11.2008
1535 Beiträge
Geschrieben am: 16.04.2010 um 10:02 Uhr

In einfachen Formen ist Krypto ziemlich Anwenderfreundlich und soweit ich gesehen hab, lernen einige Leute schneller wenn sie dabei an Sachen arbeiten die sie interessiert.
Einfache Beispiele (mit denen so Kryptosachen meist losgehen) sind Verschiebungschiffres, die dann eben jeden Wert im String um einen bestimmten Wert verschieben. So lernt man zumindest Chars und ein wenig über Typecasts. :)

Das mit den Hashs war nur aus langeweile mit dazu gekritzelt :D

Eine Meinung vertreten, heißt nicht sie zu teilen, sondern versuchen sie zu verstehen.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 16.04.2010 um 11:01 Uhr
Zuletzt editiert am: 16.04.2010 um 11:06 Uhr

Zitat von Ketzu:

Ein Array in C ist ein Pointer auf das erste Feld des Arrays und enthält somit eine Adresse, die lässt sich ausgeben und all das, ja, aber wenn du sie beschreibst kann das zu witzigen Problemen führen. (Die selbe Sorte "witzig" wie ein Programm compilieren und den PC ausgehen sehen *gg*)

Einen komplexes Objekt (wie z.B. ein String) als einzelne Zahl (int) darzustellen wäre eine Hashfunktion, eine so genannte Einwegfunktion, die man nicht umkehren kann. (Man kann aus dem Wert also nicht direkt die Eingabe wieder zurückgewinnen)

Wenn du den String hashst und dann in einer Tabelle ablegen würdest, könntest du zumindest alle "verschlüsselten" (eigentlich: gespeicherten) Strings wieder umkehren indem du einfach an dem Tabellenplatz schaust, ob ein Eintrag vorhanden ist, oder nicht. (Sofern du keine Kollisionen, also Eingaben mit dem selben Hashwert, hast)

Soweit so gut, wobei anzumerken wäre, das über Alphabete & Grammatiken auch 2 Wegefunktionen geschaffen werden können.

Zitat von Ketzu:


Grundsätzlich ist eine verschlüsselte Botschaft mindestens so lang,
wie die ursprüngliche, da sie ja genau so viel Information enthält/enthalten soll, wie die Botschaft selbst.

Hier wirds grundsätzlich falsch. Ist sie nicht. Der Informationsgehalt muss der selbe bleiben, soweit, so richtig. Allerdings ist durch die Einführung von Codes (Zeichen mit Aussage, Ersatzzeichen für ganze Sätze, Worte für Satzteile, etc.) bereits eine "Art der Verschlüsselung" möglich wo die Länge auch in der Mindestlänge massiv variiert. Hier wird ja nicht unbedingt ein neues Alphabet (Geheimtextalphabet) genutzt, sondern ein ersetzen nach "Vorbild" der beschriebenen Hashfunktion. Ganz Codebücher die bis heute eingesetzt werden machen sowas möglich. - Auch das ist bereits als Verschlüsselung zu sehen.
/e: Stichwort: Verschlüßeln durch Ersetzen

Zitat von Ketzu:


Wenn du dich auf 100 Zeichen lange Strings mit Großbuchstaben+Leerzeichen+.+?+,+/0+! (ich wollte nur auf 32 kommen) beschränken würdest, bräuchtest du immernoch einen Zahlenbereich von 0 bis 32^100 (ohne sinnlose zeichen noch 27^100), das wären 2^500 = 500 Bit, du bräuchtest also 36 Ints (a 4 byte) um deine Texte zu codieren.

Am besten siehst du dir mal verschiedene (einfache) Kryptografische Verfahren an, dort wird meistens auch ein bisschen auf die Theorie dazu eingegangen :)

Hier würd sich bspw. Rot/Caesar für Monoalphabetische, Vigenere für die Polyalphabetische anbieten.

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Ketzu - 39
Experte (offline)

Dabei seit 11.2008
1535 Beiträge
Geschrieben am: 16.04.2010 um 11:41 Uhr
Zuletzt editiert am: 16.04.2010 um 11:43 Uhr

Zitat von Klischeepunk:


Hier wirds grundsätzlich falsch. Ist sie nicht. Der Informationsgehalt muss der selbe bleiben, soweit, so richtig. Allerdings ist durch die Einführung von Codes (Zeichen mit Aussage, Ersatzzeichen für ganze Sätze, Worte für Satzteile, etc.) bereits eine "Art der Verschlüsselung" möglich wo die Länge auch in der Mindestlänge massiv variiert. Hier wird ja nicht unbedingt ein neues Alphabet (Geheimtextalphabet) genutzt, sondern ein ersetzen nach "Vorbild" der beschriebenen Hashfunktion. Ganz Codebücher die bis heute eingesetzt werden machen sowas möglich. - Auch das ist bereits als Verschlüsselung zu sehen.
/e: Stichwort: Verschlüßeln durch Ersetzen


Okay, Korrektur Nummer 1: Normalerweise statt Grundsätzlich, schlechtes/falsches Wort in dem Fall gewählt. (Ich hätte lieber nie zuhören sollen als mir jemand erklärte was Juristen mit "Grundsätzlich" meinen :D )
(Wobei Normalerweise in dem Fall so zu verstehen ist, das gerade wichtige Verschlüsselungsverfahren (die meist auch "einfach als Hardware realisierbar sein sollen") soetwas meist nicht verwenden, z.B. AES)

Zitat von Klischeepunk:


Soweit so gut, wobei anzumerken wäre, das über Alphabete & Grammatiken auch 2 Wegefunktionen geschaffen werden können.


Die Anmerkung in dem Zusammenhang müsstest du mir kurz erklären, da ich noch am Verständnispunkt stehe, das es keine Bijektion zwischen zwei Mengen unterschiedlicher Mächtigkeit geben kann.
(Kurz: "Ich blick grad nich wie du das meinst" ;) )

Eine Meinung vertreten, heißt nicht sie zu teilen, sondern versuchen sie zu verstehen.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 16.04.2010 um 13:07 Uhr
Zuletzt editiert am: 16.04.2010 um 15:27 Uhr

Zitat von Ketzu:

Zitat von Klischeepunk:


Hier wirds grundsätzlich falsch. Ist sie nicht. Der Informationsgehalt muss der selbe bleiben, soweit, so richtig. Allerdings ist durch die Einführung von Codes (Zeichen mit Aussage, Ersatzzeichen für ganze Sätze, Worte für Satzteile, etc.) bereits eine "Art der Verschlüsselung" möglich wo die Länge auch in der Mindestlänge massiv variiert. Hier wird ja nicht unbedingt ein neues Alphabet (Geheimtextalphabet) genutzt, sondern ein ersetzen nach "Vorbild" der beschriebenen Hashfunktion. Ganz Codebücher die bis heute eingesetzt werden machen sowas möglich. - Auch das ist bereits als Verschlüsselung zu sehen.
/e: Stichwort: Verschlüßeln durch Ersetzen


Okay, Korrektur Nummer 1: Normalerweise statt Grundsätzlich, schlechtes/falsches Wort in dem Fall gewählt. (Ich hätte lieber nie zuhören sollen als mir jemand erklärte was Juristen mit "Grundsätzlich" meinen :D )
(Wobei Normalerweise in dem Fall so zu verstehen ist, das gerade wichtige Verschlüsselungsverfahren (die meist auch "einfach als Hardware realisierbar sein sollen") soetwas meist nicht verwenden, z.B. AES)

Ich red nicht mit juristen, ich versteh die eh nicht (:
Das nicht verwenden in allgemeinen Funktionen macht Sinn, da ansonsten allgemeine Codebücher mitgeliefert werden müssen - und wenn jeder das Wort "Huhn" durch "K3" ersetzt ist der Sinn hinüber (da jeder das Codebuch hat).
Nun geh aber vor deiner Verschlüßelung hin und ersetze "Huhn" durch K3 und im nachhinein läuft der AES drüber, schon hast du einen sinnlosen Text in dem K3's Eier legen ;)
Oder wenn deine Implementierung das anlegen&austauschen eigener Codebücher ermöglicht oder sie nur einem kleinen dir bekannten Kreis zugänglich ist, macht das durchaus Sinn um - naja kurzum: Zeit zu schinden. Ist der Algorithmus und der Schlüßel an sich geknackt und es kommt immer noch nur senf raus, muss erstmal ein Codebuch geklaut oder erstellt werden.

Zitat von Ketzu:


Zitat von Klischeepunk:


Soweit so gut, wobei anzumerken wäre, das über Alphabete & Grammatiken auch 2 Wegefunktionen geschaffen werden können.


Die Anmerkung in dem Zusammenhang müsstest du mir kurz erklären, da ich noch am Verständnispunkt stehe, das es keine Bijektion zwischen zwei Mengen unterschiedlicher Mächtigkeit geben kann.
(Kurz: "Ich blick grad nich wie du das meinst" ;) )

Schränk die Mächtigkeit ein, durch Regeln (seien es Grammatiken oder zuordnungen), im Prinzip: Erschaffe eine Sprache oder ein Alphabet und du hast eindeutigkeit in beide Richtungen. Das funktioniert natürlich nur per definition.
Regel:
Zuordnung von Zahl zu Buchstabe
Zuordnung beginnt bei Null
Für jeden folgenden Buchstaben (Alphabet) gilt Zahl++

Damit besteht auf beiden Seiten eine Eindeutigkeit (/e:) zueinander.
(Ascii code bspw.)

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

<<< zurück
 
-1- -2- [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -