online 1
gast (50)

/ Forum / Anwendungen(Java,C++...)

Anwendungen(Java,C++...)Anwendungen(Java,C++...)

Fragevon TByte vom 11.07.2020, 21:50 Options

Hilfe! Ich hab nen Nerv-Code geschrieben! =)

Hallo
Ich hab einen code gschriben. Der sollte iegntlich eine Eingabe annehmen, diese ausgeben und das gleiche wieder von vorne. Aber, ihr kennt mich, damit es komplizierter wird, habe ich erstmal ne Funktion definiert und - jetzt kommt das beste - EINE ENDLOSSCHLEIFE (juhuu):
#include <iostream>
using namespace std;

void iii()
{
	int h;
	cin >> h;
	cout << h;
}

int main()
{
	iii();
	int i = 0;
	while (i == 0)
		{
			iii();
		}
}
Aber leider leider macht das was ganz anderes:
der zeigt mir immer dauernd, es werden mehr, eine Abfolge von:
-858993460-
Leute, was hab ich falsch gemacht?
mfg
TByte


Antwort schreiben

Antwort 1 von TByte vom 11.07.2020, 21:54 Options

Mir is grad was aufgefallen:
wenn ich ganze Zahlen eingebe, funktioniert er wie er soll, ud wenn ich über 65535 oder Buchstaben oder so eingebe, dann macht der sowas.
mfg
TByte

Antwort 2 von Elefunty vom 11.07.2020, 23:08 Options

was anderse als ne endlosschleife kann das doch nicht werden!
immerhin ist mit
int i =0;
i zu 0 definiert worden.
das wird mit
while (i==0)
immer wieder geprüft.
jedoch wird i nie verändert!
also bleibt i immer 0 und while macht was es soll und treibt das programm in ne endlosschleife und den programmierer zur verzweiflung ;)
weißt du eigentlich was 65535 bzw 65536 für zahlen sind?
rechne mal 2 hoch irgendwas...
2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536 usw.
das sind dann 2 hoch 16. dh. es tritt iwie n speicher overflow glaub ich auf
http://de.wikipedia.org/wiki/Integer_(Datentyp)

ach oder moment mal, mir fällt grad ein... meinst du ne endlosschleife, die nix tut und nur quasi hängt? da war irgendwas mit irgendwelchen bufferspeichern...

das mit den buchstaben und kommazahlen ist klar, da man das ja in ein int speichert, und das halt nur für ganzzahlige Eingaben geeignet ist.

vllt kompilier ich das morgen mal, dann kann ich vllt besseres sagen

Ele

P.S. es gibt auch Code Tags...

Antwort 3 von Elefunty vom 12.07.2020, 11:24 Options

ich habs ma kompiliert:
buchstabe ->Keine Eingabe möglich, wiederholt die letzte eingabe (Endlosschleife)
Eingabe>2147483648, nicht 65535 s.o.
das liegt daran, dass der compiler verschiedene breiten als int interpretiert. bei dir z.B. 16Bit = int, bei mir 32 Bit= int. Weil ein bit fürs vorzeichen draufgeht, hat man noch 15, bzw 31...
sonst müsst man unsigned benutzen!
Ich hab deinen Code mal Korrigiert...
#include <iostream> //halt iostream include
using namespace std; //std-namespace...

long long int iii() //die funktion: hier nicht als void, da sie h zurückgibt
{
	long long int h=1; 
/*aus int wird long long int, damit hat man dann 128 bit...
das reicht dann von -9.223.372.036.854.775.807 bis 9.223.372.036.854.775.807
oder falls man unsigned long long int nimmt, halt von 0 bis 18.446.744.073.709.551.615
*/
	if(!(cin >> h)){ //hier wird geprüft, ob die eingabe korrekt war, also in einen Ganzzahlspeicher passt
	cin.clear(); //wenn nicht -> lösche den Fehlerspeicher
	cin.ignore( numeric_limits<int>::max( ),'\n');} //und leere den Pufferspeicher
	else cout << h<<endl; //wenn doch->gebe aus!
	return h; //gebe h zurück
}

