Forum: PC-Programmierung with.do bei C/c++?


von Mairian (marianp)


Lesenswert?

In Pascal/Freepascal/Delphi/Lazaurs gibt es
with...do
gibt es vergleichbares in C/C++?
1
type 
2
  name_rec = record 
3
             first  : string; 
4
             middle : string; 
5
             last   : string; 
6
  end; 
7
 
8
(* ... *) 
9
 
10
var  
11
  name : name_rec; 
12
 
13
(* ... *) 
14
 
15
with name do 
16
  begin 
17
    writeln(first); 
18
    writeln(middle); 
19
    writeln(last) 
20
  end

von Rahul D. (rahul)


Lesenswert?

Mairian schrieb:
> gibt es vergleichbares in C/C++?

Nö.

von Mairian (marianp)


Lesenswert?

und sowas?
1
if today in [monday..friday] then 
2
    writeln ‘Oh great—work.’ 
3
else 
4
    writeln ‘Happy weekend!’;

von Sebastian R. (sebastian_r569)


Lesenswert?

Mairian schrieb:
> und sowas?

Nö.

von Thomas W. (goaty)


Lesenswert?

std:vector<std::string> list = {"Montag", "Dienstag", "Mittwoch"};

for (const auto& day: list) {
  std::cout << day << std::endl;
}

von Mairian (marianp)


Lesenswert?

hmm, nicht ganz – dein C++-Beispiel und das Pascal-Snippet tun vom 
Prinzip her etwas anderes.

Dein C++-Code geht einfach die Liste durch und gibt jeden Eintrag aus.
Keine Bedingung, keine Fallunterscheidung – nur Iteration.

Der Pascal Code prüft nur einen Wert (today) gegen eine Menge von Werten 
und entscheidet dann zwischen zwei Ausgaben.
Oder sehe ich das falsch?
Ich habe con C++ so absolut keine Ahnung, bin da eher auf Krabbelkind 
Niveau, bewege mich da eher bei Pascal oder sogar Basic als C/C++

Müsste es nicht eher so sein
1
{
2
    std::string today = "Dienstag";
3
4
    std::vector<std::string> workdays = {
5
        "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"
6
    };
7
8
    if (std::find(workdays.begin(), workdays.end(), today) != workdays.end())
9
        std::cout << "Oh great—work.\n";
10
    else
11
        std::cout << "Happy weekend!\n";
12
}

: Bearbeitet durch User
von Christoph O. (lichtstrahl)


Lesenswert?

Mairian schrieb:
> In Pascal/Freepascal/Delphi/Lazaurs gibt es
> with...do

Wird aber auch in der Pascal-Welt aus verschiedenen Gründen oft als 
schlechter Stil gesehen, z.B. da man bei längeren Blöcken nichtmehr auf 
Anhieb sieht, zu welcher Struktur ein Member gehört usw.

von Oliver S. (oliverso)


Lesenswert?

Mairian schrieb:
> und sowas?
>
1
> if today in [monday..friday] then
2
>     writeln ‘Oh great—work.’
3
> else
4
>     writeln ‘Happy weekend!’;
5
>

Nö. Aber
1
switch (today)
2
    {
3
        case monday...friday:
4
           std::cout << "Oh great—work" << std::endl;
5
           break;
6
        default:
7
           std::cout << "Happy weekend!" << std::endl;
8
           break;
9
    };

Oliver

: Bearbeitet durch User
von Mairian (marianp)


Lesenswert?

hm, aber in Pascal ist [monday..friday] ist eine echte Bereichsprüfung.
Der Compiler versteht automatisch: monday <= today <= friday.


Switch in C kennt nur einzelne Werte in case, keine Bereiche.
In C++ müsste man sich dann doch so behelfen

[code]
switch (today) {
    case monday:
    case tuesday:
    case wednesday:
    case thursday:
    case friday:
        std::cout << "Oh great—work" << std::endl;
        break;
    default:
        std::cout << "Happy weekend!" << std::endl;
        break;
}
{/code]

