förmodligen en simpel C fråga

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: förmodligen en simpel C fråga

Inlägg av TomasL »

För de som är intresserad av att skriva kryptisk oläsbar kod, finns det ju en tävling i detta, ju mer oläsbart och kryptiskt/obegripligt, desto större chans att vinna
davidi
Inlägg: 571
Blev medlem: 13 oktober 2011, 16:45:38
Ort: Ekerö

Re: förmodligen en simpel C fråga

Inlägg av davidi »

ioccc?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: förmodligen en simpel C fråga

Inlägg av TomasL »

Användarvisningsbild
pi314
Inlägg: 5680
Blev medlem: 23 oktober 2021, 19:22:37
Ort: Stockholm

Re: förmodligen en simpel C fråga

Inlägg av pi314 »

Vackra program
Att medvetet skapa oläsbar kod är ett verksamhetsområde.
Code Obfuscation: A Comprehensive Guide Against Reverse-Engineering Attempts
https://www.appsealing.com/code-obfuscation/

Jag kan förstå att det kan finnas ett behov, men jag är skeptisk till företeelsen.

Jag tycker att all kod ska vara vacker. Med det menar jag estetiskt tilltalande, rolig att läsa, lättläst, lätt att förstå och lätt att ändra i, om det behövs.
Olika språk gör det olika svårt att skapa vacker kod. Eller kanske man borde säga att vissa språk gör det enkelt att skapa ful kod?

I t.ex. assembler och Fortran är det kanska enkelt att skriva svårläst kod.
Pascal och Java, som exempel, uppmuntrar mer till att skriva vacker kod, IMO.

C är lite mitt emellan. Man kan skriva vacker kod, men man kan också skriva riktigt ful och svårbegriplig kod i C. Språkets kraftfullhet ursäktar mycket av dess bister. Det har ju fungerat till att skapa och vidareutveckla Unix i!

För att inte komma för långt från trådämnet gjorde jag snabbt ett litet exempel med några olika sätt att skicka och returnera variabler till/från funktioner i C. Det är inte vackert, men det är kanske begripligt ändå?

Makefile:

Kod: Markera allt

reference : main.o swapref.o swapval.o
		cc -o ref main.o swapref.o swapval.o

main.o : main.c
	cc -c main.c
swapref.o : swapref.c
	cc -c swapref.c
swapval.o : swapval.c
	cc -c swapval.c
clean :
	rm ref main.o swapref.o swapval.o
Dom tre kodsnuttarna finns som bilagor. Makefile var inte tillåtet att bifoga som bilaga.

/Pi
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18289
Blev medlem: 16 augusti 2009, 19:04:48

Re: förmodligen en simpel C fråga

Inlägg av 4kTRB »

Den här boken fick bra omdöme i The C Users Journal Mars 1994
Boken handlar om att skriva klar och tydlig kod.

De som kodar

*destination++ = *source++

kanske inte köper boken enligt den som författat artikeln.


https://www.amazon.co.uk/gp/product/155 ... tu00_p2_i0
Bild
MiaM
Inlägg: 9912
Blev medlem: 6 maj 2009, 22:19:19

Re: förmodligen en simpel C fråga

Inlägg av MiaM »

Boken du läser är faktiskt rätt bra som lärobok. Poängen är väl ungefär att det är bra att lära sig göra på de sätt boken beskriver, även om ingen människa efteråt skulle implementera en strängkopierare när det ingår i standardbiblioteken.

Angående tidigare erfarenhet av assembler, så om nån vill förstå objektoriengeringen i C++ och åtminstone förstår hur en processor använder en stack så rekommenderar jag en bok som jag tror heter Borland C++ 4.0 Object-oriented Programming om jag inte blandat ihop böckerna. Stackdumpar som visar vad som allokeras dynamiskt vs statiskt när olika grejer körs, och också vad som allokeras dynamiskt. Överlägset lättare att förstå än alla överteoretiska förklaringar som nästan alla andra böcker försökt sig på.

Gnäll 1:
Angående "tydlig" kod så skulle jag vilja säga att modern kod i C och C++ ofta formellt sett är extremt tydlig i form av att det är väldigt lätt att läsa den, och det skulle vara extremt lätt att skriva idiotkommentarer av typen captain obvious. Men samtidigt så är allt så glättigt utspritt och väldigt mycket består bara av klisterlager att det istället blir väldigt svårt att få något övergrepp om vad koden gör. Det är väl helt okej om program ser ut på det sättet, men då måste man också ha ett faktiskt uppdaterat/aktuellt dokument som förklarar hur allt hänger ihop. Om man skriver kod som kan använda nån slags smart autogenerering för dokumentation och publicerar sin kod online så måste man också faktiskt köra den där autogenereringen för att den som bara är nyfiken på eller rent av är sugen på att peta på en liten del av koden ska kunna läsa dokumentationen utan att installera och konfigurera nån slags dokumentationsautogenerator.