int main()
{
//Eingabewertgrenzen anzeigen:
	cout<<"Maximaler eingabewert: "<<LLONG_MAX<<endl<<"Minimaler Eingabewert: "<<LLONG_MIN<<endl;
	while (iii()); /*das hier ist für dich vielleichtn bisschen tricky
und zwar:
wiederhole iii() so lange, bis es 0 zurückgibt, 
währenddessen, tue nichts, da der eigentliche zweck ja 
schon in der bedingung ausgeführt wird! Sobald 0 
zurückgegeben wird, wird die schleife verlassen und das programm beendet
*/
}


Hoffe ich konnte helfen.

Bis neulich
Ele

Antwort 4 von Elefunty vom 12.07.2020, 11:25 Options

mist, layout gesprengt...
sry
ich wusste nich, dass in code tags die zeilen nicht umgebrochen werden...
wär vielleichtn mod so nett und könnte das richten? danke!

Ele

Antwort 5 von TByte vom 12.07.2020, 14:13 Options

So, ok.
Vielen Dank für deine Bemühungen, Elefunty.
Dass die Zahl 65535 besonders ist, weiß ich doch! Oder denkst du ich hab alle Zahlen ausprobiert bis ich 65535 erreciht habe? Nein, ich hab nachgedacht (8.Weltwunder, TByte denkt =) ) und bin zu dem Schluss gekommen, dass es am Integer liegt.
Trotzdem danke, jetzt macht das Programm wenigstens das, was es machen solll...
Werds gleich mal compilen.
Trotzdem, warum kommt dann auf einmal bei mir -858993460- ?
Ist das irgendwie von meinen Rechner?
mfg
TByte

Antwort 6 von omg vom 14.07.2020, 20:21 Options

Ich will jetzt nichts falsches sagen, aber was über den Eingabestrom reinkommt, das sind Zeichen und keine Integer.
Die eingegebene Zahl, z.B. 1, entspricht nicht einem Wert von 1, sondern zum Beispiel 31.
Was du machst, ist einfach die internen Codes für die eingegebenen Zahlen in deine Ganzzahlvariable zu schreiben.
Mit einer einzelnen Zahl könnte das klappen, aber da durch den Stream ja mehrere Zeichen kommen(je nachdem was du eingibst) läuft das Teil über. Normalerweise nimmst du hierfür einen Char Array.
Oder ist das wieder so ein .... Experiment xD

Antwort 7 von Jaja vom 14.07.2020, 20:33 Options

Zitat:
Trotzdem, warum kommt dann auf einmal bei mir -858993460- ?
Ist das irgendwie von meinen Rechner?


in diesem falle nicht. ist die zahl größer als der datentyp zulässt, fängt das ganze wieder bei 0 an und der übertrag geht verloren.

einen s.g. buffer overflow - der leider allzuoft nicht vom programmierer verhindert wird und deshalb für exploits aller art taugt kannst du "nur" über zeiger erreichen, vielleicht auch übers casten von datentypen oder beim casten eines zeigers (sehr effektiv um mist zu bauen)..

Antwort 8 von TByte vom 14.07.2020, 21:17 Options

Hallo
@omg:
Ja, und eben diese interne Zahlen (ASCII sind ja auch nur versteckte Zahlen anstatt Buchstaben) dürfen nicht größer als 65535 sein.
@Jaja:
Super, danke für die anleitung zum Mistbauen =) Hab eh nochn schrottrechner seid gestern rumliegne, mit dem werd ichs mal probieren.=) Aber ansonst ist mir immer noch nicht klar geworden, warum dieses -858993460- kommt! Du hast ja etwas von Übertrag gesagt. Ist das etwa eine zusammensetzung von Überträgen?
mfg
TByte

Antwort 9 von Jaja vom 14.07.2020, 21:21 Options

übertrag:

