abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
12.10. 15:44 | Nová verze

Po třech letech od vydání verze 5.0 byla vydána nová major verze 6.0 v Javě napsané aplikace pro komplexní návrh rozmístění nábytku a dalšího vybavení v interiérech Sweet Home 3D. Přináší celou řadu novinek. Zdůraznit lze možnost otevírání oken, dveří nebo skříněk. Zmínit lze také novou figurínu s otočnými klouby.

Ladislav Hagara | Komentářů: 8
12.10. 15:00 | Nová verze

Byla vydána nová verze 2018-10-09 linuxové distribuce Raspbian určené především pro jednodeskové miniaturní počítače Raspberry Pi. Přehled novinek v poznámkách k vydání. Společně s Raspbianem byl aktualizován také instalační nástroj NOOBS (New Out Of the Box Software). Z novinek je nutno upozornit na odstranění programu Wolfram Mathematica.

Ladislav Hagara | Komentářů: 2
11.10. 22:44 | Zajímavý projekt

V rámci projektu PRIM (Podpora rozvíjení informatického myšlení), jehož cílem je "podporovat změnu orientace školského předmětu informatika z uživatelského ovládání ICT směrem k základům informatiky jako oboru", byly na stránkách iMyšlení (informatické myšlení) představeny volně stažitelné učebnice a výukové materiály pro výuku informatiky. Videozáznam z tiskové konference na Facebooku.

Ladislav Hagara | Komentářů: 1
11.10. 13:22 | Nová verze

Nadace Free Software Foundation (FSF) zveřejnila na svých stránkách prohlášení k připojení Microsoftu k Open Invention Network (OIN): Je to krok správným směrem. Problematiku softwarových patentů to ale neřeší. OIN pokrývá pouze část svobodného softwaru. Smlouvu s OIN lze vypovědět s 30 denní lhůtou. FSF vyzývá Microsoft, aby 1) jednoznačně potvrdil, že ukončil všechny patentové spory související s Linuxem v Androidu, 2) s členy OIN

… více »
Ladislav Hagara | Komentářů: 2
10.10. 22:22 | Komunita

Bradley M. Kuhn se v příspěvku na blogu Software Freedom Conservancy zamýšlí nad připojením Microsoftu k Open Invention Network. Žádá Microsoft, aby jako gesto dobré vůle a jako důkaz, že to myslí opravdu vážně, sám commitnul zdrojové kódy proprietárního patentovaného souborového systému exFAT pod licencí GPLv2+ do upstreamu Linuxu.

Ladislav Hagara | Komentářů: 30
10.10. 18:11 | Komunita

Microsoft se připojil k organizaci Open Invention Network, zkráceně OIN, založené v roce 2005 za účelem vytvoření a správy portfolia patentů, jeho sdílení a použití v patentových sporech k ochraně Linuxu a open source softwaru. Portfolio patentů se tím rozšířilo o více než 60 000 patentů.

Ladislav Hagara | Komentářů: 8
10.10. 15:25 | Zajímavý článek

Vědci z Národního ústavu duševního zdraví (NÚDZ) v Klecanech experimentálně zjistili (publikace v BioMed Research International), že používání GPS navigace v chytrých brýlích mění strukturu mozku. U testované skupiny došlo už po třech měsících ke snížení počtu spojení mezi hipokampem a ostatními částmi mozku.

Blaazen | Komentářů: 13
10.10. 08:55 | Komunita

Diskusi vyvolala stránka Flatpak - bezpečnostní noční můra (flatkill.org) popisující bezpečnostní problémy technologie Flatpak [reddit, Hacker News].

Ladislav Hagara | Komentářů: 72
9.10. 23:55 | Nová verze

V Orlandu probíhá konference AstriCon 2018 věnovaná Asterisku (Wikipedie), tj. svobodné softwarové implementaci telefonní ústředny (PBX). Při té příležitosti byla vydána nová verze 16 Asterisku a nová verze 15 webového rozhraní k Asterisku FreePBX. Dění na konferenci lze sledovat na Twitteru.

Ladislav Hagara | Komentářů: 0
9.10. 19:00 | Zajímavý článek

Dle příspěvku Jupyter, Mathematica a budoucnost vědeckých článků na svém blogu používá Paul Romer, držitel Nobelovy ceny za ekonomii, Jupyter a Python.

Ladislav Hagara | Komentářů: 8
Přispíváte osobně k vývoji svobodného softwaru?
 (40%)
 (40%)
 (23%)
 (21%)
 (10%)
 (36%)
Celkem 196 hlasů
 Komentářů: 6, poslední dnes 02:46
Rozcestník

Dotaz: Ulozit 2x INT v poli char