Gnäll 2:
Visst har kompilatorerna blivit bättre, men de var faktiskt rätt bra även på 90-talet och det är väl snarast så att dagens datorer är mer förlåtande för ineffektiv kod och framförallt så har folk i allmänhet ingen uppfattning om hur ineffektiv massor av mjukvara är. Folk glömmer att det körs många gånger mer kod för att visa en enda bokstav på en webbsida än all kod som kördes för hela månlandningen. Eller mer relevant för att få ut en enda bokstav på en webbsida så körs det mer kod än vad som behövdes för att köra ett helt grafiskt multitaskande operativsystem för 25 år sen. Samtidigt så är alla "webbprogrammerare" helt övertygade om att javascript+CSS är överlägset bättre än att göra webbsidor på nittiotalsvis med tabeller istället för css. Visst, det finns lite större garantier för att designen visas likadant på olika webbläsare, men det är ändå ett praktexempel på där utseende får prioritet över funktion.
Användarvisningsbild
4kTRB
Inlägg: 18289
Blev medlem: 16 augusti 2009, 19:04:48

Re: förmodligen en simpel C fråga

Inlägg av 4kTRB »

Arrayer med strängar som du håller på med
går att programmera på lite olika sätt.
Det här kanske hjälper till att förstå något om hur strängar fungerar,
fast jag vet inte om det kanske blir rörigt innan du läst mer i boken?

Du kan sätta opp en 2D-array så här

char ord[] [5] = {
"A",
"AB",
"ABC",
"ABCD"
};

5 är vaje rads längd, 4 rader.
5 därför att "ABCD" är längsta raden/strängen plus att varje sträng
avslutas med null-tecken.

Arrayen består av 4x5 = 20 char

printf(ord[2]) ger nu ABC som utskrift

Du kan också sätta upp en pekar-array

char
*ord[] = {
"A",
"AB",
"ABC",
"ABCD"
};

Här är skillnaden att minne allokeras för varje ord plus nulltecknet för varje ord.
Det totala antalet blir 2 + 3 + 4 + 5 = 14 char
Sedan också 4 pekare till char som tar upp ett antal bytes i minnet.

Varje ord går nu skriva ut på samma sätt som med 2D-arrayen

printf(ord[2]) ger också ABC som utskrift


En skillnad med 2D-varianten är att den arrayen går att redigera i.
Pekar-varianten kan finnas i ROM-minne och försöker man då ändra med en rad typ..

ord[2][0] = 'B' så fås ett runtime-fel.

Varje rad i pekarvarianten har inget namn, det är adresser.

Vill man säkert kunna ändra i en pekar-variant av en array så ska man
namnge varje rad....

char ord0[] = "A";
char ord1[] = "AB";
char ord2[] = "ABC";
char ord3[] = "ABCD";
char *ord[] = {ord0,ord1,ord2,ord3};

Nu går det alltid bra att använda
ord[2][0] = 'B'

"ABC" ovan är en förenkling av {'A','B','C','\0'} alltså en rad tecken/char med index från 0 till 3
Användarvisningsbild
4kTRB
Inlägg: 18289
Blev medlem: 16 augusti 2009, 19:04:48

Re: förmodligen en simpel C fråga

Inlägg av 4kTRB »

Allt i ovanstående exempel fungerar inte riktigt med den kompilator jag använder
så jag satte ihop några snarlika exempel. Studera koden och utskriften så
syns lite av det som går utföra med pekar-arrayer.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>

int main(void) {

	char *b = "COMPUTER";
	char *characters[2][3] = {{'V','T','O'},{'X','Y','Z'}};

	char ord0[] = "A";
	char ord1[] = "AB";
	char ord2[] = "ABC";
	char ord3[] = "ABCD";
	char *ord[] = {ord0,ord1,ord2,ord3};

	putchar(b[7]);
	printf("\n");
	printf(b);
	printf("\n");
	printf(b+1);
	printf("\n");
	printf(b+7);
	printf("\n");

	putchar(characters[0][2]);
	putchar(characters[0][1]);
	putchar(characters[0][0]);
	printf("\n");
	putchar(characters[1][2]);
	putchar(characters[1][1]);
	putchar(characters[1][0]);
	printf("\n");
	printf("\n");

	putchar(ord[2][2]);
	printf("\n");
	printf("\n");

	printf(ord[0]);
	printf("\n");
	printf(ord[1]);
	printf("\n");
	printf(ord[2]);
	printf("\n");

	putchar(ord[3][2]);
	printf("\n");
	printf(ord[3]);
	printf("\n");
	printf("\n");

	ord[3][0] = 'W';				/* Exempelvis motsvarande med b[7]= 'W' fungerar ej */
	printf(ord[3]);
	printf("\n");
	printf(ord[3]+1);
	printf("\n");
	printf(ord[3]+2);
	printf("\n");
	printf(ord[3]+3);

	return 0;
}
Utskrift....

R
COMPUTER
OMPUTER
R

OTV
ZYX

C

A
AB
ABC

C
ABCD

WBCD
BCD
CD
D
Skriv svar