: Bearbeitet durch User
von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

with ist evil:
https://ideasawakened.com/post/why-you-should-not-use-WITH-in-your-Delphi-code
... macht mehr potenziellen Ärger als es nutzt. Wirth hat es in seinen 
Nachfolgesprachen nicht mehr drinn.
In den meisten Codingstyles steht drinn dass man es nicht nutzen soll.


Thomas W. schrieb:
> std:vector<std::string> list = {"Montag", "Dienstag", "Mittwoch"};
>
> for (const auto& day: list) {
>   std::cout << day << std::endl;
> }
Wohl eher was mit set::find. if x in [ a .. b ] in Pascal nutzt hier 
Mengen, das ist kein Array oder Liste auch wenn es so aussieht, afaik.

von Udo K. (udok)


Lesenswert?

Mairian schrieb:
> Switch in C kennt nur einzelne Werte in case, keine Bereiche.
> In C++ müsste man sich dann doch so behelfen

Doch, das geht inzwischen.  Wobei die Pascal Syntax einfach und lesbar 
ist im Vergleich zu C++.  Ohne Autocompletion kann heute keiner mehr C++ 
schreiben, und ohne Syntax Highlighting ist C++ unlesbar.

: Bearbeitet durch User
von Mairian (marianp)


Lesenswert?