15.11.2017 15:48 darren97 | skóre: 2
Ulozit 2x INT v poli char
Přečteno: 787×
Ahojte, potreboval by som radu, ako ulozit int do pola typu char. Napr. mam slovo "ahoj", ale v poli by som potreboval: 15s2ahoj ...cislo sizeof(int) potom jeden char -> cize 1 bajt potom zase cislo sizeof(int) a potom to slovo. Zaroven to tam dat a vediet cisla aj potom vybrat a dat to do premennej typu int. Pozicie tych cisel a pismenka medzi nimi budu vzdy na pevno od zaciatku pola a az potom bude nasledovat text co tam dam. Viete niekto ako na to?

Řešení dotazu:


Odpovědi

15.11.2017 16:36 DarkKnight | skóre: 26
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
sprintf?
Řešení 1× (darren97 (tazatel))
kozzi avatar 15.11.2017 18:09 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

to asi neni to co chce, sice podle zadani by to tak i vypadalo ale neco mi rika ze to chce na urovni pameti, takze proste chce mit napriklad pole 20 charu, kde prvniu 4chary bude ten int, pak nejakej jeden char(znak), pak zase 4*char pro int a pak zbytech znaku retezce.

Ja bych to tam nakopiroval pomoci memcopy, nebo primo.


struct __attribute__((__packed__)) RetezecPrefix {
    int cislo1;
    char znak;
    int cislo2;
};

int main(int argc, char **argv)
{
    // zpusob 1
    int cislo1 = 15;
    int cislo2 = 2;
    char znak = 's';
    char* cislo1c = (char*)&cislo1;
    char* cislo2c = (char*)&cislo2;
    char* ahoj = "ahoj";
    char* vysledne_pole = (char*)malloc((strlen(ahoj) + 1) + (2*sizeof(int)));
    memcpy(vysledne_pole, cislo1c, sizeof(int));
    vysledne_pole = vysledne_pole + sizeof(int);
    memcpy(vysledne_pole, &znak, 1); // vysledne_pole[0] = znak;
    vysledne_pole = vysledne_pole + sizeof(char);
    memcpy(vysledne_pole, cislo2c, sizeof(int));
    vysledne_pole = vysledne_pole + sizeof(int);
    memcpy(vysledne_pole, ahoj, strlen(ahoj));

    // zpusob2
    struct RetezecPrefix rp = {15,'s',2};
    char* vysledne_pole2 = (char*)malloc(strlen(ahoj) + sizeof(struct RetezecPrefix));
    memcpy(vysledne_pole2, &rp, sizeof(struct RetezecPrefix));
    vysledne_pole2 = vysledne_pole2 + sizeof(struct RetezecPrefix);
    memcpy(vysledne_pole2, ahoj, strlen(ahoj));


	return 0;
}
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
16.11.2017 10:03 R
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
To je humus...zakladne nepochopenie zmyslu struct.
#include <string.h>

struct my_data {
        int cislo1;
        char znak;
        int cislo2;
        char text[];
} __attribute__((__packed__));

int main(void) {
        char pole[256];
        struct my_data *data = (void *)pole;

        data->cislo1 = 15;
        data->znak = 's';
        data->cislo2 = 2;
        strcpy(data->text, "nejaky text"); // pozor na buffer overflow

        return 0;
}
16.11.2017 14:33 Andrej | skóre: 45 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

Obojí výše uvedené je humus. Základní nepochopení smyslu union.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
16.11.2017 07:51 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
union intydzr
{
    int i;
    char c[sizeof(int)];
};
Ale pozor na '\0'.
Pochybnost, nejistota - základ poznání
16.11.2017 07:54 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Jo a pozor na endianitu, pokud to má být přenosné.
Pochybnost, nejistota - základ poznání
16.11.2017 10:34 darren97 | skóre: 2
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Diky za navrhy, mam to skoro hotove :)
16.11.2017 18:01 Andrej | skóre: 45 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

Tak já půjdu naschvál špatným příkladem, aneb prasárny s pointery a makry. Takhle se to dá třeba zařídit v čistém C, pokud nechceš používat nestandardní __packed__ kdesicosi.

Jestli to má být portovatelné, pak by bylo dobré do toho pole místo obyčejných integerů přiřazovat htobe32(nějaký_integer) a číst je odtud pomocí be32toh(integer_z_pole). Tohle je popsané v man 3 endian.

#include <stdio.h>

#define ARRAY_TYPE(tail_size, type_name) \
  typedef char type_name[2 * sizeof(int) + sizeof(char) + tail_size]
#define first_int(array) (*(int*)array)
#define middle_char(array) (array[sizeof(int)])
#define second_int(array) (*(int*)(array + sizeof(int) + sizeof(char)))
#define tail_string(array) (array + 2 * sizeof(int) + sizeof(char))

#define TAIL_STRING "ahoj"
static const char *const TAIL = TAIL_STRING;
static const size_t TAIL_SIZE = sizeof(TAIL_STRING) - 1;

