Einloggen
[c] [test] [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.


[Zurück]
[c] [test] [fefe]