Törmäsin verkossa ärsyttävään opastukseen. ( https://s7.gifyu.com/images/strchr2.png ). Tuossahan opastetaan, selvittämään, onko joku merkki merkkijonossa. Katso kuvaa ja yritä tajuta kuinka tuota soveltaisit omassa ohjelmassasi.
Tein samasta asiasta itse esimerkin, jossa ei ole mukana mitään mikä ei 100% liity asiaan ( https://s7.gifyu.com/images/strchr1.png ). Ja tästä saattaa jo aloittelijakin keksiä kuinka asia pitää hoitaa. Lisätään tähän vielä että tuo verkosta löytynyt ohje on vielä englannin kielinen, joka jo yksinään saattaa estää asian ymmärtämisen.
Niin, onko C helppo oppia?
Onko C ohjelmointikieli helppo oppia
69
2048
Vastaukset
- Anonyymi
Lisäksi on näitä täysin virheellisiä ohjeita kuten tämä strcat() ohje, joka opastaa kuinka kaksi merkkijonoa yhdistetään toisiinsa.
Montako virhettä löydät ohjeesta?- Anonyymi
Hemmetti linkki jäi pois:
https://fresh2refresh.com/c-programming/c-strings/c-strcat-function/ - Anonyymi
Kas kun netissä kuka tahansa voi kirjoittaa verkkosivulleen ihan mitä tahansa soopaa. Tämä kannattaa pitää aina mielessä varsinkin, jos perustaa ostopäätöstään nettiarvosteluihin. Jokainen eläköityvä putkimies ja koulupudokas muuttuu nettiin päästessään lääketieteen ja tietotekniikan eritysasiantuntijaksi.
- Anonyymi
Anonyymi kirjoitti:
Kas kun netissä kuka tahansa voi kirjoittaa verkkosivulleen ihan mitä tahansa soopaa. Tämä kannattaa pitää aina mielessä varsinkin, jos perustaa ostopäätöstään nettiarvosteluihin. Jokainen eläköityvä putkimies ja koulupudokas muuttuu nettiin päästessään lääketieteen ja tietotekniikan eritysasiantuntijaksi.
Niinpä, jotta ei vain sanottaisi jonkin olevan väärin täytyy myös esittää kuinka se tulisi hoitaa. Tässä alla tuon esimerkin virheet korjattuna, ja muotoiltuna niin että asia on helppo ymmärtää:
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[11] = "Hei";
char str2[8] = " Seppo!";
strcat(str1, str2);
printf("%s", str1);
return 0;
}
En viitsinyt kuvana laittaa, vaikka tiedän ettei nuo tabuloinnit säily.
int main(void)
kertoo että ohjelma palauttaa int tyyppisen paluuarvon, ja (void) kertoo että se ei ota vastaan parametreja.
str1 ja str2 muuttujat vaativat tilanvarauksen, annoin minimi arvot. Joten opastus sisälsi kolme pahaa virhettä.
Kommentointisi sävystä päätellen on aika lopettaa c:stä puhuminen vähäksi aikaa, tehdään niin.
Ter. Sekatyömies - Anonyymi
Anonyymi kirjoitti:
Niinpä, jotta ei vain sanottaisi jonkin olevan väärin täytyy myös esittää kuinka se tulisi hoitaa. Tässä alla tuon esimerkin virheet korjattuna, ja muotoiltuna niin että asia on helppo ymmärtää:
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[11] = "Hei";
char str2[8] = " Seppo!";
strcat(str1, str2);
printf("%s", str1);
return 0;
}
En viitsinyt kuvana laittaa, vaikka tiedän ettei nuo tabuloinnit säily.
int main(void)
kertoo että ohjelma palauttaa int tyyppisen paluuarvon, ja (void) kertoo että se ei ota vastaan parametreja.
str1 ja str2 muuttujat vaativat tilanvarauksen, annoin minimi arvot. Joten opastus sisälsi kolme pahaa virhettä.
Kommentointisi sävystä päätellen on aika lopettaa c:stä puhuminen vähäksi aikaa, tehdään niin.
Ter. SekatyömiesTuhlaat pinomuistia. Varaa merkkijonoille muisti dynaamisesti vaikka malloc()-funktiolla. Joudut käyttämään stdlib-kirjastoa.
https://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm - Anonyymi
Anonyymi kirjoitti:
Tuhlaat pinomuistia. Varaa merkkijonoille muisti dynaamisesti vaikka malloc()-funktiolla. Joudut käyttämään stdlib-kirjastoa.
https://www.tutorialspoint.com/c_standard_library/c_function_malloc.htmNiinpä taas palattaisiin siihen mikä on helppo ja mikä ei, esimerkki oli nimen omaan typistetty helposti ymmärrettäväksi.
Dynaaminen muistinvaraus ( malloc(); ) ja sen vapauttaminen ( free(); ) on vaihtoehto isompien arrays[] muutujien kanssa kun tarvittavan muistin määrää ei tiedetä etukäteen ohjelmaa kirjoitettaessa. Esimerkki sellaisessa tilanteesta kun ohjelmoija ei voi tietää etukäteen, minkä kokoisia tiedostoja käyttäjä haluaa avata ohjelmalla, näin voi olla vaikka kuvankäsittelyohjelman kanssa.
Mutta tässä yksi tapa rajata ylimääräinen muistinkäyttö, vaikka en kyllä suosittele tähän esimerkinkään tapaukseen, aivan turhaa elvistelyä pienikokoisissa muuttujissa:
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[sizeof("Hei")] = "Hei";
char str2[sizeof(str1) sizeof(" Seppo!")] = " Seppo!";
int m = sizeof(str1) sizeof(str2);
strcat(str1, str2);
printf("%s koko: %d", str1, m);
return 0;
} - Anonyymi
Anonyymi kirjoitti:
Niinpä taas palattaisiin siihen mikä on helppo ja mikä ei, esimerkki oli nimen omaan typistetty helposti ymmärrettäväksi.
Dynaaminen muistinvaraus ( malloc(); ) ja sen vapauttaminen ( free(); ) on vaihtoehto isompien arrays[] muutujien kanssa kun tarvittavan muistin määrää ei tiedetä etukäteen ohjelmaa kirjoitettaessa. Esimerkki sellaisessa tilanteesta kun ohjelmoija ei voi tietää etukäteen, minkä kokoisia tiedostoja käyttäjä haluaa avata ohjelmalla, näin voi olla vaikka kuvankäsittelyohjelman kanssa.
Mutta tässä yksi tapa rajata ylimääräinen muistinkäyttö, vaikka en kyllä suosittele tähän esimerkinkään tapaukseen, aivan turhaa elvistelyä pienikokoisissa muuttujissa:
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[sizeof("Hei")] = "Hei";
char str2[sizeof(str1) sizeof(" Seppo!")] = " Seppo!";
int m = sizeof(str1) sizeof(str2);
strcat(str1, str2);
printf("%s koko: %d", str1, m);
return 0;
}Ei tuo muuta asiaa mihinkään. Pinomuistia kuluu tasan yhtä rajusti.
Opetelkaa kakarat ensin assembly, ja siirtykää vasta sitten jonninjoutaviin kieliin. - Anonyymi
Anonyymi kirjoitti:
Ei tuo muuta asiaa mihinkään. Pinomuistia kuluu tasan yhtä rajusti.
Opetelkaa kakarat ensin assembly, ja siirtykää vasta sitten jonninjoutaviin kieliin.Niin kuluu, mutta se voidaan vapauttaa, ja varata uudestaan uudessa koossa. Ja lopeta tuo "kakarointi". Minäkin aloitin debug ohjelmalla kirjoittamalla suoraan konekielistä koodia, joka oli todella hankalaa jo 20 rivisenä pätkänä. Tein myös pahimman mokani kirjoittamalla suoraan MBR sektoriin. Siihen aikaan ei ollut monikaan kone verkossa, ja tiedon saanti oli kirjaston varassa, menikin pitkä aika ennen kuin asia oli korjattu.
- Anonyymi
Anonyymi kirjoitti:
Niin kuluu, mutta se voidaan vapauttaa, ja varata uudestaan uudessa koossa. Ja lopeta tuo "kakarointi". Minäkin aloitin debug ohjelmalla kirjoittamalla suoraan konekielistä koodia, joka oli todella hankalaa jo 20 rivisenä pätkänä. Tein myös pahimman mokani kirjoittamalla suoraan MBR sektoriin. Siihen aikaan ei ollut monikaan kone verkossa, ja tiedon saanti oli kirjaston varassa, menikin pitkä aika ennen kuin asia oli korjattu.
Sizeof-operaattorin varaamaa pinomuistia ei vapauteta mitenkään. Käännösvaiheessa tehdään muistinvaraus, joka kestää maailman tappiin. Tulee stack overflow riski.
Opetelkaa ensin koodauksen alkeet. Jokainen on toki amatööri alkuvaiheessa, itsekin 1970-luvulla. Yrittäkää kehittyä, ja älkää missään nimessä opetelko koodaamaan päin persettä, kuten pinomuistia tuhlaten.
Aloittakaa aasta, eli assemblystä. - Anonyymi
Anonyymi kirjoitti:
Sizeof-operaattorin varaamaa pinomuistia ei vapauteta mitenkään. Käännösvaiheessa tehdään muistinvaraus, joka kestää maailman tappiin. Tulee stack overflow riski.
Opetelkaa ensin koodauksen alkeet. Jokainen on toki amatööri alkuvaiheessa, itsekin 1970-luvulla. Yrittäkää kehittyä, ja älkää missään nimessä opetelko koodaamaan päin persettä, kuten pinomuistia tuhlaten.
Aloittakaa aasta, eli assemblystä.Sizeof ei varaa mitään, sillä selvitetään kohteen tarvitsema tila.
- Anonyymi
Anonyymi kirjoitti:
Ei tuo muuta asiaa mihinkään. Pinomuistia kuluu tasan yhtä rajusti.
Opetelkaa kakarat ensin assembly, ja siirtykää vasta sitten jonninjoutaviin kieliin.Jos viittaan C-kieleen sanalla jonninjoutava niin se kyllä paljastaa että et taida juurikaan ymmärtää ohjelmoinnista tuon taivaallista.
Nykyiset C-kääntäjät tekevät optimoinnit tapissa niin hyvää binääriä ettei assemblerilla tehty juuri tuo mitään etuja. C-kielellä on kuitenkin mahdollista kirjoittaa paljon laajempia ohjelmia tai kirjastoja kun ohjelman suunnittelu on paljon helpompaa tuollaisella jo lähes ihmismäisellä kielellä. - Anonyymi
Anonyymi kirjoitti:
Jos viittaan C-kieleen sanalla jonninjoutava niin se kyllä paljastaa että et taida juurikaan ymmärtää ohjelmoinnista tuon taivaallista.
Nykyiset C-kääntäjät tekevät optimoinnit tapissa niin hyvää binääriä ettei assemblerilla tehty juuri tuo mitään etuja. C-kielellä on kuitenkin mahdollista kirjoittaa paljon laajempia ohjelmia tai kirjastoja kun ohjelman suunnittelu on paljon helpompaa tuollaisella jo lähes ihmismäisellä kielellä.Eipä vaan mahtunut C-kielinen ohjelmakoodi mikrokontrollerin muistiin. Oli pakko kirjoittaa softa uusiksi assemblyllä.
Sinulle suosittelen Scratchia. https://en.scratch-wiki.info/wiki/Scratch_3.0 - Anonyymi
Anonyymi kirjoitti:
Eipä vaan mahtunut C-kielinen ohjelmakoodi mikrokontrollerin muistiin. Oli pakko kirjoittaa softa uusiksi assemblyllä.
Sinulle suosittelen Scratchia. https://en.scratch-wiki.info/wiki/Scratch_3.0Sinulle suosittelen helmitaulua. Kysy jos isi ostaisi semmoisen.
Tuo on elitismiä ja turhaa elvistelyä kun otsikko puhuu siitä, onko c-kieli helppo oppia. Nykyisin on hyvin erikoisesta sovelluksesta kyse jos harrastelijakäytössä on niin surkea mikrokontrolleri käytössä ettei sinne mahdu C:llä koodaamaan. At-tiny maksaa alle euron kappale, sen saa suoraan USB-portiin ja koodata voi C:llä. Eli kyllä vähän haetaan jo erikoisuutta jos on "pakko" käyttää assyä.
Eri juttu kokonaan on sitten ammattikäyttö. Eli silloin kun etitään halvinta mahdolista komponenttia jotta suurissa tuotantomäärissä saadaan sääntöä. Sillä keskustelulla ei ole mitään tekemistä taas c-kielen opiskelun kanssa.
Eli mene vaan itseesi. - Anonyymi
Anonyymi kirjoitti:
Niinpä, jotta ei vain sanottaisi jonkin olevan väärin täytyy myös esittää kuinka se tulisi hoitaa. Tässä alla tuon esimerkin virheet korjattuna, ja muotoiltuna niin että asia on helppo ymmärtää:
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[11] = "Hei";
char str2[8] = " Seppo!";
strcat(str1, str2);
printf("%s", str1);
return 0;
}
En viitsinyt kuvana laittaa, vaikka tiedän ettei nuo tabuloinnit säily.
int main(void)
kertoo että ohjelma palauttaa int tyyppisen paluuarvon, ja (void) kertoo että se ei ota vastaan parametreja.
str1 ja str2 muuttujat vaativat tilanvarauksen, annoin minimi arvot. Joten opastus sisälsi kolme pahaa virhettä.
Kommentointisi sävystä päätellen on aika lopettaa c:stä puhuminen vähäksi aikaa, tehdään niin.
Ter. SekatyömiesOn tuo kyllä niin anaalista käyttä funktioita merkkijonojen peruskäsittelyyn, vieläkö noita joutuu C:ssä käyttämään? Tässä D-kielen vastine. Tykkään D:stä siksi, koska se on melkein kuin C, mutta vähän modernisoiduin ominaisuuksin.
module testi;
import std.string;
import std.stdio;
int main(void) {
string str1 = "Hei";
string str2 = " Seppo!";
str1~= str2;
writeln(str2);
return 0;
} - Anonyymi
Anonyymi kirjoitti:
On tuo kyllä niin anaalista käyttä funktioita merkkijonojen peruskäsittelyyn, vieläkö noita joutuu C:ssä käyttämään? Tässä D-kielen vastine. Tykkään D:stä siksi, koska se on melkein kuin C, mutta vähän modernisoiduin ominaisuuksin.
module testi;
import std.string;
import std.stdio;
int main(void) {
string str1 = "Hei";
string str2 = " Seppo!";
str1~= str2;
writeln(str2);
return 0;
}Mikä on D -kielen vahvuus, eli millä se on paikkansa lunastanut?
- Anonyymi
Pythonilla kaikki onnistuu suoraan paljon paremmin ja nopeammin ilman mitään oppimisvaikeutta. Ja jos ohjelman ajaa Pypyllä, se on aina nopeampi kuin C:llä koodattu risukasa.
- Anonyymi
Olet kuutamolla kuin se kuuluisa Tamppoonin naru.
Pythonissa hyödynnetään tosi paljon aikuisten ohjelmointikielillä tehtyjä kirjastoja.
Terveisin: konenäkijä - Anonyymi
Olet oikeassa, PyPy on vaihtoehtoinen nopeampi Python-toteutus. PyPy pyrkii nopeuteen ja pienempään muistin käyttöön verrattuna alkuperäisen Python-tulkkiin.
Olen itsekin testannut tuota nopeutta, ja saanut huomata että noin 2 kertaa nopeammin toimii kuin vastaava C sovellus. Valitettavasti PyPy tulkin kautta ei voi ajaa mitä tahansa Python sovellusta. Mutta silloin kun voi se kannattaa tehdä. - Anonyymi
Anonyymi kirjoitti:
Olet oikeassa, PyPy on vaihtoehtoinen nopeampi Python-toteutus. PyPy pyrkii nopeuteen ja pienempään muistin käyttöön verrattuna alkuperäisen Python-tulkkiin.
Olen itsekin testannut tuota nopeutta, ja saanut huomata että noin 2 kertaa nopeammin toimii kuin vastaava C sovellus. Valitettavasti PyPy tulkin kautta ei voi ajaa mitä tahansa Python sovellusta. Mutta silloin kun voi se kannattaa tehdä.Lisätäänpä vielä C ei ole mikään risukasa, ei missään nimessä.
Wikipedia sanoo näin:
C on yleiskäyttöinen, imperatiivinen ja rakenteinen käännettävä tietokoneiden ohjelmointikieli, joka on levinnyt laajalle 1970-luvulta lähtien, jolloin Dennis Ritchie kehitti sen UNIX-käyttöjärjestelmää varten. Kielessä yhdistyvät koneenläheisyys ja korkean tason kielen ominaisuudet. - Anonyymi
Python on myös parempi merkkijonojen käsittelyssä. Esimerkkinä vaikka tämä
>>> str="Tämä on yöllä kirjoitettu"
>>> str.find('ö')
Pythonilla ei ääkköset ja öökköset ole mikään ongelma, mutta yritäppä C:llä löytää monesko merkki ö on str -merkkijonossa. C:ssä moni merkkijonon käsittelyyn tarkoitettu funktion ei toimi ollenkaan skandien kanssa, ja se syö C:n arvostusta niin pahasti, että jos pitää valita vain toinen niin se on Python. - Anonyymi
Anonyymi kirjoitti:
Olet oikeassa, PyPy on vaihtoehtoinen nopeampi Python-toteutus. PyPy pyrkii nopeuteen ja pienempään muistin käyttöön verrattuna alkuperäisen Python-tulkkiin.
Olen itsekin testannut tuota nopeutta, ja saanut huomata että noin 2 kertaa nopeammin toimii kuin vastaava C sovellus. Valitettavasti PyPy tulkin kautta ei voi ajaa mitä tahansa Python sovellusta. Mutta silloin kun voi se kannattaa tehdä.Siis häh! Meinaatteko okeasti ja tosissanne että tulkattu koodi olisi nopeampaa suorittaa kuin käännetty? En oikein usko.
- Anonyymi
Anonyymi kirjoitti:
Siis häh! Meinaatteko okeasti ja tosissanne että tulkattu koodi olisi nopeampaa suorittaa kuin käännetty? En oikein usko.
Tehdäänpäs kokeilu. Kirjoittakaa ohjelma pythonilla joka mittaa kauanko kestää, kun loopissa muutetaan muuttujan arvo nollasta neljään miljardiin yksi numero kerrallaan.
Tein C-kielellä toteutuksen, näette koodin niin voitte kokeilla omilla koneillanne. Minun i5 @ 2,2 GHz suoriutui karvan alle yhdeksässä sekunnissa, kuten kuvakaappauksesta näette.
Veikkaan, ettei pythonilla mitenkään päästä noin nopeaan suoritukseen. Mutta kokeilen mielelläni jos joku kirjoittaa tuon saman pythonilla.
Tässä kuvakaappaus lähdekoodista ja ohjelman ajosta:
https://i.postimg.cc/cCYjjy6w/looppitesti.png
ps.
tuosta kuvasta jäi alusta pois näkyvistä kolme riviä lähdekoodia:
#include <stdio.h>
#include <time.h>
void main(void) - Anonyymi
C:llä siis 9 sekuntia. Ei pitäisi yrittää päässä laskea.
- Anonyymi
Anonyymi kirjoitti:
Siis häh! Meinaatteko okeasti ja tosissanne että tulkattu koodi olisi nopeampaa suorittaa kuin käännetty? En oikein usko.
Kyllä sinun pitäisi uskoa, se todellakin on monessa tapauksessa noin 2 kertaa nopeampi. Tein WHILE silmukan C:llä ja Pythonilla. Molempien suoritusaika mitattiin Linux järjestelmän omalla ulkoisella time-ajanotolla. Käyttämäni tiedostonimet olivat speed.py ja speed.c
PYTHON ( speed.py )
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
i = 1
while i < 4000000000: i = 1
AJETTU komennolla: time pypy3 speed.py
real 0m3,284s
user 0m3,247s
sys 0m0,020s
-
C ( speed.c )
#include <stdio.h>
int main(void) {
unsigned long i = 1;
while ( i < 4000000000) { i = 1; };
}
AJETTU komennolla: time speed
real 0m6,684s
user 0m6,681s
sys 0m0,000s
Kuten huomaat C kielinen While silmukka, vei yli kaksi (2) kertaa pitempään. Toivottavasti tämä ei nyt sitten poistu moderoinnin vuoksi. - Anonyymi
Anonyymi kirjoitti:
C:llä siis 9 sekuntia. Ei pitäisi yrittää päässä laskea.
Arvelinkin että timestampit on ylläpidolle liikaa.
Pythonilla menis siis 9 minuuttia 16 sekuntia, ja C:llä 9 sekuntia.
Pythonin luuppi:
while (n < 4000000000):
n =1
Ja C:llä sama:
while(n < 4000000000) {
n ;
} - Anonyymi
Anonyymi kirjoitti:
Arvelinkin että timestampit on ylläpidolle liikaa.
Pythonilla menis siis 9 minuuttia 16 sekuntia, ja C:llä 9 sekuntia.
Pythonin luuppi:
while (n < 4000000000):
n =1
Ja C:llä sama:
while(n < 4000000000) {
n ;
}Noniin, eli siis neljään miljariin päästiin
Python: yli yhdeksän minuuttia
C-kieli: noin yhdeksän sekunttia
C-kielellä tehty ohjelma siis pyörii todella paljon nopeammin kuin pythonilla tehty ohjelma. Se ei _tietentkään_ tee pythonista "huonoa" ohjelmointikieltä. Kaikki riippuu käyttätarkoituksesta.
Selvää kuitenkin on, että silloin kun pitää tehdä tehokasta koodia, tarvitaan joku käännettävä kieli. Näitähän on tietysti monia, esim: C-kieli, C , Pascal, Rust... - Anonyymi
Anonyymi kirjoitti:
Arvelinkin että timestampit on ylläpidolle liikaa.
Pythonilla menis siis 9 minuuttia 16 sekuntia, ja C:llä 9 sekuntia.
Pythonin luuppi:
while (n < 4000000000):
n =1
Ja C:llä sama:
while(n < 4000000000) {
n ;
}Kokeilin vielä Javascriptillä Node.js:n kanssa ja tulos oli 8 sekuntia. Eli se toimii suunnilleen yhtä nopeasti kuin C, vaikka onkin tulkattava kieli.
- Anonyymi
Anonyymi kirjoitti:
Tehdäänpäs kokeilu. Kirjoittakaa ohjelma pythonilla joka mittaa kauanko kestää, kun loopissa muutetaan muuttujan arvo nollasta neljään miljardiin yksi numero kerrallaan.
Tein C-kielellä toteutuksen, näette koodin niin voitte kokeilla omilla koneillanne. Minun i5 @ 2,2 GHz suoriutui karvan alle yhdeksässä sekunnissa, kuten kuvakaappauksesta näette.
Veikkaan, ettei pythonilla mitenkään päästä noin nopeaan suoritukseen. Mutta kokeilen mielelläni jos joku kirjoittaa tuon saman pythonilla.
Tässä kuvakaappaus lähdekoodista ja ohjelman ajosta:
https://i.postimg.cc/cCYjjy6w/looppitesti.png
ps.
tuosta kuvasta jäi alusta pois näkyvistä kolme riviä lähdekoodia:
#include <stdio.h>
#include <time.h>
void main(void)4E9 luuppi kierrosta 9 sekuntiin, näyttävä suoritus, 1980-luvulla
10000 for -- next silmukkaa oli varsinainen nopeustesti.
Itse en käytä enää C:tä, mutta ajattelin kokeilla käytössäni olevilla
FORTH-versiolla miten käy, FORTHilla oli hidas maine, kun ne olivat
tulkkikoneita. mutta asiat muuttuvat.
C ja FORTH ovat hyvin erilaisia kieliä, FORTH on pinokoneelle tarkoitettu,
siksi aivan täsmällistä käännöstä on hankala tehdä, kun jo loopit toimivat
eri periaatteella.
Tein 4E9 kierroksisen BEGIN--UNTIL loopin, tosin sillä muunnoksella että
käytössäni olevat versiot ovat pinoltaan 32 bittiä leveitä, joten suora osoitus
pinossa ei onnistu, tai en ala kokeilemaan sitä. Siis tein loopin missä
pyörii kaksi 2E9 looppia perätysten. Tästä saisi ainakin suuruusluokan.
: ajo 1 begin 1 dup 2000000000 > until drop ;
Koodi on tuossa ilman ajanottoa, pitäisi toimia yleisesti FORTHeilla, pinon
leveys otettava huomioon.
Käytössäni on kaksi konekielelle kääntävää versiota, VFX Forth ja
SwiftForth.
Tulokset ovat: 2X2E9 kierrosta.
VFX Forth 1.966 sek. nopein aika.
SwiftForth 2.8 sek.
Miksi näin nopeita, koodi näyttää että koko operaatio tehdään pinossa.
mitään muuttujia ei käytetä, pinokäsittely on erittäin nopeaa.
FORTH on hyvin joustava kieli, tuon kokeen voisi tehdä usealla eri tavalla,
voi olla että BEGIN--UNTIL on nopein, mitä pitänee kokeilla, - Anonyymi
Anonyymi kirjoitti:
Lisätäänpä vielä C ei ole mikään risukasa, ei missään nimessä.
Wikipedia sanoo näin:
C on yleiskäyttöinen, imperatiivinen ja rakenteinen käännettävä tietokoneiden ohjelmointikieli, joka on levinnyt laajalle 1970-luvulta lähtien, jolloin Dennis Ritchie kehitti sen UNIX-käyttöjärjestelmää varten. Kielessä yhdistyvät koneenläheisyys ja korkean tason kielen ominaisuudet."Kielessä yhdistyvät koneenläheisyys ja korkean tason kielen ominaisuudet."
Tuo kuvaus sopii paremmin Delphiin kuin C -kieleen.
Ja jos sekaan haluaa sotkea assembly -kieltä, niin assembly -kielen yhdistäminen Delphiin on helpompaa kuin assembly -kielen yhdistäminen C -kieleen. Syynä tähän C -kielen sekavat "constraints" -säännöt.
Kumpikaan kieli ei suoraan tue CPU:n carry flagin käsittelyä, toki inline assemblyä käyttämällä se onnistuu helposti (Delhissä) tai vaikeasti (C -kielessä). - Anonyymi
Anonyymi kirjoitti:
Python on myös parempi merkkijonojen käsittelyssä. Esimerkkinä vaikka tämä
>>> str="Tämä on yöllä kirjoitettu"
>>> str.find('ö')
Pythonilla ei ääkköset ja öökköset ole mikään ongelma, mutta yritäppä C:llä löytää monesko merkki ö on str -merkkijonossa. C:ssä moni merkkijonon käsittelyyn tarkoitettu funktion ei toimi ollenkaan skandien kanssa, ja se syö C:n arvostusta niin pahasti, että jos pitää valita vain toinen niin se on Python."Python on myös parempi merkkijonojen käsittelyssä. Esimerkkinä vaikka tämä
>>> str="Tämä on yöllä kirjoitettu"
>>> str.find('ö')"
Samoin Delphissä:
var
S : String;
n : Integer;
begin
S := 'Tämä on yöllä kirjoitettu';
n := pos('ö', S);
// muuttujassa n on nyt arvo 10, koska "ö" on tuon merkkijonon 10. merkki.
end;
Edes FreePascal / Lazarus ei yllä tässä samaan helppouteen kuin Delphi.
Jos merkkijonossa olisi vaikkapa ä -kirjain ennen ö- kirjainta, niin FreePascalin pos() -funktio palauttaisi epäjohdonmukaiselta näyttäviä arvoja, tosin ne ovat loogisia (omalla tavallaan).
Kas kun FreePascal käyttää UTF-8 -enkoodattua unicodea merkkijonojensa sisäisenä esitystapana, jolloin ä ja ö kirjaimet kuluttavat yli 1 tavu/kirjain, mutta kirjaimet a-z kuluttavat tasan 1 tavu/kirjain.
Windowsissa käytetään usein UTF-16 -enkoodattua unicodea.
Tässä ei suomen kielen ä ja ö -kirjainten kohdalla synny vastaavaa ongelmaa, mutta kokeilepa vaikkapa jotain näistä merkeistä (U+10840 .. U+1085F):
https://en.wikipedia.org/wiki/Imperial_Aramaic_(Unicode_block)
Niissä käy myös niin, että 1 merkki = 2 enkoodausyksikköä.
Tässä enkoodausyksikkönä on 16-bittinen WORD.
Kannattaa vielä huomata:
JOS valitaan vaikkapa merkki U+10840, niin se korrekti (ja Unicode consortiumin hyväksymä) koodaustapa UTF-8 -esitystavalla kuluttaa 4 tavua.
MUTTA:
Väittäisinpä, että 99% - 100% GPL -lisensioiduista linux -käyttöjärjestelmässä ajettavista ohjelmista ei osaa koodata tuota merkkiä oikein, vaan koodaa sen virheellisesti 6 -tavuiseksi kummajaiseksi !
Tällainen vaihtoehtoinen koodaustapa ei ole eikä ole koskaan ollutkaan Unicode consortiumin hyväksymä koodaustapa.
MIKSI?
Koska avoimen lähdekoodin fanaatikot (jotka linux -maailmassa tekevät päätökset, ikävä kyllä) eivät suostu uskomaan, että jos joki BMP (Basic Multilingual Page):hen kuulumaton merkki esitetään UTF-16 -enkoodauksella 2 peräkkäisellä surrogate -arvolla, niin tuota EI SAA koodata UTF-8:ksi niin, että koodaa kummankin surrogaten erikseen (mutta näin jokin linuxissa yleisesti käytetty kirjasto, olisiko libiconv tai jotain, toimii, vaikka se rikkoo törkeästi unicode -standardia) , vaan oikein on ensin purkaa nuo 2 peräkkäistä surrogate -arvoa 21 -bittiseksi UNICODE -koodiksi, ja vasta sitten enkoodata tämä 21-bittinen UNICODE -koodi UTF-8 -enkoodauksella, jolloin saadaan oikea ja standardinmukainen 4-tavuinen UTF-8 -enkoodattu esitysmuoto tuollaiselle merkille.
Montakohan (kymmentä) vuotta vielä kuluu, ennekuin kovapäiset linux -fanaatikot tämän suostuvat tajuamaan, ja korjaamaan linux -kirjastonsa sellaiseksi, että se osaisi enkoodata myös Basic Multilingual Page:en kuulumattomat unicode -merkit UTF-8:ksi oikein eli standardinmukaisella tavalla ????
- Anonyymi
"Käännösvaiheessa tehdään muistinvaraus, joka kestää maailman tappiin."
Tuolla tavalla joku väitti tuossa yläpuolella ettei varattu muisti vapaudu. Tein pienen ohjelman jolla asian voi itse testata. Sinulla pitää olla joku mistä näet vapaan muistin suorituksen eri vaiheissa.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test( void ) {
char *str;
str = (char *) malloc(1500000000);
memset(str,'$',1500000000);
printf( "Muisti varattu!");
getchar( );
free(str);
printf( "Muisti vapautettu!");
getchar( ); }
int main () {
printf( "Seuraa muistin käyttöä!");
getchar( );
test();
return(0); }- Anonyymi
Jollei ole mitään muuta niin Linuxin ( free ) komento näyttää käytetyn ja vapaan muistin. Joudut vain avaamaan kaksi komentokehoiteikkunaa, toisessa ajat tuon testin, ja toisessa luet muistin tilan.
- Anonyymi
Mikähän lie kun ketjulistaus ei päivity. 18 min odottelin ketjulistauksen päivittymistä, ei tullut.
- Anonyymi
Tämä ketjulistauksen päivityskäytäntö on varmaankin muutettu noiden sämppäreiden vuoksi.
- Anonyymi
Anonyymi kirjoitti:
Tämä ketjulistauksen päivityskäytäntö on varmaankin muutettu noiden sämppäreiden vuoksi.
Ei hyvä tällä tavalla.
- Anonyymi
Basick kieli on helpompaa.
10 PRINT "SEPPO"
20 GOTO 10
RUN- Anonyymi
Tai sama C-kielellä:
#include <stdio.h>
void main(void)
{
int i = 1;
while(i)
{
printf("SEPPO\n");
}
}
Kääntäminen:
gcc seppo.c -o sepotin
Ajaminen:
./sepotin
Tosin, myös C-kielessä on goto-käsky olemassa. Sen käyttäminen vaan on kamalan rumaa.
- Anonyymi
Ylläpito hei, olisitteko niin hyvä ja poistaisitte nuo harjaavat viestit. KIITOS
- Anonyymi
Automaatti poistelee nyt vääriä viestejä. Nuo ilkeilyt täältä joutaa pois.
- Anonyymi
Kiitosta paljon.
- Anonyymi
Sinä joka annoit näytteen BASIC koodista, viestisi poistui varmaan siksi, että se sisälsi isoja kirjaimia liikaa suhteessa viestin pituuteen.
- Anonyymi
S24-nörtit kehittelemässä sääntöjä. Toivottavasti pääsevät joskus tekemään oikeaakin laindäädäntöä.
- Anonyymi
Anonyymi kirjoitti:
S24-nörtit kehittelemässä sääntöjä. Toivottavasti pääsevät joskus tekemään oikeaakin laindäädäntöä.
Kyllä minuakin harmittais :)
- Anonyymi
Anonyymi kirjoitti:
Kyllä minuakin harmittais :)
C on yksi vaikeimmista kielistä kirjoittaa oikein ensi yrittämällä. Itse kirjoittaisin tuon while(i) silmukan ilman i:tä, eli for(;;) muistamalla, että for-silmukan kaikki parametrit ovat optionaalisia. Kielen huono puoli tosiaan on se, että se mahdollistaa huonon koodin kirjoittamisen vähän turhankin helpolla ja tästä syystä joutuu käyttämään linteriä ja -Wall yms. tarkistuksia. Ehkäpä pitäisi sitten opetella jokin parempi kieli, vaikka Haskell - tai sitten ei..
- Anonyymi
Ei onnistu vastata, moderointi poistaa tänään kaikki viestit, mitä yrittää kirjoittaa. Kumma että eilen sai kirjoitettua ja kaikki viestit jäivät näkymään. Taas rupeaa korpeemaan tämä suomi24 sivuston moderointi. Mailman huonoin sivusto.
- Anonyymi
Kumma että noinkin nyrjähtänyt kieli on saanut merkittävän aseman eikä esim työsuojelutarkastaja ole puuttunut asiaan.
- Anonyymi
Silmukkatesteissä kannattaa huomata että kääntäjät ja tulkit optimoi niitä lennossa jos huomaavat että ovat dummeja. Kääntäjät/tulkit tekee nykyään ihmeellisiä asioita.
Kyllä C-kielellä tehty ja käännetty koodi on paljon nopeampaa kuin Pythonilla.
MUTTA Pythoniin on loistavia kirjastoja jotka on nopeita. Lienevät kirjoitettu C:llä.
Jos Python olisi nopeampi ja tehokkaampi kuin C niin kaippa Linux olisi kirjoitettu uudelleen Pythonilla ... - Anonyymi
Perustiedot ohjelmoinnista pitäisi kuitenkin tietää mikä oli A-kieli tietystikin Assembly, sitten tuli B-kieli, sitten tuli C-kieli joka on hallitseva aina tehokkaissa sovelluksissa.
- Anonyymi
Mikä tahansa ohjelmointikieli on helppoa oppia jos on ymmärrystä logiikasta ja loogisesta päättelystä että matemaattisia taitoja.
Ohjelmonti vaatii myös pitkäjännitteisyyttä.
Itse en kuitenkaan C kieltä ihan ensimmäisenä lähtisi opiskelemaan, ainakin jos tarkoitus on itsekseen kotona opiskella ja oppia.
Itse suosittelisin:
1) Opettele bash-skriptaus ensin (Linux)
2) PHP tai Python
3) Nyt vasta C, tai vähän PERLiä ensin- Anonyymi
Tuosta ensimmäisestä kohdasta olen täysin samaa mieltä. On ehdottoman tärkeää tuntea oma käyttöjärjestelmänsä mahdollisuudet.
Pythonissakin os -kirjasto on pelkästään käyttöjärjestelmän omien mahdollisuuksien soveltamista, ellei järjestelmäänsä tunne on ihan turha kirjoittaa riviä:
import os
- Anonyymi
Kyllä, pythoniin tulee paljon import:ia ihan sen mukaan että mitä tarvitsee tehdä, aivan kuten C -kielessä tulee #include:ja, ja C:ssä pitää käytännössä aina kuitenkin laittaa se kuuluisa #include "stdio.h"....
- Anonyymi
Sen enempää asiaan tutustumatta kommentoin vain että jos AP:n tehtävänannossa on tarkoitus C -kielellä etsiä jonkin merkki merkkijonosta, niin se tapahtuu funktiolla 'strchr'.
Ja näitä funktioita C-kielessä riittää, ja ne kaikki vaan pitää opetella ja muistaa. Kyse on ihan samasta asiasta kuin että opettelisi vieraita kieliä.
Omista korkeakouluopinnoista Yliopistolla muistan että siellä proffa oli antanut laskarit kotiin, ja minähän tein työtä käskettyä. Sitten luennolla proffa alkoi selittämään että 'yksi näistä tehtävistä näköjään osoittautui aika vaikeaksi kun siitä tuli niin paljon kysymyksiä sähköpostilla'.
Ihmettelin vaan, ja sitten tavalliseen tapaan proffa tuli tarkistamaan kaikkien laskarit, ja ihmetteli ja pyöritteli päätään että mitä kummaa oikein olin tehnyt. Selitin vain että 'tehtävän anto oli tehdä olio joka luo olioita'...
Proffa vaan pyörittelee päätään ja toteaa että, 'noh, olio-ohjelmointiahan tässä tehdään joka tapauksessa niin kyllä se sinulla hanskassa alkaa olemaan', ja kaikki laskarit kuitattiin tehdyksi ja hyväksytyksi.
Eli siis tosielämässä, niin opiskellessa kuin työelämässä tulee tapauksia jotka voi joskus olla vähän hankalasti hahmotetavissa, ja sitten näkee välillä myös aika 'mienekiintoisia' virityksiä mutta, no, oppia ikä kaikki...- Anonyymi
Eli et tiedä C -ohjelmoinnista mitään.
- Anonyymi
Anonyymi kirjoitti:
Eli et tiedä C -ohjelmoinnista mitään.
....ja väitteesi perustuu mihin faktaan....?
- Anonyymi
Hieman vaikeampi kuin Fortran.
- Anonyymi
Justiinsa niin tuo että niin tytöt haluavat tietokoneensa tekemään mitä itse haluavat, joka olisi mukavaa..
- Anonyymi
Tuollainen on aika hauskaa jos osaa ohjelmoida grariikkakiihdyttimien ominaisuuksia ja shader, blader, light fodus what ever, mutta niin tee vahingossa joku hassu grafiikkakiihdytiin piirää ruudull3 :DS
- Anonyymi
Kyllä C-kielen oppii jos halua on, sillä on hyvä tylsistyttää aivonsa
töissä.
Mutta jos haluat älyllistä seikkailua ohjelmoinnin parissa, parempia
vaihtoehtoja on tarjolla.
En tarkoita eksoottisia aivojen nyrjäyttäjiä, vaan jotain sellaista jolla
voi rakentaa hyödyllistä, vaikka mikrokontrolleri avaruusluotaimeen.
Voisin melkein suositella forth-nimistä kieltä, ei fortran, se on toinen juttu.
Siinä missä c:n pino on piilotettu kääntäjän käyttöön, forthissa se näkyvillä
ohjelmoijan käytössä, sen kautta hoidetaan kaikki parametri liikenne.
Tämä tuntuu tutulta hp:n laskimista, siellä on samanlainen pinosysteemi
ja käänteinen puolalainen logiikka, mikä yksinkertaistaa laskemista.
Forth on eräs vaihtoehto pinokoneiden kieleksi, se hyviä puolia on nopea
ohjelman rakentaminen, tiivis koodi, jopa konekieltä tiukempaa,
avaruusluotaimet pitävät siitä, ohjelmien testaus ja debuggaus erittäin
yksinkertaista, kääntäminen hyvin nopeaa, ei linkkeriä.
Haitaksi voisi laskea koodin lukemisen vaikeutta, näyttää kryptiseltä,
koska siinä ei yleensä näy pinon sisältöä, vain funktiot jotka käsittelevät pinoa.
Koodi on vain funktioluetteloa erotettuna välilyönnillä, joten syntaksi on
erittäin yksinkertaista.
Forthia on sanottu ohjelmoijan vahvistimeksi, hyvä ohjelmoija tekee hyvää
koodia, huono saa aikaan hirvittävää koodia, c tarjoaa runsaasti köyttä mihin
voi hirttäytyä, forth tarjoaa säkillisen myrkkykäärmeitä ja liekinheittimen.
Kun tutustuin c-kieleen, vaikutelmaksi tuli "ai näin se tehdään c-kielellä", ja
yritin ottaa selvää risuaidasta.
Forthilla voi käyttää luovuutta, kääntäjä ei pakota ohjelmoijaa raameihinsa,
forthilla olen kokenut aitoa luomisen riemua, "ai näin sen voi tehdä" tyyliin.
Forthilla voit laajentaa kääntäjää, jos haluat eri tavalla käyttäytyvän muuttujan
voit tehdä sen, se on sitten erottamaton osa kieltä.
Koodi esimerkkinä yksinkertainen, jopa huvittava, ehkä käyttökelpoinen.
: 1 1 ;
: on kääntäjän käynnistysmerkki.
1 on funktion nimi, ei aivan funktio, kuten perinteisissä kielissä.
1 toiminta joka suoritetaan, pinossa oleva numeroa kasvatetaan yhdellä,
pinossa 5 1 jälkeen 6.
; kääntäjälle lopetusmerkki.
Jos aikaisemmin on joutunut käyttämään 1 , välimerkki välissä, tuon
jälkeen voi käyttää 1 , se on tullut uudeksi osaksi kieltä.
Eri kielistä on hyvä sivu, googlatkaa .
Rosettacode.org
Sieltä sitten Explore. - Anonyymi
Tämän ketjun pilasi moderointi ja rollit yhdessä toisiaan tukien, jalkoihin jäi python taitajat.
- Anonyymi
C-kielen formaali on tekninen, ja teknisenäkin osittain matemaattisesta merkintätavasta poikkeava.
Esimerkiksi Basic-kielen formaali on kielellinen ja matemaattista merkintätapaa noudattava.
Ohjelmointi on myös ajattelua. Onko järkevää ajatella teknisen formaalista kun voi ajatella kielellisesti? Pidemmän päälle tekninen formaali aiheuttaa aina vain monimutkaisempia rakennelmia, jotka ikävä kyllä johtavat lopulta tuhoon. Katsokaa vaikka nykyaikaisten internetsivujen "koodia".- Anonyymi
Tuosta ymmärsin hyvin vähän, tai en sitäkään.
C on yleiskäyttöinen, yksiselitteisiin komentoihin perustuva, käännettävä, tietokoneiden ohjelmointikieli. Kun taas Basic on aloittelijalle sopiva ohjelmointikieli. - Anonyymi
Anonyymi kirjoitti:
Tuosta ymmärsin hyvin vähän, tai en sitäkään.
C on yleiskäyttöinen, yksiselitteisiin komentoihin perustuva, käännettävä, tietokoneiden ohjelmointikieli. Kun taas Basic on aloittelijalle sopiva ohjelmointikieli.Onko ruotsin kieli helppo oppia? On jos haluaa ja jaksaa opiskella.
Onko saksan kieli helppo oppia? On, jos jakssa opiskella, mutta helpompaa on jos osaa jo ruotsia.
Onko japanin kieli helppo oppia? On, jos jaksaa opiskella. mutta suomalaiselle kaikista helpointa koska lausuntatapa on sama suomenkielen kanssa.
Kirja käteen ja lukemaan. Niin minäkin tein, aikana jolloin ei ollut nettiä muuten kun modeemilla käytettävissä...
- Anonyymi
Kun löytää mielekiintoisen kohteen rakentaa, ei sitä tehdessä kielen vaikeus tule mieleen.
- Anonyymi
Taitaa jankkaava toksinen koodari olla / c:stä
- Anonyymi
Ota Microsoftilta joku Visual C++ ohjeistus voi toimia paremmin vaikka:
https://learn.microsoft.com/en-us/visualstudio/get-started/visual-studio-ide?view=vs-2022
Itselläni oli melkein pakko hommata uusi kone joka olisi kuin peruskäyttäjän juttu kun OpenGL-juttuja ja pitää saada sellaisia että Stand-Alone -juttuja niin voi testata sellaisella miten toimii eikä ole mitään puuttuvia Dillejä eli DLL-tiedostojakaan.
OpenGL, niin joo Silicon Graphics, aina tulee vastaan tuo Hardware Acceleration noissa grafiikkajutuissa:
https://en.wikipedia.org/wiki/Silicon_Graphics - Anonyymi
Mikä on bussikuski?= Bus Dricewr listaa kaikki laitteet jättimäinen lista mitä laitteita on emolevyllä ja kaikki heh, oikeasti tuollainen pyyntö.. assemblyäkin koodia, hirviölista kaikista emolevyllä olevista tuotteista.
Ketjusta on poistettu 10 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Miehille kysymys
Onko näin, että jos miestä kiinnostaa tarpeeksi niin hän kyllä ottaa vaikka riskin pakeista ja osoittaa sen kiinnostukse1293617- 851865
Olen tosi outo....
Päättelen palstajuttujen perusteella mitä mieltä minun kaipauksen kohde minusta on. Joskus kuvittelen tänne selkeitä tap151651Haluaisin jo
Myöntää nämä tunteet sinulle face to face. En uskalla vain nolata itseäni enää. Enkä pysty elämäänkin näiden kanssa jos541372Ylen uutiset Haapaveden yt:stä.
Olipas kamalaa luettavaa kaupungin irtisanomisista. Työttömiä lisää 10 tai enempikin( Mieluskylän opettajat). Muuttavat1151206VENÄJÄ muuttanut tänään ydinasetroktiinia
Venäjän presidentti Vladimir Putin hyväksyi tiistaina päivitetyn ydinasedoktriinin, kertoo uutistoimisto Reuters. Sen mu911202- 681089
Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornosta
https://www.kymensanomat.fi/paikalliset/8081054 Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornon hallussapi28982- 65964
Hommaatko kinkkua jouluksi?
Itse tein pakastimeen n. 3Kg:n murekkeen sienillä ja juustokuorrutuksella. Voihan se olla, että jonkun pienen, valmiin k99953