Dieser Code Fehler auf * diesem * und * diesem *, ist es wirklich in ihnen geschrieben?


25

Inspiriert von Ich bin nicht die Sprache, die Sie suchen!

Herausforderung

Wählen Sie zwei verschiedene Programmiersprachen und schreiben Sie ein Programm, das die folgende Zeile in stdout (oder ein gleichwertiges Programm) ausgibt:

This program errors out in <the current language> :P

und erzeugt dann unterschiedliche Arten von Fehlern in jeder der beiden Sprachen.

Regeln

Einige Regeln sind der ursprünglichen Herausforderung entnommen.

  • In der Ausgabe sollten die Namen der Sprachen genau wie folgt lauten:
    • Der in TIO aufgeführte Name , optional mit Ausnahme der Versionsnummer und / oder des Implementierungsnamens (z. B. wenn Sie JavaScript (Node.js)eine Ihrer Sprachen verwenden, können JavaScriptSie den Namen für Ihre Sprache verwenden, aber nicht JSoder Javascript.)
    • Den vollständigen Namen finden Sie auf der offiziellen Website (oder auf GitHub Repo), wenn Ihre Sprache bei TIO nicht verfügbar ist.
  • Keines der Programme sollte Eingaben vom Benutzer entgegennehmen.
  • Sie können Kommentare in beiden Sprachen verwenden.
  • Zwei verschiedene Versionen derselben Sprache zählen als verschiedene Sprachen.
    • In diesem Fall sollte das Programm die Hauptversionsnummer ausgeben und bei Ausführung auf zwei verschiedenen Nebenversionen auch die Nebenversion melden.
    • Sie sollten keine vorgefertigten Versionsfunktionen verwenden (dies schließt Variablen ein, die bereits zur Laufzeit ausgewertet wurden).
  • Zwei verschiedene Befehlszeilen-Flags in derselben Sprache zählen ebenfalls als verschiedene Sprachen gemäß diesem Metakonsens , sofern die Flags keine Codefragmente enthalten (wie -Dblahblah...in C).
    • In diesem Fall sollte das Programm auch das verwendete Flag ausgeben.
  • Zwei Fehler werden als unterschiedlich betrachtet, es sei denn, beide Fehler werden durch dieselbe Semantik generiert (z. B. "Division durch Null", "Segmentierungsfehler" oder "Index außerhalb des Bereichs").
    • Wenn die Laufzeit einer Sprache nach einem Fehler nicht beendet wird, der Fehler jedoch auf irgendeine Weise an den Benutzer gemeldet wird, handelt es sich um einen gültigen Fehler.
    • Wenn eine Sprache die Fehlermeldungen nicht unterscheidet, aber eine bekannte Liste der Fehlerursachen hat, müssen Sie den Grund und nicht die Fehlermeldung angeben.
      Ein Beispiel ist ><>, das nur eine Fehlermeldung enthält something smells fishy..., aber die Wiki-Seite von esolangs enthält eine Liste der Fehlerursachen.
  • Syntaxfehler sind nur zulässig, wenn sie durch Aufrufen eval()oder ähnliches generiert werden .
  • Manuelles Werfen (über throw(JS), raise(Python), die(Perl) oder ähnliches) ist erlaubt, aber alle werden als eine Art von Fehler angesehen.
  • Fehler durch ungültigen Befehl in 2D oder Golflang sind ebenfalls zulässig (und werden als eine Art von Fehler behandelt).

Beispiele

Python und Ruby

  • Python: This program errors out in Python :Pzu stdout, dann undefinierter Bezeichner
  • Ruby: This program errors out in Ruby :PZu stdout, dann außerhalb der Grenzen indexieren

C89 und C99

  • C89: This program errors out in C 89 :Pauf Standard , dann Division durch Null
  • C99: This program errors out in C 99 :PZu Standard, dann Segmentierungsfehler

Beachten Sie, dass die Versionsnummer immer durch ein Leerzeichen vom Namen der Sprache getrennt sein muss.

Python 2.7.9 und Python 2.7.10

  • Python 2.7.9: This program errors out in Python 2.7.9 :PZu stdout, dann Syntaxfehler bei eval
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pnach stdout, dann key error on dict

Perl und Perl -n

  • Perl: This program errors out in Perl :Pzu stdout, dann ungültiges Zeitformat
  • Perl -n: This program errors out in Perl -n :Pzu stdout, dann versuchen Sie, eine Datei zu öffnen, die nicht existiert

Gewinnbedingung

Das ist , also gewinnt der kürzeste Code in Bytes. Aber Sie werden immer aufgefordert, eine Antwort zu schreiben, die Spaß macht oder interessant ist, auch wenn sie nicht sehr kurz ist.



Muss der Fehler das Programm anhalten?
Jo King

Das habe ich mir anfangs gedacht. Wenn es jedoch einige Sprachen gibt, die nach so etwas wie "Division durch Null" (möglicherweise mit undefiniertem Verhalten) fortgesetzt werden, mit einem Mechanismus zum Bestätigen, dass das Programm auf diesen Fehler gestoßen ist, dann werde ich das gerne zulassen.
Bubbler

Ich glaube, ich kenne die Antwort bereits, aber nur für den Fall: Darf der Satz This program errors out in ...gemischte Tabulatoren / Leerzeichen anstelle von Leerzeichen enthalten?
Kevin Cruijssen

Verwandte (zwei verschiedene Texte in zwei verschiedenen Sprachen drucken).
Kevin Cruijssen

Antworten:


33

Python 2 / Python 3 , 60 Bytes

print("This program errors out in Python %d :P"%(3/2*2))*1;a
  • Python 2 bekam NameError: name 'a' is not defined
  • Python 3 bekam unsupported operand type(s) for *: 'NoneType' and 'int'

Python 2:

  • /ist eine Ganzzahldivision, 3/2 hat 1; int (3/2 * 2) ist 2.
  • print ist eine Anweisung, daher bedeutet die erste Anweisung print((...)*1), *1dass die Zeichenfolge einmal wiederholt wird.
  • Die zweite Anweisung verwies auf eine nicht vorhandene Variable, die den Fehler verursachte.
  • Probieren Sie es online!

Python 3:

  • '/' ist gleitende Zahlenteilung, 3/2 hat 1,5; int (3/2 * 2) ist 3.
  • print ist eine Funktion, daher lautet die erste Anweisung wie folgt (print(...))*1.
  • Funktion printkehrt zurück None; Die Multiplikation funktioniert nicht None x int, daher wird "nicht unterstützter Operand" gemeldet.
  • Probieren Sie es online!

15

C und C ++ 114 101 Bytes

-13 bytes dank l4m2 !

#include<stdio.h>
main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}

Segmentierungsfehler in C ++, Gleitkomma-Ausnahme in C.

autowird standardmäßig intin C so (int).5wird 0, so dass der Versuch, durch es zu teilen, im Grunde durch Null dividiert wird.

In C ++ 1/dist es 2, wenn Sie es zur Adresse von hinzufügen dund versuchen, den Wert dieser Adresse zu ändern, wird ein Segfault ausgelöst.

Probieren Sie es in C ++!
Probieren Sie es in C!


1
Nicht sicher , ob es hilft, aber wenn Sie Karte C / C ++ bis 2 und 0, könnten Sie "++"+n, wo nist 0für C ++ und 2für C
Conor O'Brien

2
d?"++":""9 char, "++"+4*d8 char. Bekommt aber C / C ++ rückwärts. Seufzer.
Yakk

1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105) obwohl ich nicht weiß warum
l4m2

1
Auch intkann entfallen
l4m2

Schlagen Sie L"⬫"+!dstattdessen vord?"++":""
ceilingcat

14

JavaScript + HTML / HTML + JavaScript, 160 Byte

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

Ich bin nicht sicher, ob dies zwei Sprachen sind, aber es ist lustig.


Ersterer ist also ein undefinierter Bezeichner, letzterer ist ein Funktionsaufruf für einen Nicht-Funktionstyp. Technisch würde ich das erstere HTML und das letztere JavaScript in Betracht ziehen, aber wirklich nette Idee.
Bubbler

Eine gute Verwendung <!-- ... -->als einzeilige Kommentar-Marker (ich weiß, dass dies aus Gründen der Abwärtskompatibilität in der Spezifikation ist)
Shieru Asakoto

12

Java 8 & C99, 172 Bytes

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Basierend auf meine Antwort auf die ‚abc‘ und ‚cba‘ Herausforderung .

Versuchen Sie es in Java 8 - was zu einer ArrayIndexOutOfBoundsException führt: 1 .
Versuchen Sie es in C - dies führt zu einer Gleitkomma-Ausnahme: Division durch Null ist undefiniert .

Erläuterung:

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Wie Sie im obigen Java-hervorgehobenen Code sehen können, ist die erste Zeile ein Kommentar aufgrund //und der C-Code ist ein Kommentar aufgrund /* ... */, was zu Folgendem führt:

interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]="";}}

Also druckt es auf STDOUT und versucht dann, auf das zweite Programmargument zuzugreifen (wenn keines angegeben ist), so dass es die ArrayIndexOutOfBoundsException erzeugt .


//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Ich bin mir nicht sicher, wie ich C-Hervorhebung richtig aktivieren soll, da dies lang-czu derselben Hervorhebung wie bei Java führt. Aber //\ich werde die nächste Zeile, den Java-Code, auskommentieren, was zur Folge hat:

main(n){{n=puts("This program errors out in C99 :P")/0;}}

Daher wird auf STDOUT zurückgegriffen und anschließend ein Fehler durch Null dividiert.


Ich denke, es wird sowohl mit C89 als auch mit C99 funktionieren. Halte mich nicht fest.
SIGSTACKFAULT

Das //wurde mit C99 zu C hinzugefügt.
Betseg

Ich danke Ihnen beiden, ich habe es geändert C99.
Kevin Cruijssen

Warum a[1]statt a[0]?
Xehpuk

@xehpuk Kein besonderer Grund. Es ist egal, welche Ziffer ich benutze und ich hatte bereits 1von Anfang an eine eingegeben. Kann verwendet haben 0, 9etc. auch. Wenn ich etwas über diesen Beitrag zu bearbeiten habe, werde ich es gleichzeitig ändern 0.
Kevin Cruijssen

11

Java 8 & Whitespace , 439 431 428 408 Bytes

                         






























 interface a{static void    main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}













Versuchen Sie es in Java 8, was zu einer ArrayIndexOutOfBoundsException von 0 führt .
Versuchen Sie es in Whitespace - was zu einem Benutzerfehler führt (Infix Plus nicht möglich) .

Erläuterung:

Java 8:

interface a{static void main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}

Also druckt es nach STDOUT und versucht dann, auf das erste Programmargument zuzugreifen (wenn keines angegeben ist), so dass es die ArrayIndexOutOfBoundsException erzeugt .


Leerzeichen:

[S S T  T   T   T   T   T   N
_Push_-31_P][S S T  T   T   S T S T N
_Push_-53_:][S S T  T   S S T   T   T   T   N
_Push_-79_space][S S T  T   S T S N
_Push_-10_e][S S T  T   T   S S N
_Push_-12_c][S S T  T   T   T   S N
_Push_-14_a][S S S T    N
_Push_1_p][S S S T  S S N
_Push_4_s][S S T    T   S T S N
_Push_-10_e][S S S T    S T N
_Push_5_t][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S S S N
_Push_-24_W][S T    S S T   S T S N
_Copy_0-based_10th_(-79_space)][S S T   T   N
_Push_-1_n][S S T   T   T   S N
_Push_-6_i][S T S S T   S N
_Copy_0-based_2nd_(-79_space)][S S S T  S T N
_Push_5_t][S S S T  T   S N
_Push_6_u][S S S N
_Push_0_o][S T  S S T   T   N
_Copy_0-based_3rd_(-79_space)][S S S T  S S N
_Push_4_s][S S S T  T   N
_Push_3_r][S S S N
_Push_0_o][S S S T  T   N
_Push_3_r][S N
S _Duplicate_top_(3_r)][S S T   T   S T S N
_Push_-10_e][S T    S S T   T   S N
_Copy_0-based_6th_(-79_space)][S S T    T   S N
_Push_-2_m][S S T   T   T   T   S N
_Push_-14_a][S S S T    T   N
_Push_3_r][S S T    T   S S S N
_Push_-8_g][S S S S (_Note_the_additional_S_here)N
_Push_0_o][S S S T  T   N
_Push_3_r][S S S T  N
_Push_1_p][S T  S S T   T   T   N
_Copy_0-based_7th_(-79_space)][S S S T  S S N
_Push_4_s][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S T T   N
_Push_-27_T][N
S S N
_Create_Label_LOOP][S S S T T   S T T   T   T   N
_Push_111][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Buchstaben S(Leerzeichen), T(Tabulator) und (Zeilenvorschub) werden Nnur als Hervorhebungen hinzugefügt.
[..._some_action]nur als Erklärung hinzugefügt.

Probieren Sie diese hervorgehobene Version aus.

Whitespace ist eine stapelbasierte Sprache, die alles außer Leerzeichen, Tabulatoren und Zeilenumbrüchen ignoriert. Hier ist das gleiche Programm in Pseudocode:

Push all unicode values of "P: ecapsetihW tuo srorre margorp sihT", minus 111
Start LOOP
  Push 111
  Add the top two stack values together
  Print as character
  Go to the next iteration of the LOOP

Sobald alle Werte gedruckt wurden und der Stack leer ist, tritt ein Fehler auf, wenn das Hinzufügen versucht wird ( TSSS) ausgeführt wird, wofür zwei Elemente auf dem Stapel erforderlich sind.

Ich habe die Konstante 111mit diesem Java-Programm generiert , das ich auch für frühere ASCII-bezogene Herausforderungen in Whitespace verwendet habe. Außerdem habe ich einige Kopien für die Leerzeichen verwendet, um Bytes zu sparen.

Ein wichtiger Punkt ist der Trick, mit dem ich das Java-Programm in die Whitespace-Antwort eingefügt habe. Lassen Sie mich zunächst erklären, wie eine Zahl in Whitespace verschoben wird:

Szu Beginn: Stack-Manipulation aktivieren;
S: Drücke was folgt als Nummer;
Soder T: positiv oder negativ;
Einige Sund / oder T, gefolgt von einer N: Zahl als Binärzahl, wobei T=1und S=0.

Hier einige Beispiele:

  • Drücken Sie den Wert 1 wird SSSTN;
  • Drücken Sie den Wert -1 wird SSTTN;
  • Drücken Sie den Wert 111 wird SSSTTSTTTTN.
  • Den Wert Pushing 0 sein kann SSSSN, SSTSN, SSSN, SSTN, SSSSSSSSSSSSNusw. (Wenn Sie SSSN(oder SSTN), wissen wir nicht den binären Teil angeben müssen, weil sie implizit zum 0 , nachdem wir ihr Vorzeichen angegeben haben.)

Es SSSNreicht also aus, um den Wert zu erhöhen 0( oin diesem Fall für den Buchstaben verwendet ). Aber um das Java-Programm in dieses Golf-Whitespace-Programm einzufügen, brauchte ich ein zusätzliches Leerzeichen, damit die ersten beiden omit SSSN, aber das dritte mit gedrückt werden SSSSN, damit wir genug Platz für den Satz des Java-Programms haben.


10

CBM BASIC und 6502 Maschinencode (C64), 142 144 Bytes

Musste 2 Bytes nach dem Erkennen eines Syntaxfehlers hinzufügen war nicht erlaubt ....


Hexdump der .prgDatei:

01 08 50 08 00 00 8F 5A 49 52 49 41 A9 17 8D 18 D0 A2 30 BD 30 08 20 D2 FF E8
E0 4B D0 F5 A2 30 BD 05 08 20 D2 FF E8 E0 44 D0 F5 A9 0D 20 D2 FF A2 1A 4C 37
A4 22 36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0 22 20 20 20
20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22 D4 48 49 53 20 50 52
4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54 20 49 4E 20 C3 C2 CD 2D C2 C1
D3 C9 C3 20 3A D0 22 2C 58 AD 50 00 00 00

Die CBM-BASIC-Ansicht , wie im C64-Editor aufgeführt:

0 remziriastepgosubinput#new0exp0 dim.clrsavekinput#stepnew0exp<white> dim.clrsavedinput#stepstep
 dim.newl7to"6502 machine code :P"
1 poke53272,23:print"This program errors out in CBM-BASIC :P",x/p

ursprüngliche Auflistung

Achtung : Es ist nicht möglich, dieses Programm im BASIC-Editor korrekt einzugeben. Versuchen Sie nicht einmal , dieses Programm im BASIC-Editor zu bearbeiten , da es sonst abstürzt. Trotzdem ist es ein lauffähiges BASIC-Programm;)


Die Maschinencodeansicht 6502 :

         01 08                          ; load address

.C:0801  50 08       BVC $080B          ; jump to real start of mc

         ; line number (00 00), REM (8F) and "ziria"
.C:0803  00 00 8F 5A 49 52 49 41

.C:080b  A9 17       LDA #$17
.C:080d  8D 18 D0    STA $D018          ; set upper/lower font
.C:0810  A2 30       LDX #$30
.C:0812  BD 30 08    LDA $0830,X
.C:0815  20 D2 FF    JSR $FFD2          ; print "This program errors ..."
.C:0818  E8          INX
.C:0819  E0 4B       CPX #$4B
.C:081b  D0 F5       BNE $0812
.C:081d  A2 30       LDX #$30
.C:081f  BD 05 08    LDA $0805,X
.C:0822  20 D2 FF    JSR $FFD2          ; print "6502 machine code :P"
.C:0825  E8          INX
.C:0826  E0 44       CPX #$44
.C:0828  D0 F5       BNE $081F
.C:082a  A9 0D       LDA #$0D
.C:082c  20 D2 FF    JSR $FFD2          ; print a newline
.C:082f  A2 1A       LDX #$1A           ; error code for "can't continue"
.C:0831  4C 37 A4    JMP $A437          ; jump to error handling routine

.C:0834  22 ; '"'

         ; "6502 machine code :P"
.C:0835  36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0

         ; '"', some spaces, and next BASIC line
.C:0849  22 20 20 20 20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22

         ; "This program errors out in CBM-BASIC :P"