int main() {
  ARRAY_TYPE(TAIL_SIZE, Array);
  Array array;

  first_int(array) = 15;
  middle_char(array) = 's';
  second_int(array) = 2;
  for (const char *t = TAIL; *t; ++t)
    tail_string(array)[t - TAIL] = *t;

  printf("First int: %d\n"
         "Middle char: %c\n"
         "Second int: %d\n"
         "Tail string: ",
         first_int(array), middle_char(array), second_int(array));
  for (size_t i = 0; i < TAIL_SIZE; ++i)
    putchar(tail_string(array)[i]);
  putchar('\n');

  return 0;
}
ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
16.11.2017 18:46 Kit | skóre: 42 | Brno
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Nádherná ukázka, jakým zvěrstvem se dá nahradit jednořádková funkce sprintf().
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
16.11.2017 19:08 kverulant
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Tak buď jste nepochopil tu ukázku, funkci sprintf(), nebo obojí.
16.11.2017 20:31 Andrej | skóre: 45 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

Tak prosím, ten jednořádkový ekvivalent mé ukázky by mě opravdu zajímal. :-D Kdepak je?

Mimochodem, odkdy sprintf() píše integery binárně po bytech? Že jsem si toho nějak nevšiml. Nesnažíš se doufám naznačit, že hrůza typu sprintf(string + sizeof(int) + sizeof(char), "%c%c%c%c", ((char*)&integer)[0], ((char*)&integer)[1], ...) by byla lepší…?

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
16.11.2017 22:17 Kit | skóre: 42 | Brno
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
sprintf(str, "%d%c%d%s", cislo1, znak, cislo2, "ahoj");
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
16.11.2017 22:36 Andrej | skóre: 45 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

:-D Uf. To má být vtip? Vždyť to nedělá ani náhodou totéž co moje ukázka. Ptal jsem se na jednořádkový ekvivalent mé ukázky, nikoliv na něco náhodného jiného.

Pravda, zadání je trochu nepřesné (hlavně kvůli tomu podivně zřetězenému příkladu). Já jsem zadání pochopil tak, že integer má být v tom poli binárně jako 4 byty — výslovně je tam zmínka o sizeof(int) —, nikoliv jako desítková textová reprezentace. String "2" nebo "15" opravdu nemá velikost sizeof(int).

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
16.11.2017 23:03 Kit | skóre: 42 | Brno
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Copak mohu tušit, co dělá tvá ukázka? Odpovídám na původní dotaz. Vypusť si ze zadání nesmyslné sizeof() a máš to.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
16.11.2017 23:17 Andrej | skóre: 45 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

Moje ukázka ze zadání nic nevypouští. V tom je celá pointa. Prostě se snažím zadání interpretovat tak, aby v té interpretaci bylo co nejméně rozporů. Zadání se neptá, „jak zřetězit pár stringů“, ale mluví v podstatě o nějaké packed reprezentaci dat s fixní velikostí (sizeof(int) atd.). Přesně tu moje ukázka vytváří.

Navíc zadání říká, že data se z toho pole mají dát získat zpátky. Tohle tvé řešení taky nesplňuje, například když zvolím ten char '3' a závěrečný string "1234".

Jo, taky by se mi líbilo řešit věci tak, že půlku zadání vypustím a druhou půlku upravím — to by bylo fajn! :-D

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
16.11.2017 23:40 Kit | skóre: 42 | Brno
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Aspoň má darren97 z čeho vybírat.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
17.11.2017 20:59 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Odpovídám na původní dotaz.

Neodpovídáte.

17.11.2017 21:02 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Jestli to má být portovatelné, pak by bylo dobré do toho pole místo obyčejných integerů přiřazovat htobe32(nějaký_integer) a číst je odtud pomocí be32toh(integer_z_pole).

htonl(), ntohl() :-) Ale pak by ten protokol/formát nejspíš měl ta čísla na 32 bitů zarovnaná.

17.11.2017 23:56 Andrej | skóre: 45 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

Tahle archaická sada funkcí/maker (většinou) nemá 64-bitové ekvivalenty, proto bych ji příliš nedoporučoval. Vůbec je smutné, že hton{l,s}()/ntoh{l,s}() jsou standardní POSIX, zatímco to, co jsem doporučoval, vůbec není standardizované. Ale aspoň to má 64-bitovou verzi a nesnaží se to jedno z možných pořadí bytů nazývat záhadně "network".

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
18.11.2017 00:49 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
Na tom označení není vůbec nic záhadného. Právě proto, že kdysi dávno padla u základních protokolů rodiny TCP/IP volba na big endian, má smysl ho pro síťovou komunikaci používat i dnes, přestože naprostá většina komunikujících systémů už je dnes little endian. I když je to technicky totéž, tím že mu budu říkat NBO místo BE, dávám najevo, že ho používám právě z těchto důvodů, ne proto, že jsem si (např.) hodil korunou.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.