angenommen ein datentyp kann nur zahlen bis 99 aufnehmen.

speicherst du 302 hinein, wäre der wert der variablen 02 - der übertrag 3.

dieser übertrag wird verworfen..

Antwort 10 von Jaja vom 14.07.2020, 21:24 Options

Zitat:
Super, danke für die anleitung zum Mistbauen =)


na da..

erzeige einfach einen zeiger auf eine variable und erhöhe die ADRESSE des zeigers um einen zufallswert. dann noch auf den inhalt der adresse, auf den der zeiger zeigt schreibend zugreifen und schon haste deinen bluescreen - oder schlimmer...

Antwort 11 von Supermax vom 14.07.2020, 21:40 Options

Wobei unter Betriebssystemen mit Speicherschutzmechanismen wie Linux/Unix oder auch Windows der Zugriff auf eine zufällige Adresse im Allgemeinen nur das betroffene Programm selbst zum Absturz bringt. Unter Window heisst das dann "Das Programm XZY hat einen Fehler festgestellt und muß beendet werden" bzw. unter unixoiden Betriebssystemen kommt es - meistens - zu einem "segmentation fault".

Wobei das noch die harmloseren Fehler sind - wenigstens weiss man daß etwas nicht stimmt! Heimtückischer sind da schon Fehler, die das Programm scheinbar problemlos weiterlaufen lassen, aber dann an ganz anderer Stelle wieder auftreten.

Antwort 12 von Jaja vom 14.07.2020, 21:43 Options

@supermax:

na dann probier es mal aus ;)

Antwort 13 von TByte vom 14.07.2020, 21:45 Options

Och, das is ja langweilig! Auf die Idee bin ich ja auch schon gekommen. allerdings wollt ich das mit nem Gameboy machen:
Die sind ja auch alle in C++ geschrieben die Spiele. Und ich hab ein Tutorial zum Spieleentwickeln fürn Gameboy gefuden. Da stand drin, alles muss man mit Zeigern machen. Also kam ich auf die Idee, mal n bissl mit Zeigern aufm Gameboy rumzuspielen. Mal den Graphikmodus im RAM löschen, mal einen schwachsinn reinschreiben und so weiter =)
mfg
TByte

PS: Vielen dank für die Erklärung, aber ich verstehe den Zusammenhang mit -858993460- nicht.

Antwort 14 von TByte vom 14.07.2020, 21:49 Options

@Supermax:
Das is ja nur im Protected Mode so. Kannst ja mal versuchn - wenn du mal nix zutun hast (ich werd mich in den Ferien auch ran setzen =) ) - Windows in den Open Mode (so hieß er doch, oder?) zu setzen und dann mal die für Windoof reservierten RAM-Segmente zu löschen...
JUHUUUU! BLUESCREEN!!!!
mfg
TByte

Antwort 15 von TByte vom 15.07.2020, 19:12 Options

Hex Leute, hab grad n Zeiger um eins erhöht, n Wert zugewiesen, ausgegeben, Zeiger um ein dekrementiert und erneut ausgegeben; und stellt euch vor: ES KLAPPT ALLES HERRLICH!!! =)
---
Ich hab grad nixdastream.h erfunden. Es enthält die Konstante PROGRAMMGEHTNICHTZUENDE, welche dafür sorgt, dass es Endlosschleifen gibt, die dafür sorgen, dass Konsolenprogramme nicht zu Ende gehen, bevor man nicht manuell beendet. So soll sichergegangen werden, dass man das Ergbenis auch sehen kann. Und, Leute, was kann man ohne Kommentare besser erkennen?
while(1);
while(PROGRAMMGEHTNICHTZUENDE);
Ansonsten müsste man wieder haufenweise Kommentare schreiben, was wie warum das Prorgramm hier bewusst eine Endlosschleife nutzt. Aber mit meiner Headerdatei geht alles viel besser. Einfach in das include-Verzeichnis des Compilers kopieren (um immer bei neuen Projekten zu vermeiden) und dann ganz bequem hintippen:
#include <nixdastream.h> und alles genießen! Wie findet ihr das?
mfg
TByte

