ANSI C kysymyksiä aiheena tiedostot

Saku-foorumi » Classic Amiga » Ohjelmointi » Viestit 2003 » ANSI C kysymyksiä aiheena tiedostot « Edellinen Seuraava »

Kirjoittaja Viesti
 

JPQ
Keskiviikkona, 19. maaliskuuta, 2003 - klo 18.46:   
Miten Ansi C:eellä kirjoitan 16bittisen luvun tiedostoon entäs miten sen luen sieltä? eli se veisi tilaa kaksi tavua en siis tarkoita luvun ascii esityksen kirjoitusta. Toki yritän itse sitä selvittää mutta valmista koodia mieluiten haluaisin. Ja tämä ei ole koulutyö. Tai edes kertokaa miten ANSI C funktioilla puolitan 16bit luvun kahdeksi 8bit luvuksi. Että sittenhän sen saisin talteen kirjoitamalla kaksi 8bit lukua eikö totta?

 

Jon
Keskiviikkona, 19. maaliskuuta, 2003 - klo 19.00:   
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)...

Eli kai se menee näin:

fwrite( pointteri_lukuun, sizeof( WORD ), 1, tiedosto );

http://www.introl.com/introl-demo/Libraries/C/ANSI_C/stdio/fread.html

 

JPQ
Keskiviikkona, 19. maaliskuuta, 2003 - klo 19.30:   
Mikä muuttuja tyyppi olisi sellainen joka olisi vakiona 16-bit eipä
tule mieleen ja onnistuikohan homma näin jaan bitin pyörittelyillä
luvun kahdeksi 16bit luvuksi joidenarvot mahtuu 8bitiin ja
teen tyyppi muunnoksen saaduille luvuille koska sehän onnistunee
vaikka C kääntäjä varoittaakin. kirjoitan noi 8bit tavut tiedostoon
oikein päin? eli hieman lisä apuja kiitos vielä kaipaisin.

WORD ei liene standardi C kieltä vai olenko väärässä ? nyt olisi
tarpeen olla koska amiga ei ole ainoa alusta.

PS. Tosiaankin ratkaisu joka noudattaa ANSI C:eetä olisi tarpeen eli
mitään alusta "roikkuvaa"...

 

Jon
Keskiviikkona, 19. maaliskuuta, 2003 - klo 20.09:   
short, tai onko se short int?

Jos kerran tavu kerrallaan kirjoitat niin etkö voisi siirtää pointteria yhden tavun eteenpäin ja kirjoittaa toisen tavun? Jos noita 16-bittisiä lukuja on paljon peräkkäin niin kirjoita kaikki kerralla.

 

JPQ
Keskiviikkona, 19. maaliskuuta, 2003 - klo 21.19:   
Jon: onko short aina varmasti 16bit täytyy tutkia se on minimi koko vaatimus mutta voi olla isompikin eli pulma on edelleen. Jollei ideani ole turvallinen & toimiva.

 

Markus
Keskiviikkona, 19. maaliskuuta, 2003 - klo 22.23:   
Virallisesti C-kielessä short on vähintään 16 bittiä, mutta yleensä 16 bittiä, mitä se sitten tarkoittaakaan. Lähteenä tähän minulla on ATK-instituutin "C-kieli"-kirja, mitä itse pidän varsin hyvänä kirjana. Käyttämäni painos on vuodelta 1993.

 

itix
Keskiviikkona, 19. maaliskuuta, 2003 - klo 23.49:   
Jos tarvitsee eri platformeille porttaantuvaa koodia kannattaa määritellä omat lukutyypit.

Esimerkiksi:

typedef unsigned char uint8;
typedef char int8;
typedef unsigned short uint16;
typedef short int16;

ja niin edelleen. Laittaa nuo johonkin headeriin.

 

JPQ
Keskiviikkona, 19. maaliskuuta, 2003 - klo 23.56:   
Markus: Ja kuten yritin sanoo hommassa pitää olla 16bittiä eikä yli eikä ali. Ja mun The C Programming Language (Brian W. Kernigham/Dennis M. Ritche) kirjassa lukee vähintään 16bittiä ja voi olla enempikin. Eikä mitään että yleensä sitä sun tätä. Kirjassa ei yleistetä jo siksi hyvä kirja. Ja ainoa C kirja josta minä tajuan jotain plus muutama jotka käyttää C kieltä esimerkeissään mutta ne ei opetakaan C:tä vaan esim. Viivanpiirtoa yms...
Itix: tämän olisi tarkoitus porttaua ties mille. Ja noi siis toimii vai kaikilla kunnon kääntäjillä ? eli mistään kivikautisista Aztec C tyyppisistä en tietenkään välitä. Eli hyvät kääntäjät ja pitää keksiä noille paremmat nimet. Ja sellaiset ettei tule Conflikteja.(Anteeksi jos vika sana on väärin).

 

Piru
Keskiviikkona, 19. maaliskuuta, 2003 - klo 23.59:   
Noniin, setä sanoo kans:

Binaaritiedoston kirjoittaminen (jos se sisältää muita tietotyyppejä kuin char), on aina portaantuvuusongelma: eri byteorderin omaavat laitteet pitävät muistissa sijaitsevan luvun omassa sisäisessä esitysmuodossaan. Vain c- lähdekooditasolla lukujen käsittely on aina samanlaista.