.C:0860  D4 48 49 53 20 50 52 4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54
.C:0877  20 49 4E 20 C3 C2 CD 2D C2 C1 D3 C9 C3 20 3A D0

.C:0887  22 2C 58 AD 50 00 00 00

Online-Demo , geben Sie einrun, um als BASICsys 2049auszuführen, um als Maschinencode auszuführen,list um anzuzeigen, dass er als BASIC-Code interpretiert wird.

Als BASIC division by zero error in 1ausführen erzeugt a , als Maschinencode ausführen acan't continue error

Bildschirmfoto


Erläuterung:

Die ersten zwei Bytes einer .prgDatei sind die Ladeadresse in Little Endian, dies ist hier $0801(dezimal 2049) die Startadresse für BASIC-Programme auf dem C64. runStartet dieses Programm im BASIC-Interpreter. Dabei sys 2049handelt es sich um den Befehl zum Ausführen eines Maschinencode-Programms unter der Adresse2049 .

Wie Sie sehen, ist die erste Zeile in der BASIC-Ansicht ein Kommentar ( rem), der "Garbage" und einen Teil der erforderlichen Ausgabezeichenfolge enthält. Dies ist das Maschinencodeprogramm und einige Füllbytes. Sie sehen dort einige "zufällige" BASIC-Befehle, da CBM-BASIC-Programme die Befehle als Einzelbyte-Werte "tokenisiert" enthalten und einige dieser Werte mit den im Maschinencode verwendeten Opcodes identisch sind. Der Maschinencode verwendet die in der zweiten Codezeile vorhandene Zeichenfolge für die Ausgabe.

Die ersten zwei Bytes einer Zeile eines Basisprogramms sind hier ein Zeiger auf die nächste Zeile $0850. Dies wird mit Bedacht gewählt, da 50 08es sich auch um einen 6502-Verzweigungsbefehl handelt, der über die nächsten 8 Bytes springt, wenn das Überlaufflag nicht gesetzt ist. Dies wird verwendet, um bei Ausführung als Maschinencode irgendwo in die Mitte dieser "Kommentar" -Zeile zu springen. Das 50ist der Opcode hier verwendet wird , so dass die zweite Leitung an beginnen muss 0850für den Trick an der Arbeit. Aus diesem Grund sehen Sie eine Folge von 5 20Bytes (Leerzeichen) zum Auffüllen. Der Maschinencode springt aktiv zur ROM-Fehlerbehandlungsroutine, um den Fehler "Kann nicht fortgesetzt werden" zu erhalten.

Der BASIC-Code ist ziemlich einfach; Als zweites Argument für "print" werden zwei nicht initialisierte Variablen (mit einem Wert 0in CBM BASIC) geteilt, wodurch der Fehler "Division durch Null" ausgelöst wird.


2
Sie, Sir, sind ein echter Programmierer. Wie bist du darauf gekommen? Atari-Programmierung?
Orion

@Orion danke :) Grundsätzlich habe ich mit der zweiten Zeile begonnen, die als normales BASIC eingegeben wurde, sie mithilfe des in vice (Emulator) eingebauten Maschinencode-Monitors aus dem Weg geräumt, den Maschinencode direkt zum RAM zusammengesetzt und die Zeilenzeiger von manuell repariert das Grundprogramm ...
Felix Palmen

9

> <> und Foo , 42 Bytes

#o<"This code errors in "p"Foo"'><>'" :P"/

Probieren Sie es in> <>!

Probieren Sie es in Foo!

Foo druckt ", wie gut dokumentiert, alles ein und versucht am Ende, durch Null zu dividieren. Es ignoriert die '><>'.

><>schiebt das "Foo" auf den Stapel, knallt es aber sofort mit p. Nachdem es alles auf den Stapel gedruckt hat, wird #o<es beendet, wenn der Stapel mit der einzigen ihm bekannten Fehlermeldung leer ist.something smells fishy...


Der Grund des Fehlers ist wichtig, nicht die Fehlermeldung. Die esolang-Seite auf ><>hat eine Liste von Fehlerursachen, daher sollten Sie meines Erachtens eine davon angeben, nicht something smells fishy....
Bubbler

2
@Bubbler Der Fehler wird durch das Aufspringen von einem leeren Stapel verursacht.
Esolanging Fruit

3
Mit pPop Fooist sehr klug!
Esolanging Fruit

6

C und Python 126 116 Bytes

-10 Bytes dank @Bubbler!

#1/*
-print("This program errors out in Python :P")
'''*/
main(c){c=puts("This program errors out in C :P")/0;}//'''

In Python ist print () ein None, daher macht es keinen Sinn, sein Negativ zu erhalten, und Python gibt einen Fehler aus.

In C gibt printf () ein int zurück, sodass eine Gleitkomma-Ausnahme entsteht, wenn man es durch Null teilt.

Probieren Sie es in C!
Probieren Sie es in Python!


1
Sie können -print(...)a TypeErrorin Python erhöhen , und dann können Sie Floating Point Error (Division durch Null) in C erstellen. In Kombination mit einigen redundanten Zeilenumbrüchen sind dies 116 Bytes ( Python , C ).
Bubbler

5

Attache + Wolfram Language (Mathematica) , 82 Byte

s:="Attache"
s=" Mathematica "
Throw[Print["This program errors out in",s,":P"]-0]

Versuchen Sie Attache online! Probieren Sie Mathematica online aus!

Dies hängt von der Bedeutung des Operators =in den beiden Sprachen ab. In Attache wird die Gleichheit verglichen, in Mathematica wird jedoch eine Variablenzuweisung durchgeführt. :=Führt eine variable Zuweisung in beiden Sprachen durch.

In Attache wird nun Printein Array mit gedruckten Zeichenfolgen zurückgegeben, und bei Zeichenfolgen und ganzen Zahlen (dh 0) ist keine Subtraktion möglich . Es wird also ein Tippfehler ausgelöst. In Mathematica Printkehrt zurück Null, und Mathematica ist gut darin, davon abzuziehen 0. Aber wir werfen diese Null manuell mit Throwund geben einen nocatchFehler aus.


