Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: mercury, Schalentier


 Thema: 100 gute Gründe für Linux ( v0.30 gute Gründe für systemd )
« vorherige 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 [63] 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 nächste »
erste ungelesene Seite | letzter Beitrag 
flying sheep

AUP flying sheep 04.12.2011
C++-Frage:

ich möchte im grunde das tun:
 
Code:
QTextStream out =
	if (args.length() < 2 || args.at(1) == "-") {
		QTextStream(stdout)
	} else {
		QFile file(args.at(1));
		file.open(QIODevice::WriteOnly | QIODevice::Text);
		QTextStream(&file)
	};
bloß sind conditionals C++ keine expressions.

ich könnte über eine funktion gehen, aber das is auch hässlich…

anderesseits muss ich die datei auch schließen…
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von flying sheep am 11.07.2014 17:09]
11.07.2014 17:05:26  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
 
Code:
QTextStream out;
QFile * f = NULL;
if (args.length() < 2 || args.at(1) == "-") {
    out = QTextStream(stdout)
} else {
    f = new QFile(args.at(1));
    f->open(QIODevice::WriteOnly | QIODevice::Text);
    out = QTextStream(f);
};

//...

if(f != NULL)
    f->close();


Bestimmt werde ich gleich ausgelacht.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Oli am 11.07.2014 18:00]
11.07.2014 17:58:33  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
teK

tek
Man handelt als Privatperson fahrlässig, wenn man keinen AV installiert hat und der eigene Rechner Schaden anrichtet. Übrigens.
11.07.2014 18:07:46  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Nö, Standardweg. Wenn QFile copy-assignable oder movable ist, wäre pointerlos natürlich schöner. Ich tippe mal auf QFile ist movable, aber nicht kopierbar.
11.07.2014 18:08:30  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
 
Zitat von teK

Man handelt als Privatperson fahrlässig, wenn man keinen AV installiert hat und der eigene Rechner Schaden anrichtet. Übrigens.



Auch als Linuxer? Mata halt...
11.07.2014 18:08:53  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
teK

tek
Vor dem Gesetz sind alle Betriebssystem gleich. Letztlich denke ich, dass man sowohl dafür als auch dagegen argumentieren kann. Es gibt da mehrere Kriterien: ob es dem Nutzer von der technischen, finanziellen und Verfügbarkeitshaberischen (das ist kein juristischer Ausdruck) Komplexität her zugemutet werden kann.
11.07.2014 18:14:14  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
kRush*

kRush*
 
Zitat von csde_rats

 
Zitat von teK

Man handelt als Privatperson fahrlässig, wenn man keinen AV installiert hat und der eigene Rechner Schaden anrichtet. Übrigens.



Auch als Linuxer? Mata halt...


Das wird bestimmt direkt als Vorsatz gewertet und du kommst in den Hackertool-Todesknast.

Notfalls argumentiert man einfach, der Virus hätte das Anti-Virus entfernt. verschmitzt lachen
11.07.2014 18:15:19  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
 
Zitat von Oli
 
Code:
QTextStream out;
out = &#8230;

das geht nicht:
 
/usr/include/qt/QtCore/qtextstream.h:194:5: error: ‘QTextStream& QTextStream::operator=(const QTextStream&)’ is private

[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von flying sheep am 11.07.2014 18:48]
11.07.2014 18:47:47  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
Warum tut man sowas?
11.07.2014 18:55:09  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Damit man's nicht kopieren kann. (RAII -> würde das Objekt kopiert, müsste man entweder den Handle duplizieren -> teuer/geht manchmal gar nicht od. riskiert ein double-free oder muss intern doch refcounting machen. In C++11 kann man nicht-kopierbare ABER movable Objekte machen, was genau für sowas gedacht ist)

Ergo brauchst du pointer, aber dann nimm bitte unique_ptr.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 11.07.2014 18:57]
11.07.2014 18:55:42  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
 
Zitat von csde_rats

Damit man's nicht kopieren kann. (RAII -> würde das Objekt kopiert, müsste man entweder den Handle duplizieren -> teuer/geht manchmal gar nicht od. riskiert ein double-free oder muss intern doch refcounting machen. In C++11 kann man nicht-kopierbare ABER movable Objekte machen, was genau für sowas gedacht ist)

Ergo brauchst du pointer, aber dann nimm bitte unique_ptr.

