Hur kompilera C i Linux

anth

Vetefan
Joined
24 Feb 2003
Messages
10,271
Location
Fjollträsk
Lite missvisande titel.
Jag är ingen riktig programmerare (men försöker lära mig).
Just nu ligger mina C-kunskaper på nivån att jag precis klarar av att skriva Hello World i vim och kompilera med gcc.

Jag hittade ett kul projeket som verkar förhållandevis enkelt, men jag vet inte var jag ska börja.

Jag hittade den här videon:

Det är ett windowsprogram, skrivet i C, som ritar en tesserakt i ASCII.
En tesserakt är en 4-dimensionell kub som ser väldigt funky ut när man man projekterar den på en 2-dimensionell yta, som en datorskärm.

Koden finns på den här githubsidan

Men jag vill kunna köra programmet i kommandoprompten på Linux.

Jag hittade Reddittråden där Mashpoe skriver om sitt Tesseraktprogram för Windows

ASCII Tesseract Rotation Written in C

Där svarar domlikesjazz att hen portat koden till Linux cli (4:e svaret i Reddittråden).
Problemet är att jag inte hittar Linux-koden.
(eller mer korrekt, kan så lite C att jag inte kan skilja mellan C för Windows och C för Linux)

Kan någon hjälpa mig?
Vilken kod ska jag ladda ner och kompilera för att kunna köra i en linuxterminal?
 

Lupus Maximus

Tekniker
Joined
13 Jan 2012
Messages
2,746
Location
Stockholm
Det är en konsol applikation för window. Men istället för att köra i befintliga konsolen så startar den en ny konsol, och därav windows-raderna.

Eftersom det är ascii som den matar ut, så borde det inte vara omöjligt att konvertera, speciellt om man nöjer sig med att bara mata ut i den konsol man startar programmet i. Jag kan dock inte C heller (mina kunskaper är i det närbesläktade C++).

Det som verkar vara Windows-specifikt är detta:

För att hämta in Windows funktioner
Code:
#include <windows.h>
För att sätta upp konsol-fönstret med rätt dimensioner:
Code:
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

// set console dimensions
COORD s = { ww, wh };
SMALL_RECT r = { 0, 0, ww, wh };
COORD z = { 0, 0 };
SetConsoleScreenBufferSize(h, s);
SetConsoleWindowInfo(h, TRUE, &r);
För att mata ut den buffer man har skapat till konsolen:
Code:
WriteConsoleOutput(h, d, s, z, &r);
Om jag tolkat det rätt, så är bufferten bara en "tvådimensionell" array med samma mått som konsolen skapades med. Så, min gissning, utan att ha lusläst koden, är att om man byter ut allt ovanstående till en loop, som skriver ut rad för rad ur bufferten till konsolen man startade i (dvs den typ av utmatning Hello World antagligen använde) så borde det fungera.

Dock, eftersom man inte har skapat ett konsolfönster av rätt storlek, så behöver man själv se till att konsolen är stor nog innan man startar programmet.
 

Zire

Swashbuckler
Joined
18 May 2000
Messages
3,128
Location
Umeå
Det fanns en länk på sidan som du länkade till där någon har gjort en portning till Linux: https://github.com/dominicmkennedy/hypercube
Jag tror att det är bättre att börja med den istället.

Men jag skulle säga att programmet löser minst tre separata problem: I/O till console (och dessutom löpande uppdatering av den, vilket inte är standardbeteende), 3D projicering och 4D projicering. Ett enklare problem att börja med hade varit att bara försökt hantera ett av dem, och kanske standard console I/O.
 

zo0ok

Rollspelsamatör
Joined
13 Sep 2020
Messages
2,753
Roligt att du börjar med C! Helt rätt!

C är egentligen ganska enkelt. Men när det blir Windows-ifierat blir det lite av en bastard.
Att kompilera Windows-program sådär i Linux är nog ganska pyssligt (du kommer nog lägga en del tid på detaljer som inte rikigt har med att lära sig grunderna i programmering att göra).

Om du har en Windows-dator kan du ladda ner Visual Studio Community gratis - om du vill kompilera Windows-program.

Annars rekommenderar jag boken "Learn C the hard way".

En sida som är bra för att öva sig på programmering är "hackerrank.com". Du kan göra allt i webläsaren. Det finns utmaningar, från lätta till jättesvåra, med instruktioner och automatiserade tester. Outputten är inte så fräck, men det är ganska tillfredställande att lägga fler och flera lösta problem till högen av avklarade.
 

lupmet

Swordsman
Joined
19 Feb 2014
Messages
733
Location
Göborg
C är egentligen ganska enkelt.
Det är inte om annat enkelt att debugga; om datorn hänger sig och skärmen blir svart har du pekarfel.

Utan att ha tittat på koden skulle jag föreslå att @anth läser koden och försöker sitta sig in i den. Den består troligen av ett antal block: initiering och uppsättning, beräkning av modellen, en datastruktur med ASCII-bilden, utskrift av densamma. Såvida det inte är en synnerligen klantig programmerare borde de två mittersta vara samma oavsett plattform. Enklast kan vara att rensa bort initieringen och utskrift och skriva om dem själv, om å andra sidan om datastrukturen är en char[][] (tvådimensionell vektor/array av tecken) borde utskriften inte vara mycket mer än en eller två for-loopar med printf(), dvs. plattformsoberoende.
 

Kalil

Swordsman
Joined
13 Oct 2000
Messages
448
Location
Malmö
1) Forka projektet
2) Skriv om main() till Linux bibliotek. Allt annat är platformsoberoende så vitt jag kan se
3) Kompilera med gcc
4) Profit

Som parentes så finns det inget "C för Windows". C är C. Men det finns C bibliotek som är Windows specifika. Som tex windows.h :)
 

Stareater

Får vissa att fatta vad rollspel kan vara.
Joined
6 Apr 2017
Messages
867
Location
Umeå
1) Forka projektet
Vet inte varför men det fick mig att tänka på URs gamla UNIX-kurs.

Skämt åsido så finns det tyvärr inga genvägar till att porta ett program till linux utan det är rätt jobbigt. Mitt tips är att sätta windowsspecifika kodrader i en if-sats och ersätta dem med motsvarande linux-logik inom Då kan programmet köras på båda plattformarna och man portar rad för rad vilket är enklare.


#ifdef __linux__
//linux code goes here
#elif defined(_WIN32) || defined (_WIN64)
// windows code goes here
#else
...
#endif
 
Top