hinweis: dies funktioniert bei aktuellen versionen von attache aufgrund eines fehlers nicht. Ich werde versuchen, das bald zu beheben
Conor O'Brien

5

Python (2) und QB64 , 82 Bytes

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Um die Python-Version zu testen, können Sie sie online testen ! Um die QB64-Version zu testen, müssen Sie QB64 herunterladen.

Was Python sieht

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Die erste Zeile ist nur der bloße Ausdruck 1(No-Op), gefolgt von einem Kommentar.

In der zweiten Zeile wird sdie Zeichenfolge festgelegt "QB64", in der dritten Zeile wird sie jedoch sofort in geändert "Python". Die vierte Zeile gibt die Nachricht entsprechend aus.

Die fünfte Zeile ist ein weiterer bloßer Ausdruck, der jedoch NameErroraufgrund des undefinierten Namens ein auslöst CLS.

Was QB64 sieht

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Die nummerierte erste Zeile 1#definiert jede Variable, deren Name mit S(ohne Berücksichtigung der Groß- / Kleinschreibung) beginnt, als Zeichenfolgenvariable. Das heißt, wir müssen nicht verwenden s$, was in Python ein Syntaxfehler wäre.

Die zweite Zeile enthält sdie Zeichenfolge "QB64". 'Beginnt ein Kommentar in QB64, so dass die dritte Zeile nichts tut. Die vierte Zeile gibt die Nachricht entsprechend aus.

Die fünfte Zeile versucht CLSmit einem Argument von (clear screen) -1. Da aber CLSnur akzeptiert Argumente 0, 1oder 2, dies erzeugt den Fehler Illegal function call. Der Fehler erstellt ein Dialogfeld, in dem der Benutzer gefragt wird, ob er die Ausführung fortsetzen oder den Vorgang abbrechen möchte. Technisch bedeutet dies, dass der Fehler nicht schwerwiegend ist (in diesem Fall können Sie "Ausführung fortsetzen" auswählen und das Programm wird einfach ohne weitere Probleme beendet). Das OP hat jedoch explizit Sprachen zugelassen, die nach einem Fehler fortgesetzt werden können. Daher sollte das Verhalten von QB64 in Ordnung sein.


3

Perl 5 und JavaScript (Node.js) , 96 Byte

eval("printf=console.log");printf("This program errors out in %s :P",("Perl","JavaScript"));$//0

Hierbei wird die Tatsache ausgenutzt , dass (...)es sich um eine Liste in Perl handelt, printfdie das linke Element von verwendet, und die Tatsache, dass es der Kommaoperator in JavaScript ist, der das rechte Argument zurückgibt.

Verursacht einen Fehler bei der Division durch Null in Perl und einen ReferenceError, da dieser $nicht in JavaScript definiert ist.

Probieren Sie das Perl online!

Probieren Sie das JavaScript online!


3

Oktave und MATLAB, 67 Bytes

v=ver;disp(['This program errors out in ' v(1).Name ' :P']);v(--pi)

Probieren Sie es online!

Hinweise: Der Code geht davon aus, dass MATLAB ohne Toolbox installiert ist (oder dass die Namen aller installierten Toolboxen nicht mit den Buchstaben A bis M beginnen).

Wie es funktioniert:

Der Code erhält die Versionsdaten für den Interpreter und die verwendeten Toolboxen ver. Beim Ausführen wird v(1).Nameder Name des ersten Produkts extrahiert. Dies wird entweder zurückgegeben Octaveoder MATLABvorausgesetzt, dass der obige Hinweis zutrifft.

Das Programm zeigt dann die erforderliche Zeichenfolge mit Octaveoder MATLABnach Bedarf an.

Endlich machen wir es v(--pi).

In Octave --ist dies der Operator vor der Dekrementierung. Als solches versucht es vorzudekrementieren, was fehlschlägt, da die Variable pinicht existiert ( piist tatsächlich eine Funktion, keine Variable).

This program errors out in Octave :P
error: in x-- or --x, x must be defined first

In MATLAB ist der Operator vor der Dekrementierung nicht vorhanden. Als solche wird die Aussage so interpretiert, v(-(-pi))dass sie gleich gerecht ist v(pi). Ist pijedoch keine Ganzzahl und kann daher nicht zum Indizieren des vArrays verwendet werden, was zu einem Fehler führt.

This program errors out in MATLAB :P
Subscript indices must either be real positive integers or logicals.

3

C ++ 14 (gcc) / C ++ 17 (gcc) , 107105 Bytes

#include<cstdio>
int*p,c=*"??/0"/20;int
main(){*p=printf("This program errors out in C++ 1%d :P",4+c)/c;}

Probieren Sie es online! (C ++ 14)

Probieren Sie es online! (C ++ 17)


Es wird davon ausgegangen, dass (zusätzlich zu ) im globalen Namespace <cstdio>deklariert wird und dass der grundlegende Ausführungszeichensatz ASCII-Werte verwendet, die beide mit g ++ unter Linux wahr sind.printfstd

Der grundlegende Haken dabei ist, dass C ++ 17 Trigraphen aus der Sprache entfernt hat.

"??/0"Enthält in C ++ 14 ein Trigraph und ist äquivalent zu "\0". Ist *"??/0"also Null und cwird auf Null gesetzt. Die Zahl 4 wird als Argument an übergeben printf, dann verursacht die Division durch cundefiniertes Verhalten. Unter Linux passiert dies, bevor *pdas Bild angezeigt wird und das Programm eine SIGFPE.

In C ++ 17 "??/0"ist es genau die Zeichenfolge mit der Länge 4, die es zu sein scheint. So *"??/0"ist '?'oder 63 und cwird auf 3 gesetzt. Die Zahl 7 wird als Argument an übergeben printf, und dieses Mal ist die Division durch cgültig. Da pes sich um ein Namespace-Mitglied handelt, wird es beim Start des Programms mit Null initialisiert und hat einen Nullzeigerwert. Dies *pist ein undefiniertes Verhalten. Unter Linux erhält das Programm ein, da das Programm versucht, den Speicher an der Adresse Null zu ändern SIGSEGV.


main's Rückgabetyp kann weggelassen werden, also -3 Bytes.
Max Yekhlakov


2