ja lol, das ist ein viel zu großer hack und viel zu wenig wissen, um über best practices nachzudenken.

hier ist sein sourcecode, auf sich selbst ausgeführt Augenzwinkern

khighlighter
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von flying sheep am 11.07.2014 19:20]
11.07.2014 19:20:14  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
das ist mein 2. C++-programm. (sonst noch ein C-programm und das war’s mit erfahrung in der sprachfamilie)

immerhin habe ich inzwischen verstanden, was „&“ bedeutet:
  1. in funktionssignaturen bedeutet es: „wenn du mir ein objekt gibst, kannst du es in mir wie außerhalb verwenden, aber ich kopiere es dafür nicht“
  2. sonst erstellt es einen pointer zu diesem objekt, also kann eine funktion
    void foo(string* bar) {...}
    mit
    string baz = "baz"; foo(&baz)
    aufgerufen werden
11.07.2014 19:27:16  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Praktisch richtig, aber zu 2.) erstellt & keinen Pointer sondern & ist generell der Operator um die Adresse eines Objektes zu bekommen, was einen Pointer dann zugewiesen werden kann. Das braucht man auch außerhalb von Parametern für Funktionen.
11.07.2014 19:32:33  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
jo, das hab ich missverständlich ausgedrückt.
&baz
in meinem beispiel ist vom typ
string*
halt, und damit kann ich dann halt machen, was ich will.
11.07.2014 20:09:22  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Roter Fuchs

AUP Roter Fuchs 04.08.2009
 
Zitat von flying sheep

jo, das hab ich missverständlich ausgedrückt.
&baz
in meinem beispiel ist vom typ
string*
halt, und damit kann ich dann halt machen, was ich will.



Entweder du hast dich wieder falsch ausgedrückt, oder es noch nicht richtig verstanden. Breites Grinsen

baz ist vom Typ string. Über & greifst du auf die Adresse von baz zu. Das &-Zeichen gehört auch nicht zum Variablennamen oder ähnliches. Weiterhin ist das einzige, was vom Typ string* ist, der Parameter bar in der Funktion foo().
11.07.2014 20:15:34  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Natürlich hat der Ausdruck (&baz) den Typ string* in seinem Beispiel.
11.07.2014 21:13:01  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Ich denke man kann das nicht so wirklich festlegen. Klar steht dahinter ein Speicherplatz der einen String repräsentiert, aber ob der/ein "Ausdruck" jetzt einen Typen hat finde ich fragwürdig.
11.07.2014 21:24:30  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
 
Zitat von teK

Vor dem Gesetz sind alle Betriebssysteme gleich.


Breites Grinsen Bester Untertitel!
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 11.07.2014 21:32]
11.07.2014 21:32:01  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
 
Zitat von Daddi89

Ich denke man kann das nicht so wirklich festlegen. Klar steht dahinter ein Speicherplatz der einen String repräsentiert, aber ob der/ein "Ausdruck" jetzt einen Typen hat finde ich fragwürdig.



Klar haben Ausdrücke nen Typ... Mata halt...

/e: Das schreiben sie nichtmal explizit in den Standard rein, sondern setzten es vorraus (etwa 6.5 (6-7) 6.5.1 (2) im C-Standard [man kann einen Working Draft unter n1124 frei abrufen])
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 11.07.2014 21:43]
11.07.2014 21:34:40  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Habs durchgelesen, aber überzeugt mich nicht wirklich. &name zeigt eben nur auf eine andere Stelle bzw. weist etwas an (das Zurückgeben einer Speicheradresse). Die Variablen dahinter haben natürlich Typen, aber diese Anweisung ansich hat doch nicht wirklich einen Typen.

Im Endeffekt gibt es dafür wohl eh keine Definition und jeder kann das sehen wie er will, im Gebrauch der Sache machts ja eh keinen Unterschied Augenzwinkern
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Daddi89 am 12.07.2014 0:25]
12.07.2014 0:24:22  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
natürlich hat das den typ:
 
Code:
string foo = "...";
string * bar = &foo;
12.07.2014 2:18:02  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Welchen der beiden hat &foo denn in dem Moment? string oder string*? Theoretisch beides, weil es die Anweisung gibt, die Adresse zurückzugeben und in einen Pointer zu packen.

Wenn ich sage:
int a = funktionDieIntZurueckGibt();