ah ok.,
Jepp, in C bekomme ich Augenkrebs:-( und brauche immer etliche Versuche 
bis es mal so klappt, wie ich er versuche, programmiere dafür aber auch 
viel zu selten

von Rahul D. (rahul)


Lesenswert?

Mairian schrieb:
> ah ok.,
> Jepp, in C bekomme ich Augenkrebs:-( und brauche immer etliche Versuche
> bis es mal so klappt, wie ich er versuche, programmiere dafür aber auch
> viel zu selten

Wenn du zum Augekkrebs auch nocht einen Konten im Kopf haben willst, 
probier es mal mit python. SCNR

Mairian schrieb:
> if today in [monday..friday] then
>     writeln ‘Oh great—work.’
> else
>     writeln ‘Happy weekend!’;
1
#include <stdio.h>
2
3
 typedef enum weekday {
4
  sunday,
5
  monday,
6
  tuesday,
7
  wednesday,
8
  thursday,
9
  friday,
10
  saturday
11
 } tWeekday;
12
int main()
13
{
14
 tWeekday today = thursday;
15
16
 if ((today >= monday) && (today <= friday))
17
 {
18
  printf("Oh great—work.\n");
19
 }
20
 else 
21
 {
22
  printf("Happy weekend!\n");
23
 }
24
}

ließ sich unter
https://www.onlinegdb.com/online_c_compiler
testen.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Mairian schrieb:

> with...do
> gibt es vergleichbares in C/C++?

Nö, gibt's nicht. Und ich halte das für eher gut. Dieses with-Konstrukt 
ist zwar manchmal scheinbar eine Erleichterung (wie etwa in gezeigtem 
Beispiel), aber kann auch sehr schnell in die Hölle führen.

Die Crux ist nämlich: with-Blöcke können sowohl geschachtelt werden als 
auch für mehrere Bezeichner gleichzeitig gelten.

Und dann noch ein paar Zeilen Code und kein Schwein kann mehr auf die 
Schnelle nachvollziehen, zu welchem der with-Bezeichner nun der im Block 
verwendete Feld-, Methoden oder Eingenschaftsname gehört. Inbesondere 
dann nicht, wenn es den in mehreren der in with-Klausel aufgeführten 
Bezeichner gibt. Die Sprachdefinition regelt zwar klar, was dann 
passiert, aber es ist trotzdem große Scheiße.

Sprich: with ist vor allem dazu geeignet, den Code maximal unlesbar zu 
machen. Eine der wenigen Sachen, die ich an Pascal Scheiße finde.

Das nutzen vor allem Leute, die ihren Code obfuskieren wollen, was in 
Pascal ja viel schwieriger ist als in C/C++.

von Bruno V. (bruno_v)


Lesenswert?

Rahul D. schrieb:
> if ((today >= monday) && (today <= friday))

eine der ganz wenigen "reinen" Funktionen in unseren Sourcen ist 
"inrange(int, int, int), die praktisch überall genau solche Konstrukte 
ersetzt durch
1
if(inrange(today, monday, friday)) ...

egal ob der größere Wert als 2.ter oder 3.ter Parameter kommt oder ob 
überhaupt einer größer ist.

Damit offenbart sich auch die Schwäche der ganzen Konstruktion: 
Sunday...Monday überrascht die Hälfte der Nutzer.

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Ob S. schrieb:
> Und dann noch ein paar Zeilen Code und kein Schwein kann mehr auf die
> Schnelle nachvollziehen, zu welchem der with-Bezeichner nun der im Block
> verwendete Feld-, Methoden oder Eingenschaftsname gehört

Sorry, das hat man in C++ auf jeden Schritt und Tritt, also wenn DAS ein 
Argument ist, dann müsste man C++ komplett verbieten.

Da weisst du nicht mal ob + addiert, ob ein 'Variablenname' nicht doch 
ein getter-Funktionsaufruf ist, und welche Kaskade von Funktionen dabei 
durchlaufen wird dank Klassenhierarchie.

von Rahul D. (rahul)


Lesenswert?

Bruno V. schrieb:
> egal ob der größere Wert als 2.ter oder 3.ter Parameter kommt oder ob
> überhaupt einer größer ist.

Wo der größere oder kleinere Wert wo steht, ist nur eine Abfrage und ein 
Swap mehr.
Was deine "Funktion" wohl im Hintergrund macht?
Mir sind offensichtliche Lösungen lieber.

> Damit offenbart sich auch die Schwäche der ganzen Konstruktion:
> Sunday...Monday überrascht die Hälfte der Nutzer.

Welche Schwäche? Würdest du mir bitte erklären, wo du da eine siehst?
Ich hätte auch die Fernsehzeitschrift-Reihenfolge (Samstag -> Freitag) 
verwenden können. Selbst mit Montag als erstem und Sonntag als letztem 
Tag der Woche funktioniert die Abfrage.
Wie sind die Wochentage denn in Pascal definiert?

von Rolf M. (rmagnus)


Lesenswert?

Rahul D. schrieb:
>> Damit offenbart sich auch die Schwäche der ganzen Konstruktion:
>> Sunday...Monday überrascht die Hälfte der Nutzer.
>
> Welche Schwäche? Würdest du mir bitte erklären, wo du da eine siehst?

Es funktioniert damit so nicht:
1
if ((today >= sunday) && (today <= monday))

Du müsstet dann darauf achten, in allen Fällen (und nur denen), in denen 
der Bereich die Grenze Sonntag -> Montag überschreitet, das && durch ein 
|| zu ersetzen. Falls hier nicht direkte Werte sondern z.B. Variablen 
stehen, muss diese Unterscheidung zur Laufzeit über ein zweites if 
erfolgen. Solche Dinge verstecke ich dann auch lieber hinter einer 
Funktion.
Und um das ganze dann wieder zu Pascal zurückzubringen: Was passiert 
eignetlich, wenn man
1
if today in [sunday..monday] then
schreibt?

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Rolf M. schrieb:
> Falls hier nicht direkte Werte sondern z.B. Variablen
> stehen, muss diese Unterscheidung zur Laufzeit über ein zweites if
> erfolgen.
Sagen wir es so: Mein Beispiel erfüllt die Frage, ob das so geht.
Deswegen definiere ich ja auch die enum mit den Wochentagsnamen.
Es ist kein Ersatz für die "in"-Funktion, sondern nur eine Lösung für 
das angefragte Beispiel.

>Solche Dinge verstecke ich dann auch lieber hinter einer Funktion.
Das würde ich auch so machen. Aber dann müsste ich auch wissen, was die 
Funktion alles können soll. Weiß ich nicht, interessiert mich auch 
gerade nicht.

Rolf M. schrieb:
> Es funktioniert damit so nicht:if ((today >= sunday) && (today <=
> monday))

Was soll dabei rauskommen?
Meine Abfrage bezieht sich auf die von mir genannte enum.
Will man was anderes haben, muss man auch die enum anpassen.
Man sollte schon wissen, was man tut (sonst klemmt man sich die Finger).

von Rolf M. (rmagnus)


Lesenswert?

Rahul D. schrieb:
> Sagen wir es so: Mein Beispiel erfüllt die Frage, ob das so geht.
> Deswegen definiere ich ja auch die enum mit den Wochentagsnamen.
> Es ist kein Ersatz für die "in"-Funktion, sondern nur eine Lösung für
> das angefragte Beispiel.

Meistens sucht man aber nicht eine Lösung, die speziell für ein ganz 
konkretes Beispiel funktioniert, sondern eine allgemeingültige.

> Rolf M. schrieb:
>> Es funktioniert damit so nicht:
>> if ((today >= sunday) && (today <= monday))
>
> Was soll dabei rauskommen?

Na true, wenn heute Sonntag oder Montag ist, sonst false. Eben ein Test 
auf einen Bereich von Wochentagen.

> Meine Abfrage bezieht sich auf die von mir genannte enum.

Und genau das ist der Punkt: Es funktioniert nur, wenn die Definition 
des Enums und die Abfrage genau auf einander abgestimmt sind und nicht 
allgemein. Und ich denke, das ist, was Bruno mit

>> Schwäche der ganzen Konstruktion

meinte. Du hattest ja gefragt, wo da die Schwäche ist.

> Will man was anderes haben, muss man auch die enum anpassen.

Das heißt für die Abfrage, die ich gezeigt habe, würdest du dann die 
Tage im Enum verschieben, damit sie funktioniert? Das wird spannend, 
wenn du hier nicht mehr zwei feste Werte hast, sondern Variablen, in 
denen die Grenzen stehen.

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Rolf M. schrieb:
> Und um das ganze dann wieder zu Pascal zurückzubringen: Was passiert
> eignetlich, wenn manif today in [sunday..monday] then
> schreibt?
Bei einem [Y..X] wo Y > X gilt, entspricht [Y..X] der leeren Menge [].
Also wird der Ausdruch immer zu false ausgewertet.

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Rolf M. schrieb:
> Meistens sucht man aber nicht eine Lösung, die speziell für ein ganz
> konkretes Beispiel funktioniert, sondern eine allgemeingültige.

Für DIESES Problem funktioniert die Lösung. Wenn man was 
allgemeingültiges haben will, sollte man die Randbedingungen definieren.
Auch die Pascal-Funktion wird irgendwo ihre Grenzen haben.

Rolf M. schrieb:
> Das heißt für die Abfrage, die ich gezeigt habe, würdest du dann die
> Tage im Enum verschieben, damit sie funktioniert? Das wird spannend,
> wenn du hier nicht mehr zwei feste Werte hast, sondern Variablen, in
> denen die Grenzen stehen.

Nö. Ich würde die Abfrage so schreiben, dass sie das Ergebnis 
produziert, was ich haben will, und nicht irgendwas, was sich jemand aus 
den Fingern gesogen hat.

Rolf M. schrieb:
> Na true, wenn heute Sonntag oder Montag ist, sonst false. Eben ein Test
> auf einen Bereich von Wochentagen.
Ich nenne das jetzt mal "Philosophisches Geplapper", da es nichts mit 
der eigentlich Fragestellung (ob es das folgende Konstrukt auch in C/C++ 
gibt) zutun hat:

Mairian schrieb:
> und sowas?
> if today in [monday..friday] then
>     writeln ‘Oh great—work.’
> else
>     writeln ‘Happy weekend!’;

Antwort: Ja, kann man ähnlich realiseren.

Wie sind denn monday, friday und die anderen Wochentage definiert?

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Rahul D. schrieb:
> Wie sind denn monday, friday und die anderen Wochentage definiert?

Üblicherweise als Aufzählungstyp (enum):
type
 Wochentage = (monday, tuesday, usw );

Davon kann man dann Bereiche angeben eben wie in dem if [monday .. 
friday]
oder auch über Bereiche neue Typen ableiten:

type
 Wochenendtage = [saturday..sunday];

Intern haben die einen Wert den man mit ord() ermitteln kann.  inc(), 
decr() gibts auch noch zum hoch/runterzaehlen.

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Frank D. schrieb:
> Üblicherweise als Aufzählungstyp (enum):
Also wie in C.
"Meine" enum könnte man auch problemlos von Montag bis Sonntag 
definieren.
Und "meine" Abfrage würde immer noch funktioneren.

Wozu was "allgemeingültiges" schreiben, wenn man das Problem mit einer 
"popeligen" Abfrage lösen kann?

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Frank D. schrieb:

> type
>  Wochenendtage = [saturday..sunday];

Das muss
Wochenendtage = saturday..sunday;

heissen.

von Rolf M. (rmagnus)


Lesenswert?

Rahul D. schrieb:
> Rolf M. schrieb:
>> Meistens sucht man aber nicht eine Lösung, die speziell für ein ganz
>> konkretes Beispiel funktioniert, sondern eine allgemeingültige.
>
> Für DIESES Problem funktioniert die Lösung.

Oben hast du es noch ein Beispiel genannt, und mehr als das ist es auch 
nicht.

> Wenn man was allgemeingültiges haben will, sollte man die Randbedingungen
> definieren.
> Auch die Pascal-Funktion wird irgendwo ihre Grenzen haben.

Hab ich ja geschrieben. Ich habe mit meinen Ausführungen diese Frage 
beantwortet:

Rahul D. schrieb:
>> Damit offenbart sich auch die Schwäche der ganzen Konstruktion:
>> Sunday...Monday überrascht die Hälfte der Nutzer.
>
> Welche Schwäche?

und das bezieht sich nicht ausdrücklich auf C oder C++, sondern auf den 
Konstrukt an sich, da er in Pascal offenbar genau die gleiche Schwäche 
hat.

> Ich nenne das jetzt mal "Philosophisches Geplapper", da es nichts mit
> der eigentlich Fragestellung (ob es das folgende Konstrukt auch in C/C++
> gibt) zutun hat:

Es hat mit der Frage zu tun, die du gestellt hast:

Rahul D. schrieb:
> Welche Schwäche? Würdest du mir bitte erklären, wo du da eine siehst?

Ich kann jetzt nicht für Bruno sprechen, aber das ist die Schwäche, die 
ich sehe.

> Mairian schrieb:
>> und sowas?
>> if today in [monday..friday] then
>>     writeln ‘Oh great—work.’
>> else
>>     writeln ‘Happy weekend!’;
>
> Antwort: Ja, kann man ähnlich realiseren.

Klar kann man das. Es ist aber finde ich kein Fehler, darauf 
hinzuweisen, dass so ein Konstrukt generell gewisse Fallstricke mit sich 
bringen kann. Du hast gefragt, welche das sind, ich hab dir diese Frage 
beantwortet.

Rahul D. schrieb:
> Frank D. schrieb:
>> Üblicherweise als Aufzählungstyp (enum):
> Also wie in C.
> "Meine" enum könnte man auch problemlos von Montag bis Sonntag
> definieren.
> Und "meine" Abfrage würde immer noch funktioneren.
>
> Wozu was "allgemeingültiges" schreiben, wenn man das Problem mit einer
> "popeligen" Abfrage lösen kann?

Gut, wenn du dir absoulut sicher bist, dass du in deinem Programm so 
einen Test nicht mit einem Bereich über die Grenze Sonntag->Montag 
brauchst und auch nie brauchen wirst, dann kannst du es natürlich so 
machen. Es kann aber (vor allem bei der Pascal-Variante, weil da die 
Vergleiche nicht  explizit ausgeschrieben sind) durchaus überraschen, 
dass es evtl. nicht mehr funktioniert, wenn man eine andere Kombination 
an Wochentagen nimmt. Was ist jetzt so schlimm daran, darauf 
hinzuweisen?

von Rahul D. (rahul)


Lesenswert?

Rolf M. schrieb:
> Oben hast du es noch ein Beispiel genannt, und mehr als das ist es auch
> nicht.

Mairian schrieb:
> und sowas?

Nope.
Mein Programm ist eine Beispiellösung für das von Mairian genannte 
"Problem".
Man kann es auch auf andere Art und Weise lösen.
Es ist eine erste, einfache, nachvollziehbare Lösung als Beispiel.
Die muss nicht perfekt auf alle möglichen Worstcases reagieren.

Rolf M. schrieb:
> Es ist aber - finde ich - kein Fehler, darauf
> hinzuweisen, dass so ein Konstrukt generell gewisse Fallstricke mit sich
> bringen kann.
Die selben Fallstricke wird es auch bei anderen Programmiersprachen 
geben.
Deswegen nannte ich deinen Post "philosophisches Geplapper" - es trägt 
nicht zur Lösung der Frage bei.
Es könnte sein, dass ein Fehler auftritt; muss aber nicht unter den 
vorgegeben Bedingungen.
Dein Verhalten würden einige "übergriffig" nennen.

von Ein T. (ein_typ)


Lesenswert?

Mairian schrieb:
> Jepp, in C bekomme ich Augenkrebs:-( und brauche immer etliche Versuche
> bis es mal so klappt, wie ich er versuche, programmiere dafür aber auch
> viel zu selten

Also ist das hier nur der Mimimi-Trollthread eines Dilletanten.

Deine Beschwerden sind leicht zu heilen: benutz kein C. :-)

von Rolf M. (rmagnus)


Lesenswert?

Rahul D. schrieb:
> Die selben Fallstricke wird es auch bei anderen Programmiersprachen
> geben.

Nochmal: Es bezog sich nicht auf die Programmiersprache, sondern darauf, 
dass der Konstrukt an sich zu Problemen führen kann.

> Deswegen nannte ich deinen Post "philosophisches Geplapper" - es trägt
> nicht zur Lösung der Frage bei.

Nun, wenn mich jemand fragt, wie er sich am besten in den Fuß schießen 
kann, aber mit einem Gewehr statt einer Pistole, dann werde ich 
zumindest dazuschreiben, dass es generell keine gute Idee ist, sich in 
den Fuß zu schießen. Ob er diesen Hinweis zu Herzen nimmt oder nicht, 
ist kann er ja dann immer noch selbst entscheiden. Wenn mich dann noch 
jemand fragt, warum das keine gute Idee ist, erkläre ich es ihm eben.

> Es könnte sein, dass ein Fehler auftritt; muss aber nicht unter den
> vorgegeben Bedingungen.
> Dein Verhalten würden einige "übergriffig" nennen.

Warum? Ich habe lediglich eine Frage beantwortet, die DU gestellt hast.

Da würde ich dein Verhalten eher so beschreiben. Bruno hat nebenbei 
erwähnt, dass der Konstrukt problematisch sein kann, du hast gefragt, 
warum, und ich hab dir das beantwortet. Damit hätte es eigentlich zu 
Ende sein können, aber du hast da inzwischen eine riesen Diskussion 
draus gemacht.

von Rahul D. (rahul)


Lesenswert?

Rolf M. schrieb:
> Bruno hat nebenbei
> erwähnt, dass der Konstrukt problematisch sein kann, du hast gefragt,
> warum, und ich hab dir das beantwortet.

Wie du schon scheibst: Ich hatte Bruno gefragt.
Dass Du dann deinen Senf datzugeben musstest, war mMn überflüssig.

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Wenn du zum Augekkrebs auch nocht einen Konten im Kopf haben willst,
> probier es mal mit python. *SCNR*

Wenn Du jetzt "Pandas" gesagt hättest... aber Python ist ziemlich 
geradeaus, damit sollte ein Entwickler leicht zurecht kommen.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Rahul D. schrieb:

> Frank D. schrieb:
>> Üblicherweise als Aufzählungstyp (enum):
> Also wie in C.

Nein. Diese Dinger in Pascal sind keine Aufzählungstypen, sondern 
Mengentypen.

Der Unterschied ist: Es ist von vorherein sichergestellt, dass die 
Elemente sich als Flags verwenden lassen, denn intern sind diese Dinger 
eher sowas wie Bitfields in C.

Bloß halt mit wesentlich besserer Unterstützung durch die Sprache, die 
viele Operatoren und Funktionen bereitstellt, um mit diesen Mengentypen 
sinnvoll zu arbeiten.

von Rahul D. (rahul)


Lesenswert?

Ob S. schrieb:
> Der Unterschied ist: Es ist von vorherein sichergestellt, dass die
> Elemente sich als Flags verwenden lassen, denn intern sind diese Dinger
> eher sowas wie Bitfields in C.

Ich zitiere mal den ersten Satz von:
https://learnxbyexample.com/pascal/enums/

"Our enum type ServerState has an underlying int type. Enumerated types 
(enums) are data structures that allow us to define a set of named 
values for a variable. While some languages have built-in support for 
enums, many can simulate them using other features."
Die gleiche Definition wie in C...

Laut Wikipedia (https://de.wikipedia.org/wiki/Aufz%C3%A4hlungstyp) 
unterscheiden sich die enum von Pascal, Java etc von denen von C durch 
die Typsicherheit.
Ich bin mir nicht ganz sicher, aber arm-gcc (Keil) spuckt AFAIR eine 
Warning aus, wenn man zwei unterschiedliche enum-Typen mischen will - 
gehen tut es, aber es wird gemeckert.

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Laut Delphisprachspec lassen sich mit Aufzaehlungstypen (das sind keine 
Mengen wie oben jemand behauptete, die spielen da auch rein aber sind 
nicht das selbe, "set" ist ein eigener Typ und kann auch andere typen 
aufnehmen, aufzaehlungstypen können nur ordinaltypen aufnehmen) alle 
Ordinaltypen möglich. Ordinaltypen sind einfach alle ganzzahligen Typen.
Mann kann aufzaehlungswerten auch vordefinierte Werte zuweise wie in C 
bei den enums. Also der erste Wert 100 und nicht wie default eben 0,...

: Bearbeitet durch User
Beitrag #7923779 wurde vom Autor gelöscht.
von Philipp K. (philipp_k59)


Lesenswert?

Im Prinzip gibt es viele gute alternativen, wieso muss es ausgerechnet 
eine ähnliche Lösung sein?

Das gleich ist ja name.first,name.middle und name.last .. wieso ist das 
schwerer als es wegzulassen?

Man könnte den Struct erweitern (Nur eine Idee):

struct MyStruct {
    String first;
    String middle;
    String last;

    void printmystruct() {
        std::cout << first << std::endl;
        std::cout << middle << std::endl;
        std::cout << last << std::endl;
    }
};

von Bruno V. (bruno_v)


Lesenswert?

Rahul D. schrieb:
> Welche Schwäche?

Sorry, da habe ich Dich auf dem falschen Fuß erwischt. Ich fand Deine 
Zeile genau richtig, habe unsre "inrange" angebracht und wollte 
unabhängig davon darauf hinweisen, dass Wochentage für Ranges 
ungeeignet sind.

Wenn inrange als "ist in range [von ... bis]" verstanden wird, dann 
sollte [3 ... 5] das gleiche bedeuten wie [5 ... 3]. Bei Wochentagen ist 
Montag-Freitag offensichtlich was anderes wie Freitag-Montag. Und da der 
erste Tag unterschiedlich festgelegt ist, ist Deine Lösung für diese 
Aufgabe perfekt, die Aufgabe aber dumm. Für Wochentage führt es 
zwangsläufig früher oder später in Missverständnisse.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.