PS.:
Nixdastream.h, Code: (Habe bewusst weggelassen:
#ifndef NIXDASTREAM_H
#define NIXDASTREAM_H)
Also, der Code:

const bool PROGRAMMGEHTNICHTZUENDE = true;

Antwort 16 von omg vom 16.07.2020, 16:40 Options

Versteh ich nicht so ganz ...
mit "while(true)" ist es doch schon ersichtlich genug, dass es eine Endlosschleife ist. Außerdem benutzt man doch keine Endlosschleife um das Konsolenfenster offen zu halten -.-
Entweder man lässt es ganz, oder halt System("pause") / Zeichen einlesen.
Wenn du dein Programm mit deinem while(true) am laufen hältst, dann ist dir aber klar, dass man es Gewaltsam abbrechen muss.
Wie finde ich das? nützlich ...
mfg

Antwort 17 von TByte vom 16.07.2020, 20:35 Options

Zitat:
Wie finde ich das? nützlich
supi, immerhin einer.
Also, weißt du, ich finde den ganzen kram mit System Pause und so irgendwie C-Style. C, C++ und so wurden für Systemprogrammierung entwickelt (Zur Info: Programmiersprachen erfindet oder programmiert man nicht, man entwickelt sie). Und bei Systemprogrammierung gibt es kein System, was man irgendwie pause macht. Man macht selber das system. Und diese Tradition will ich wenigstens in C++ beibehalten, da es in C anscheinend schon verloren gegangen ist. Demnach muss man das aufbleiben mit herkömmlichen Mitteln erzwingen.
mfg
TByte

Antwort 18 von Jaja vom 16.07.2020, 22:53 Options

tbyte das ist mit verlaub ziemlicher käse.

wenn es dafür schon eine funktion gibt, nutzt man die auch.. und programme die nicht terminieren, nachdem sie ihre aufgabe erledigt haben sind, mal weich formuliert, einfach schlechter stil.

Antwort 19 von TByte vom 17.07.2020, 15:29 Options

jaja:
der Sinn und Zweck von C/C++ ist gewesen, dass der Programmierer möglichst viele Freiheiten hat. Und mit Freiheiten sind meist auch Aufwendigkeiten verbunden. Das heißt: wenn du dir vornimmst, etwas in C/C++ zu machen, musst du ALLES selber machen! Mit der Zeit wurden immer mehr und mehr Bibliotheken und Funktionen geschrieben, die einem alles "erleichtern" sollen. Aber mit Erleichterung ist auch Einschränkung verbunden. Wenn du selber alles machst und keine vordefinierten Sonder-Dinger verwendest, hast alles selber in der Hand! (und verstehst deinen Code auch besser). Und ausserdem wurde C/C++, wie oben schon erwähnt, nicht für Softwareprogrammierung entwickelt, sondern für Systementwicklung! Und Systeme, die sich selber terminieren, sind auch zu nichts zu gebrauchen.
---
Auch wenn man jetzt Software entwickelt, die Tradition sollte man weiterhin beibehalten. Denn damals gab es keine vordefinierten Funktionen, die mussten erst geschrieben werden!
mfg
TByte

Antwort 20 von Marvin42 vom 17.07.2020, 18:29 Options

Oh. Mein. Gott.
Und mit Gott meine ich nicht dich, TByte...

Systeme, die sich ohne Hard-Off nicht beenden lassen, sind genauso zu nichts zu gebrauchen. Oder ziehst du immer den Stecker, um deinen Rechner abzuschalten?

Ähnliche Themen

RSS Feeds erstellen
TByte  17.02.2009 - 3671 Hits - 2 Antworten

compiler
TByte  09.11.2007 - 72 Hits - 3 Antworten

[VB 2005] Text in Datei schreiben
GRi  07.02.2008 - 23 Hits - 4 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 20:06:00 2026