Dann hat die Funktion ja auch nicht den Typ int sondern den Typ Funktion. Ähnlich könnte man &variable, als eigenen Typen sehen. Es ist ja eh nur ne theoretische Überlegung. Ich sag nicht, dass ihr definitv falsch liegt, aber die Überlegung dahinter finde ich trotzdme interessant Breites Grinsen
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Daddi89 am 12.07.2014 2:27]
12.07.2014 2:25:07  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
funktionDieIntZurueckGibt()
ist ein funktionsaufruf.

funktionsaufrufe sind ausdrücke und haben wie alle ausdrücke einen typ.

&foo
hat den typ
string*
,
funktionDieIntZurueckGibt()
hat den typ
int
12.07.2014 2:38:26  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
funktiondieintzurueckgibt ist ein function designator! Anwenden von () auf einen Designator ist - wie jede Anwendung eines Operators - eine Expression/Ausdruck und der hat _immer_ einen Typ.

(&foo) hat den Typ string *.
Warum? Weil der Operator & angewandt auf einen Typen T immer den Typen T* zurückgibt. Wenn dir das gedanklich hilft: & ist quasi ein template auf sprachebene.

 
Zitat von Daddi89

Welchen der beiden hat &foo denn in dem Moment? string oder string*? Theoretisch beides, weil es die Anweisung gibt, die Adresse zurückzugeben und in einen Pointer zu packen.



Könntest du das etwas ausführen? Wieso "theoretisch beides"?
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 12.07.2014 2:51]
12.07.2014 2:49:51  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Okay, wenn man davon ausgeht, dass eine Funktion die int zurückgibt selbst auch den Typ int hat, dann ist das natürlich genauso auch auf den & Operator anzuwenden. Meine Überlegung war lediglich, ob man sowas wie den & Operator oder Funktionen als einen eigenen Typen ansehen könnte.
12.07.2014 3:12:31  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Sind sie doch. Heißt Function (Type).

Function Type => Spezifikation von Rückgabewert und Parametern
Function Designator => Eindeutige spezifikation Bennenung (e: also nicht zu verwechseln mit einer Definition oder Deklaration) einer bestimmten Funktion.

D.h. funktionblar ist ein function designator, und dessen Typ ist immer den Typ der designierten Funktion gleich.

Jetzt gibt es den Operator (). Der ist nur auf einen Function Designator anwendbar. Der Operator hat als Typ den Rückgabewert, der durch den Function Type des Designators spezifiziert wird.

Im Standard findest du genaue Definitionen zum Typsystem in 6.2.5
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 12.07.2014 3:50]
12.07.2014 3:44:26  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
flying sheep

AUP flying sheep 04.12.2011
in scala haben funktionen z.b. den typ
Function0[R]
,
Function1[P1, R]
,
Function2[P1, P2, R]
, … (in scala sind generische typen in [] statt <>Augenzwinkern

…wobei
P1
usw. die parametertypen sind, und
R
der rückgabetyp.

wenn man die funktionen jetzt ausführt per
somefunction(param1, param2, ...)
hat dieser ausdruck den typ
R
.

beispiel (mit einem fiktionalem typeof-operator):
 
Code:
def add(a: Int, b: Int) : Int { return a + b }

assert typeof add == Function3[Int, Int, Int]
assert typeof add(2, 3) == Int
12.07.2014 9:52:44  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Sehr interessant, wieder was gelernt Breites Grinsen
Kommt davon, wenn man jahrelang nur typen-loses PHP verwendet :S
12.07.2014 13:58:26  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
SwissBushIndian

AUP SwissBushIndian 07.11.2011
 
Zitat von Daddi89

typen-loses PHP



Das tut auch nur so.
12.07.2014 14:09:56  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Daddi89

AUP Daddi89 28.05.2020
Schwaches, dynamisches Duck-Typing kann man genauso gut auch als typen-los bezeichnen Breites Grinsen

In PHP 5.3 und drüber wirds besser, aber wenn man damals damit arbeiten musste konnte man das doch vergessen.
12.07.2014 14:15:16  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: 100 gute Gründe für Linux ( v0.30 gute Gründe für systemd )
« vorherige 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 [63] 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 nächste »

mods.de - Forum » Linux » 

Hop to:  

Mod-Aktionen:
13.09.2014 17:26:16 teK hat diesen Thread geschlossen.

| tech | impressum