C (gcc) / Stax , 109 Bytes

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Probieren Sie es online! (C (gcc))

Probieren Sie es online! (Stax) oder Run und debuggen Sie es! (Stax)

Segfault in C. Ungültige Operation in Stax. Ich liebe es, wie alles, was kein Kommentar ist, in Stax verwendet wird.

C

So sieht es C. Die erste Zeile ist no-op. In der zweiten Zeile wird die Nachricht mit printfund dann aufgrund von mit ausgegeben =0.

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P\n",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Stax

Das Stax-Programm wird immer dann beendet, wenn versucht wird, einen Blick auf einen leeren Stapel zu werfen. Das macht es ein bisschen schwierig und wir müssen einen Stapel vorbereiten, der nicht leer ist. AA=~1;tut dies, während es eine gültige Aussage in C bleibt.

AA=~1;
AA=       10=10, returns a 1
   ~      Put it on the input stack
    1     Pushes a 1 to main stack (*)
     ;    Peek from the input stack (**)

Was wirklich nützlich ist ~, ist das , es bereitet einen nicht leeren Eingabestapel vor, so dass das ;ausgeführt werden kann, ohne das Programm zu verlassen. Die beiden 1s auf dem Hauptstapel werden jedoch auch später verwendet.

Die zweite Zeile beginnt mit einem Tabulator und einem Zeilenkommentar in Stax.

"...";;;/*dp`UGYC\`Q*/
"..."                     "This program errors out in"
     ;;;                  Peek the stack three times so that we have enough operands for the next two operations
        /                 Divide, this consumes one element of the main stack
         *                Multiply, this consumes another element
          d               Discard the result, now the TOS is the string
           p              Pop and print without newline
            `UGYC\`       Compressed string literal for " Stax :P"
                   Q      Print and keep the string as TOS
                    *     Duplicate string specific times
                          Since the element under the top of stack is `1` that was prepared in (**), this does nothing
                     /    Invalid operation error

Die ungültige Operation versucht, eine /Operation für eine Zeichenfolge als TOS (2. Operand) und die Zahl 1von (*) als 1. Operand auszuführen, was ungültig ist.

Wenn die beiden Operanden vertauscht werden, ist dies eine gültige Operation in Stax.


2

Jelly und M , 39 Bytes

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ

Probieren Sie es in Jelly!

Probieren Sie es in M!

Beide Sprachen gelten umgekehrt İ, 0was inffür Jelly und zoofür M ergibt . Ich weiß nicht, warum zooUnendlichkeit in M ​​bedeutet. Frag Dennis.

Der wichtige Unterschied ist, dass Jellys Unendlichkeit sich selbst gleicht, während Ms Unendlichkeit es nicht ist. So =`ergibt die "ist gleich sich selbst" Monade 1in Jelly und 0in M. Von hier:

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ
İ=`                                      0 in M, 1 in Jelly
    “¢³ƥ“Ȥ¹»                             Pair of compressed strings: [' M',' Jelly']
   ị                                     Index into this list with 0 or 1
            ;“ :P”                       Concatenate with the string ' :P'
                  “¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»       Compressed string: 'This program errors in'
                                  ;      Prepend this to ' Jelly/M :P'
                                   Ȯ     Print the string and return it
                                    Ṡ    Sign. M errors with a string as input and terminates
                                         Jelly returns a list of Nones
                                     ṛ   Right argument. This prevents the list of Nones from being printed
                                      Ɠ  Read a single line from input. Since input is not allowed, this produces an EOFError

Jellys Fehler ist EOFError: EOF when reading a line.

M's Fehler ist TypeError: '>' not supported between instances of 'str' and 'int'.


1
Wie macht man das überhaupt in zwei Esolangs?
Magic Octopus Urn

2

Foo / CJam , 51 50 Bytes

"This program errors out in ""Foo"/'C'J'a'm" :P"Li

Dies wird mit einem Fehler beim Teilen durch Null in Foo und einem Fehler NumberFormatExceptionin CJam beendet.

An CJam:

  • Ein Zeichenkettenliteral (zwischen Anführungszeichen) schiebt sich zum Stapel. Elemente aus dem Stapel werden automatisch ohne Trennzeichen gedruckt, wenn das Programm beendet wird.
  • / versucht die Zeichenkette zu teilen This program errors out in in der TeilzeichenfolgeFoo . Da die Zeichenfolge keine Teilzeichenfolge enthält, wird ein Singleton-Array mit der ursprünglichen Zeichenfolge erstellt, die auf genau die gleiche Weise angezeigt wird.
  • 'x ist ein Zeichenwörtlich für x , das wie eine Zeichenfolge mit gedruckt wird. Auf diese Weise können wir Daten für CJam übertragen, die von Foo ignoriert werden (ich habe nicht herausgefunden, wie man eine Schleife erstellt, die in Foo nicht ausgeführt wird).
  • Liversucht, die leere Zeichenfolge in eine Ganzzahl umzuwandeln, was fehlschlägt. Alles vom Stapel wird gedruckt.

Zu Foo:

  • Ein String-Literal (zwischen Anführungszeichen) gibt sich selbst aus.
  • / versucht, die aktuelle Zelle durch das oberste Stapelelement zu teilen (was implizit ist) 0 ). Aus irgendeinem Grund sind Divide-by-0-Fehler in Foo nicht schwerwiegend, daher wird die Nachricht nur gedruckt
    Only Chuck Norris can divide by zero.
    zu STDERR und macht weiter.
  • Nicht erkannte Zeichen ( 'C'J'a'mund Li) werden ignoriert.

2
Sind die letzten 50 Bytes nicht?
Bubbler

@Bubbler Habe vergessen, das zu bearbeiten, sorry.
Esolanging Fruit

7
Ich denke, es gibt einen Fehler im Foo-Interpreter. Es sollte offensichtlich Fehler mit Only Jon Skeet can divide by zero. meta.stackexchange.com/a/9138

2

Python und Lua , 111 110 102 98 95 85 Bytes

x="This program errors out in ",#[[
print(x[0]+"Python :P")
a#]]z=#print(x.."Lua :P")

Fehler: Python 3:

Traceback (most recent call last):
  File ".code.tio", line 3, in <module>
    a#]]z=#print(x.."Lua :P")
NameError: name 'a' is not defined

Lua:

lua: .code.tio:3: attempt to get length of a nil value
stack traceback:
    .code.tio:3: in main chunk
    [C]: in ?

Deutlich zu unterscheiden.

Missbräuche mehrere Unterschiede:

  • <var>=<a>,<b>,... Erstellt ein Tupel in Python, aber in Lua erstellt es eine Argumentliste, aus der nur das erste Mitglied entnommen wird.
  • #Startet einen Kommentar in Python, ist aber der Längenoperator in Lua. Zusätzliche Requisiten für Python, damit Tupel mit einem Komma enden können.
  • [[...]]ist die mehrzeilige Zeichenfolgensyntax von Lua, was bedeutet, dass sie nicht einmal die Druckfunktion von Python sieht. Dies ist notwendig, weil Lua die ..Zeichenfolge verkettet und nicht +.
  • Python-Fehler nach dem Anzeigen aeiner undefinierten Variablen; Lua danach z=#print(x.."Lua :P"). Nur #print(x.."Lua :P")für Lua zu verwenden, funktioniert nicht, da dies einen Fehler auslöst, bevor der Code überhaupt ausgeführt wird.

Bearbeitungen:

  • Keine Notwendigkeit, "".joinin Python, -1 Byte zu verwenden
  • Erstellen Sie xeine Zeichenfolge in beiden Sprachen und platzieren Sie Pythonin der Druckfunktion -8 Byte in einem Zeichenfolgenliteral
  • Using #[[]]ist kürzer als #""und --[[]], -4 Bytes
  • Keine Verwendung #1als Tabellenschlüssel erforderlich , -3 Byte
  • Jo König tat dies , -9 Bytes
  • print(x.."Lua :P")Anscheinend die Länge des Rückgabewerts von Werken nehmen; -1 Byte


2

Java und C # 242 235

/**\u002f/*/using System;/**/class G{public static void/**\u002fmain/*/Main/**/(String[]a){String s="This program errors out in ";/**\u002fSystem.out.print(s+"Java :P");/*/Console.Write(s+"C# :P")/**/;s=/**\u002f(1/0)+""/*/a[-1]/**/;}}

Missbrauch der unterschiedlichen Escape-Behandlung zwischen Java und C # (Unicode-Escape-Zeichen werden vor dem Parsen von Code in Java und nicht in C # analysiert) als eine Art Präprozessor, das ist die Aufgabe der \u0027 Magie.

Edit: Ab 8 Bytes dank eines Zeigers von @KevinCruijssen

Edit: Regel derp behoben


Sie können 6 Bytes Golf spielen, indem Sie beide Stringin ändern var(Java 10 unterstützt dies). (Oder 5 durch Ändern String s="...";von String s="...",x;und Entfernen Stringvor x=Java 9 oder früher).
Kevin Cruijssen

1
Die Wiederverwendung des S-Strings funktioniert auch für Java99 und früher. @ KevinCruijssen
masterX244

2

AutoHotKey / C #, 155 133 128 122 Bytes

Syntaxhervorhebung erklärt es besser als ich könnte:

C # RuntimeBinderException: "Nicht delegierter Typ kann nicht aufgerufen werden"

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

AutoHotkey- Fehler: Eine Ausnahme wurde ausgelöst.

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

Bearbeitungen:

  1. entfernte eine var
  2. -5 Bytes dank Milch

2
Hier ist eine etwas kürzere Ausnahme in C # zu werfen: i+=i[-1]. System.IndexOutOfRangeException: 'Index lag außerhalb der Arraygrenzen.'
melken Sie am

2
Noch etwas kürzer zu verwenden, dynamicanstatt varMicrosoft.CSharp.RuntimeBinder.RuntimeBinderException auszulösen: 'Kann keinen nicht delegierten Typ aufrufen' mit i().
Milch

2

PHP 7+ / JavaScript, 90 89 Bytes

Dies verwendet zwei Sprachen mit sehr ähnlicher Syntax, sodass dieser Code in beiden Sprachen geschrieben werden kann.

Die Sprachentrennung erfolgt durch eine Eigenschaft, die in JavaScript nicht vorhanden ist: PHP betrachtet [](leeres Array) als einen falschen Wert, während es in JavaScript wahr ist (weil es ein Objekt ist und Objekte immer wahr sind, auch new Boolean(false)).

$X='This program errors out in %s :P';([]?console.log($X,'JavaScript'):printf($X,PHP))();


Ausführung:

Konzentriert sich auf die folgenden Code: ([]?console.log($X,'JavaScript'):printf($X,PHP))();.

Die String-Zuweisung funktioniert in beiden Sprachen gleich.

Dieser Code verwendet den "ternären Operator" ( Javascript , PHP ), der in beiden Sprachen zumeist gleich funktioniert.

Javascript

Javascript wird das ausführen console.log($X,'JavaScript') Stück , das zurückkehrt undefined.

Später, wenn Sie versuchen, auszuführen (...)() , erhalten Sie eine Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function(in Google Chrome).

PHP

PHP wird das ausführen printf($X,PHP) Stück .

In PHP gibt die printfFunktion die Länge der Ausgabe zurück .

PHP hat eine interessante Funktionalität: Es kann Funktionen ausführen, deren Name in einer Variablen gespeichert ist (oder seit PHP7 als Ergebnis eines Ausdrucks), wodurch ein Syntaxfehler verhindert wird.

PHP wird dann versuchen, die Funktion auszuführen, deren Name das Ergebnis des Ausdrucks ist []? ... :printf($X,PHP)(welcher die Zahl ist 33).
Diese interessante Funktion hat jedoch eine Einschränkung: Sie akzeptiert nur Zeichenfolgen (duh!).

Dies führt zu einem Fatal error: Function name must be a string, weil 33ein int.


Vielen Dank an Shieru Asakoto , der mir 1 Byte gespart hat!


1
[]ist kürzer als '0'und wird auch in JS und PHP unterschiedlich ausgewertet, also vielleicht ein -1 Byte hier?
Shieru Asakoto

Ich habe viele Fragen mit dieser Frage, wo []Bedürfnisse statt verwendet werden '0', '\0', '\0'=="0"und verwendet , dass []sowohl vor als auch. Aber danke, dass Sie diese Frage entdeckt haben.
Ismael Miguel

1

Perl 5 und C, 95 Bytes

//;$_='
main(){puts(puts("This program errors out in C :P"));}//';/T.*n /;print$&,"perl :P";die

//; ist im Grunde ein NOP in Perl und ein Kommentar in C.

Das C-Programm ist also effektiv:

main(){puts(puts("This program errors out in C :P"));}

Welches druckt die erforderliche Zeichenfolge, dann versucht es auszuführen puts(32) . Dies ist ein technisch undefiniertes Verhalten in C, aber es verursacht einen Segmentierungsfehler in TIO und jedem System, auf das ich Zugriff habe.

Das Perl-Programm behandelt das gesamte C-Programm als Zeichenfolge, verwendet den regulären Ausdruck, /T.*n /um eine Übereinstimmung zu erzielen , This program errors out inund druckt dann dieses und perl :P.dieführt dazu, dass das Programm mit dem Fehler abstürztDied at script_name line 2 .

Wenn dir das nicht als Fehler gefällt, 1/0ist die Länge gleich und stürzt mit einem Illegal division by zeroFehler ab. Ich mag einfach diemehr;)

Probieren Sie es online! (C)

Probieren Sie es online! (Perl)


1

VBScript, JScript, 72 Bytes

x="VB"
'';x='J'
WScript.echo("This program errors out in "+x+"Script")
y

VBScript gibt "Microsoft VBScript-Laufzeitfehler: Typenkonflikt: 'y'" aus.
JScript gibt "Microsoft JScript-Laufzeitfehler: 'y' ist undefiniert" aus.


1

JavaScript & Python 3, 105 91 Bytes

Fehler von NameError: name 'console' is not definedin Python 3

a="This program errors out in %s :P"
1//2;print(a%"Python 3")
console.log(a,"JavaScript")()

Probieren Sie es online!

... und von TypeError: console.log(...) is not a functionin JavaScript.

a="This program errors out in %s :P"
1//2;print(a%"Python 3")
console.log(a,"JavaScript")()

Probieren Sie es online!


1

Java (JDK) / JavaScript (Node.js), 154 Byte

class P{P(){var s="This program errors out in ";try{System.out.printf("%sJava :P",s);}finally{if(1!='1'){var a=0/0;}throw new Error(s+"JavaScript :P");}}}

Probieren Sie es online! (Java)

Probieren Sie es online! (JavaScript)

Ausgabe in Java:

This program errors out in Java :P
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at P.(Main.java:1)

Ausgabe in JavaScript (nach stderr):

Error: This program errors out in JavaScript :P
    at P (/home/runner/.code.tio:1:185)

Dies nutzt die schwache Typisierung ( 1=='1') von JavaScript , um die Sprache zu erkennen, und dieselben Schlüsselwörter in Java und JavaScript ( var, class) sowie ähnliche Fehlerkonstruktoren ( new Error()), um den Polyglott zu erstellen.


1

PowerShell v6 und PowerShell v2, 73 Byte

"This errors out in PowerShell v$($PSVersionTable.PSVersion) :P"
1-shl1/0

Probieren Sie es online!

Dadurch wird ein Parsing-Fehler in Version 2 ausgelöst, da -shldieser in Version 3 eingeführt wurde. v3 + ist dann in der Lage, den Wert korrekt zu verschieben, bevor versucht wird, ihn durch 0 zu teilen, und löst dabei bequemerweise einen Division-durch-Null-Fehler aus. Beide Versionen haben die Hashmap $ PSVersionTable, die das PSVersionFeld enthält


0

C (gcc) unter Linux / C (gcc) unter Mac (160)

#include <sys/utsname.h>
main(){struct utsname n;float g;uname(&n);printf("This program errors out in C(gcc) on %s :P\n",n.sysname);g=1/(int)gamma(1);abort();}

Ungetestet für Mac; Im Grunde hat John Cook (in seinem Blog ) darauf hingewiesen, dass POSIX kein Gamma definiert. Linux verwendet das Protokoll der Gamma-Funktion (log (gamma (1)) gibt 0 zurück, was eine Gleitkomma-Ausnahme auslöst); OSX verwendet die "echte" Gammafunktion (offiziell als "tgamma per POSIX" bezeichnet). dies gibt 1 zurück, was dann die Abbruchanweisung trifft; Ich habe versucht, einen anderen Gleitkomma-Fehler auszulösen (z. B. sqrt (-1)), aber ich habe vergessen, wie man einen Fehler auslöst, anstatt einfach Null zurückzugeben.


0

Perl, Bash (78 Bytes)

printf "This program errors out in ";eval 'echo Bash :P'||print"Perl :P
";
a()

Ausgabe in Perl:

This program errors out in Perl :P
Undefined subroutine &main::a called at /tmp/perlbash line 3.

Ausgabe in Bash:

This program errors out in Bash :P
/tmp/perlbash: line 4: syntax error: unexpected end of file

(Beachten Sie, dass Bash den line 4Fehler tatsächlich anzeigt , obwohl Zeile 3 nicht mit einem Zeilenvorschub endet ...)



0

C (gcc) und Haskell , 135 Bytes

char/*x=0-- */*
s="This program errors out in ";
int main(){--s;*s=printf("%sC :P",s+1);}//-}=0;main=mapM print[s++"Haskell :P",tail""]

Probieren Sie es online (С)! Versuchen Sie es online (Haskell)!

Das Ergebnis wird durch Verweben der Kommentare erzielt, wobei die C-Version im Wesentlichen wie folgt lautet:

char * s = "This program errors out in ";
int main ()
{
   --s;
   *s = printf ("%sC :P", s + 1);
}

(Fehler wird durch Schreiben vor dem Beginn der Zeichenfolge erreicht).

Die Haskell-Version reduziert sich dagegen auf Folgendes:

char /* x = 0 -- a useless operator (/*) taking two arguments
s = "This program errors out in ";
int main () = 0 -- a useless function int taking two arguments
main = mapM print [s ++ "Haskell :P", tail ""]

(Das Scheitern wird dadurch erreicht, dass eine leere Liste ausgefüllt wird.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.