Eli siis: Jos koodin *ja* tiedostojen pitää olla 100% porttaantuvia, ainut tapa on kirjoittaa & lukea luvut asciina, tai pilkkoa luvut 8-bit charreiksi ja kirjoitella & lukea luvut tavu kerrallaan (aina tietyssä järjestyksessä!).

 

Markus
Torstaina, 20. maaliskuuta, 2003 - klo 8.32:   
Eihän yleistäminen sinällään mikään huono asia ole. :) Jos sanotaan, että short on vähintään 16 bittiä ja tarkennetaan, että kuitenkin yleensä nimenomaan 16 bittiä, niin siinähän vain tarkennetaan asiaa, lisätään informaatiota, kun se nyt sattuu olemaan totta, että short on yleensä 16 bittiä.

 

Jon
Torstaina, 20. maaliskuuta, 2003 - klo 9.36:   
Miten muuten Linuxissa hoituu tuo endianess-juttu? Onko siellä määritelty jotain makroja tai muuta?

 

JPQ
Torstaina, 20. maaliskuuta, 2003 - klo 13.06:   
Piru: hyvä tietää ja tarkoitus kun olisi lukea/kirjoittaa ehkä joskus 16bit wav/aiff sampleja. Eli pitää ehkä määritellä koodia niin että siinä lippu josta tiedetään alustan byteorder.
Markus: yleistäminen on paha koska jotkut ajattelee sen jälkeen automaattisesti tuohon voi noja>ta tyyliin se aina 16bit. jotkut ajattelee nykyään että 95-99% prosenttia on sama kuin 100% prosenttia. Eli siksi paha.
PS. Hemmetin INTEL (Lausutaan In Hell,jos kielitaitoni pätee) minkä ongelman meille teit... koska sehän lienee se joka käyttää ainoastaan ja sen kanssa yhteensopivat väärää tavujärjestystä.

 

Markus
Torstaina, 20. maaliskuuta, 2003 - klo 13.55:   
JPQ: Tarkkaan ottaen jos ilmaistaan, että short on "yleensä 16 bit", niin ei ole tehty yleistystä, että se on aina 16 bit, vaan tuohon ilmaisuunhan itsessään sisältyy tieto siitä, että se voi olla myös muuta. Yleensä-sana viitaa siihen, että short on 16 bit "usein" ei "aina".

Käytännössä monet epäeksaktien tieteiden tulokset ovat jonkinlaisia yleistyksiä, jotka pohjautuvat tilastoihin. Ilman näitä yleistyksiä ei oikein mistään saataisi selvyyttä. Matemaattinen induktio on oma lukunsa, jolla saadaan todistettua absoluuttisen varmasti tulos yleistäen yksittäisestä tapauksesta yleiseen tapaukseen.

 

JPQ
Torstaina, 20. maaliskuuta, 2003 - klo 14.25:   
Markus: eipä tuo antamasi teksti yleistänytkään noi mutta jotkut
ihmiset lukee tuollaisen tekstin noin. Olen liikaa nähnyt ohjelmia
yms. jotka pohjaa yleistykseen. Ja kärsinyt itsekkin yleistyksen
pohjalta saadusta kohtelusta ihan ihmisenä siis.

 

itix
Torstaina, 20. maaliskuuta, 2003 - klo 15.34:   
Headeri machine/endian.h auttanee tiedonjanoon :-)

 

JPQ
Torstaina, 20. maaliskuuta, 2003 - klo 15.56:   
itix: tuollaista headeria ei mun kääntäjässä ole ja eikä varmaan kaikissa muissakaan...

 

itix
Torstaina, 20. maaliskuuta, 2003 - klo 18.54:   
Jos kääntäjän mukana ei tule niin käy hakemassa netistä AmiTCP SDK tai Miami SDK jossa nuo ovat.

 

JPQ
Torstaina, 20. maaliskuuta, 2003 - klo 21.01:   
itix: joopa joo mutta mistäs muiden alustajien käyttäjät saa sopivan. Miten esim. 16bit luvun jaan kahdeksi 8bit tavuksi ?

 

miksuh
Perjantaina, 21. maaliskuuta, 2003 - klo 11.29:   
Joo siis noita tietotyyppien maksimikokoja ei pitäs alkaa olettamaan, ne kun ei ole aina välttämättä samoja joka systeemissä. Edes int, short tai long ei välttämättä ole jokasysteemissa samanmittasia. Eli jos porttautuvaa koodia haluaa tehdä, niin kannattaa toi muistaa.

 

miksuh
Perjantaina, 21. maaliskuuta, 2003 - klo 12.07:   
JPQ: Kannattaa mielessään ajatella noita lukuja binäärilukuina tossatapauksessa.

On tohon muitakin keinoja, mutta:

Luvun 8 enemmän merkitsevää bittiä saa 8bit luvuksi siirtämällä bittejä 8 bittipaikkaa oikealle. ´Tai vaihtoehtosesti voi nollata ensin bittimaskilla 8 vähemmänmerkitsevää bittiä ja pyörittää sitten bittejä 8 bittipaikkaa oikealle.

Vähemmän merkitsevät bitit saa niin että sopivalla bittimaskilla nollataan enemmän merkitsevän tavun bitit 16bit luvusta. Tuolloin jäljelle jää ne 8 vähemmänmerkitsevää bittiä.

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: