Einloggen
[c] [meta] [fefe]

/c/ – Pufferüberlauf


Antwort erstellen

(≤ 4)



[Zurück]

  • [l] KOPFNUSZ Tue, 03 Sep 2019 10:47:23 GMT Nr. 14468
    PNG 185×118 448
    Meine Damen und Herren,

    da hier zweifelsohne technische bewandertes Publikum zugegen ist, wie wäre es mit einer Knobelaufgabe?

    Gegeben ist die Ausgabe von `seq 8` (bzw. `jot 8`). Mit welcher Funktion f(i, n) kommen Sie zu den Spalten 2 bis 4 im Bild?

    Die Antwort können Sie frei oder in einer Programmiersprache Ihrer Wahl formulieren. Der Gebrauch von Schleifen und Variablen ist nicht erlaubt. Eine Teillösung mit AWK ist unten verdeckt gegeben.

    Viel Erfolg!

    Hintergrund: Bildverwandt ist ein typisches Muster, wie es beim Planen von Experimenten entsteht. Man besitzt eine Reihe Prüfkörper (hier von eins bis acht) und alterniert systematisch Parameter, um im Nachgang den Einfluss auf das Ergebnis einzuschätzen.

    Teillösung: Folgendes gibt die Spalten 1 und 2 aus:
    `seq 8 | awk '{$2 = $1/4>1};print'`

  • [l] Felix Fri, 04 Oct 2019 12:08:48 GMT Nr. 15567
    >Der Gebrauch von Schleifen und Variablen ist nicht erlaubt.
    Schon beim AWK-Beispiel hat man eine implizite Eingabe-Schleife und -Variable. Wenn man diese erlaubt, ist das Beispiel für Perl auch recht einfach:
    seq 8 | perl -ne 'BEGIN{$,="\t";$\="\n";print "Index","Param1","Param2","Param3"}chomp;print $_,sprintf("%03b",($_-1)^1)=~/./sg'

    Das schöne ist, dass dieses Beispiel leicht generalisiert werden kann.
    x=4
    seq $((2**x)) | ORDER=$x perl -ne 'BEGIN{$,="\t";$\="\n";print "Index",map("Param$_", 1..$ENV{"ORDER"})}chomp;print $_,sprintf("%0".$ENV{"ORDER"}."b",($_-1)^1)=~/./sg'

    Natürlich verfehlt dies das Ziel, jede einzelne Spalte von Hand zu berechnen. Das geht dann nicht so einfach, da $_ sowohl für den Eingabewert als auch jedes Listenelement in map stünde und man eine lokale Variable zur Unterscheidung benötigt:
    map(($EINGABE&1<<$_)>>$_,reverse 0..$ENV{"ORDER"}-1)
  • [l] Felix Fri, 01 Nov 2019 01:42:37 GMT Nr. 17752 SÄGE
    seq 8 | gawk '{$1=$1-1;$2=and($1,4)!=0;$3=and($1,2)!=0;$4=and($1,1)==0;print}'
  • [l] Felix Wed, 13 Nov 2019 08:48:10 GMT Nr. 18467
    >>14468
    Wäre eine Zählung gemäß des (binär reflektierten) Gray-Codes [1] (in dem Fall also 000, 001, 011, 010, 110, 111, 101, 100) für das Experimentieren nicht angebrachter, weil man zwischen zwei aufeinander folgenden Zuständen immer nur genau einen Parameter ändert?

    [1] https://de.wikipedia.org/wiki/Gray-Code
  • [l] Felix Tue, 19 Nov 2019 12:09:19 GMT Nr. 18735
    >>15567
    Das leidige Problem mit diesen Aufgaben: Die Aufgabenstellung ist komplett unklar.
  • [l] Felix Mon, 30 Aug 2021 22:35:30 GMT Nr. 57803
    Ist das hier nicht ein C-Brett? Ich hab da mal etwas zusammengeschustert.

    #!/bin/sh
    gcc -ggdb -O0 -Wall -Wextra -Werror -pedantic -std=c89 -xc - << ENDE
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
    	int i, j, n;
    	#define PGR 255
    	char puf[PGR];
    	
    	if (argc < 2 || !(n = atoi(argv[1])) || n < 1) {
    		fprintf(stderr, "Erwarte Eingabe: '%s n(>0)'\n", argv[0]);
    		return -1;
    	}
    	while (fgets(puf, PGR, stdin)) {
    		if (!(i = atoi(puf))) {
    			fputs("Ich denke nicht.\n", stderr);
    			continue;
    		}
    		printf("%d\t", i);
    		j = n;
    		while (j--)
    			printf("%d\t", (i-1)>>j&1);
    		puts("");
    	}
    	if (ferror(stdin))
    		perror(argv[1]);
    	return 0;
    }
    ENDE
    if test $? -eq 0
    then
    	printf "Index\tParam1\tParam2\tParam3\tParam4\n"
    	seq 16 | a.out 4
    	echo n | a.out 1
    	a.out
    fi
    # vim: ft=c
    


    Wie könnte man ferror(stdin) auslösen? Ich habe es gerade mit /dev/{null,full,zero} und mit nichtexistenten Dateisystemelfen versucht, aber irgendwie fehlt mir da die Phantasie.
  • [l] Felix Tue, 31 Aug 2021 00:09:46 GMT Nr. 57806
    JPG 977×1488 156.0k
    >>57803
    Das hier scheint zu funktionieren:

    >./a.out 1 0>&-
    <1: Bad file descriptor

    Und Erklärung: 0>&- schließt Dateideskriptor 0 (stdin). Habe ich auch gerade erst gelernt. Funktioniert natürlich auch mit stdout (1>&-) und stderr (2>&-).
  • [l] Felix Wed, 01 Sep 2021 10:26:16 GMT Nr. 57912
    JPG 528×560 169.8k
    Seit wann werden denn hier irgendwelchen Hauptschülern die Hausaufgaben gemacht? Seid ihr denn alle behindert?
  • [l] Felix Mon, 06 Sep 2021 11:12:58 GMT Nr. 58205 SÄGE
    >>57806
    >0>&-
    Felix hat die Umleitung immer ohne das & geschrieben. Funktioniert auch. Vermutlich weil - eben keine Variable oder Deskriptor ist.
  • [l] Felix Wed, 13 Oct 2021 21:28:53 GMT Nr. 61499
    JPG 1250×833 109.5k
    >>57806
    Das tangiert ein Reich, dessen ich nie versuchte habhaft zu werden. Wes bedarf der Mensch, denn "Führe den Befehl aus und logge mir all jene Meldungen (>befehl.log)" oder "logge auch alle Fehlermeldungen (2>&1)"? Derlei Verquickungenen jener Dateideskriptorensalate war ich mir nie bewusst, vermutlich ist's auch kein anderer Nutzer der Bash :)

    Mit anderen Worten: Kann man 0>&- zu einem Eingabefehler zählen, den mein Programm abfangen können muss?

    Oh ja, Titten für Aufmerksamkeit und weil's auf diesem /c/ erlaubt ist. Heil, /c/!
  • [l] Felix Thu, 14 Oct 2021 00:53:06 GMT Nr. 61506
    >>61499
    >аня_царева.jpg
    Hast du noch mehr?
  • [l] Felix Thu, 14 Oct 2021 01:42:24 GMT Nr. 61507
    >>58205
    Das wird aber spätestens dann schiefgehen, wenn du mal Stdout oder Stderr schließen willst. Denn 1>- leitet einfach nur Stdout in die Datei - um.

    >>61499
    >Mit anderen Worten: Kann man 0>&- zu einem Eingabefehler zählen, den mein Programm abfangen können muss?
    Diese Stromumleitungen sind im Grunde syntaktischer Zucker um Fork, und mit Fork sind noch ganz andere Dinge möglich. Daher denke ich nicht, dass man das abfangen muss. Wer sich in den Fuß schießen möchte, wird dazu immer Mittel und Wege finden.
  • [l] Zwischenrufer Felix Sat, 16 Oct 2021 07:08:02 GMT Nr. 61653
    exec 2> >(logger) oder systemd-cat
    am Anfang eurer Skrtipe logt alle eventuellen stderr Meldungen in diesem Beispiel nach /var/log/messages (lässt sich naütrlich spezialisieren).
  • [l] Felix Sat, 16 Oct 2021 10:08:17 GMT Nr. 61658
    >>61653
    Warum sollte man so etwas auch nur im Entferntesten tun wollen?! Meine Logfiles sind auch so schon voll genug, es reicht schon, dass tvheadend und co. ständig irgendwelche Kanalwechsel und OSCAM-Infos ins Log spammen...
  • [l] Felix Mon, 18 Oct 2021 14:22:23 GMT Nr. 61791
    >>61658
    Hängt davon ab, wie wichtig und was für Fehler das Skript wirft.
    Dass deine log files zugemüllt sind, dafür kann das arme Skript doch nichts.
    Außerdem, lerne inzu log facilities in verschiedene Dateien.
  • [l] Auch noch eine Gabelfrage Felix Wed, 08 Dec 2021 01:31:21 GMT Nr. 65830
    PNG 765×444 95.8k
    Gabelwissen ist manchmal ganz nützlich:

    gio mount -o | awk '/Mount added:/{if ($3~"MeiFeschdbladde") exit}'


    Damit sollte das Rückauf-Skript solange warten, bis die Festplatte fertig eingehängt ist. Wäre eine schöne Lösung ohne udev und Wurzelrechte, aber die Röhre interessiert es natürlich, ob der Prozess am lesenden Ende schon abgenippelt ist. So muss ich dann den Schreibeprozess explizit killen. Ist in gawk sicher auch eingebaut, aber heute schaue ich mir kein GNU Texinfo mehr an.

    Wollte eigentlich als restic-Herrenrasse bekennen, bis ich heute gesehen habe, wie es beim Bauen fast schon npm-artig Abhängigkeiten von Gurgel-Servierern saugt. Liegt sicher an den vielen (nicht genutzten) Wolken-Hinterenden, aber fühlt jetzt nur noch halb-herrenrassig.


[Zurück]
[c] [meta] [fefe]