Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - mikrom

Stran: [1] 2 3 ... 11
1
Vývoj / Re:Načtení 2D pole v C
« kdy: 23. 11. 2022, 12:44:37 »
..
Dik za vsetky postrehy a hinty.
To ze v tom mojom zdrojaku je vsetko spolu nam*dane v mainu som pisal v predoslom komente, ze by to bolo treba rozbit do funkcii, ale nakolko tazatel nedava feedback nedavalo mi to zmysel.
Ze ma C standardnu funkciu getline() som doteraz vobec nevedel, asi to bude nejaka novinka o ktorej neviem, lebo C nepouzivam. Urcite tu funkciu vyskusam.

VELKE DIK za prilozeny kod. Videt ze si si s tim dal hodne namahy. Este som ho neskusal, ale na prvy pohlad vyzera ze to je skor advanced level ako pre zaciatocnika. Vyskusam si ho a prestudujem.

2
Vývoj / Re:Načtení 2D pole v C
« kdy: 23. 11. 2022, 03:45:08 »
Ahoj, pár postřehů z rychlíku

1) Když deklaruješ proměnnou, tak ji co nejdříve také inicializuj a nečekej na chvíli, kdy ji budeš chtít použít. Velmi lehce se na to zapomíná a následky mohou být neblahé. Obzvláště to platí pro pointery!
2) Pokud nejsi schopný zaručit, že ti funkce neselže, pak vždy kontroluj alespoň její návratovou hodnotu, pokud něco vrací. V tomto případě se to týká funkce fopen( ), protože v případě, že se něco provede se souborem, který má otevřít (bude smazán, přejmenován, atd...) koleduješ si - v lepším případě - o segfault o pár řádku níže.

já chápu, že toto je studijní kód začátečníka. Přesto z vlastní zkušenosti považuji za důležité na to upozornit. Důsledky podobných opomenutí se v rozsáhlejším a komplexnějším kódu velmi špatně hledají. A nestačí o tom jen vědět, je potřeba si to vštípit do krve hned od začátku. Věř mi, že ti to hodně časem ulehčí život.

3) Proměnná i je zbytečná. Jenom ji inkrementuješ a a pak přiřadíš do max_i. Popřemýšlej, zda není lepší pracovat rovnou s max_i a i zrušit.
4) Navrhuji ti, abys přesunul podmínku max_j < j až za vnitřní cyklus. To proto, že V současné chvíli testuješ max_j proti všem pozicím elementů v řádku a to v každém cyklu opakovaně. Ale já bych řekl, tebe určitě zajímá, zda max_j neni náhodou menší než celkový počet elementů v řádku. A to budeš vědět až cyklus skončí.   

Tyhle nedostatky přímo funkčnost neovlivní, ale jednak znamenají plýtváním zdrojů mašiny (časem procesoru a pamětí) a jednak hrubě znesnadní čtení kódu v případě rozsáhlejšího souboru. No jen si představ jak by se to četlo, když by jsi měl těch vnořených cyklů několik a byly o něco delší.

5) Pokud vyloženě není tvým záměrem zjišťovat, kolik řádků a kolik elementů v nich je ve vstupu navíc (alespoň v původním zadání o tom nic nebylo), tak já osobně bych z cyklu vyskočil, jakmile bych dosáhl MAX_COLS  nebo MAX_ROWS. Tím si kód zpřehledníš a zjednodušíš, a odpadnou ti ty korekce před výpisem pole.

AHOJ A DIKY ZA VYBORNE POSTREHY

2) navratovu hodnotu fpopen() som osetril
4) max_j < j som tiez dal az za vnutorny cyklus
5) kvoli kontrole bolo mojim zamerom vypisat aj kolko riadkov a stlpcov ma vstupny subor.

Normalne by som nedeklaroval vsetky premenne na zaciatku main(), ale pomocne premenne deklaroval az na mieste kde ich idem pouzit, napr.:  for (int i = 0; ...)
Dalej by som na jednotlive casti urobil samostatne funkcie, t.j.:
- funkciu ktora nacita nazov suboru z command line argumentu programu,
- funkciu ktora nacita data zo suboru do pola
- funkciu ktora vypise obsah pola

Dalo by sa na tom este dost popracovat, ale tazatel tu nedava k tomu ziadny feedback  :( takze to nema vyznam.

Pripajam zmeneny zdrojak

matica.c
Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ROWS 100
#define MAX_COLS 100
#define MAX_LINE_LENGTH 256

int main()
{
    FILE *fp;
    char file_name[MAX_LINE_LENGTH] = "matrix.dat";
    char data_line[MAX_LINE_LENGTH];
    char *matrix_element;
    int i, j, max_i, max_j;
    int matrix[MAX_ROWS][MAX_COLS] = { 0 };

    if (!(fp = fopen(file_name,"r"))) {
        printf("ERROR: file \"%s\" not found !\n", file_name);
        return 1;
    }

    printf("Reading data from the file \"%s\":\n\n", file_name);
    max_j = 0;
    i = 0;
    while (fgets(data_line, MAX_LINE_LENGTH, fp) != NULL) {
        // Remove trailing \n
        data_line[strcspn(data_line, "\n")] = 0;

        // split line into matrix elements
        matrix_element = strtok(data_line, ",;\t ");
        j = 0;
        while(matrix_element != NULL) {
            printf("%s ", matrix_element);
            // populate matrix
            if ((i < MAX_ROWS) && (j < MAX_COLS)) {
                matrix[i][j] = atoi(matrix_element);
            }
            j++;
            matrix_element = strtok(NULL, ",;\t ");
        }
        if (max_j < j) max_j = j;
        printf("\n");
        i++;
    }
    max_i = i;
    fclose(fp);

    printf("\n..Done.\n\n");

    printf("Data file contains %d rows and %d columns\n\n", max_i, max_j);

    // eventually, adapt maximum indexes to the size of the matrix
    if (max_i > MAX_ROWS) {
        printf("WARNING: due to the declared size, matrix can only store\n"
               "         %d rows of a total of %d rows from the file.\n\n",
               MAX_ROWS, max_i);
        max_i = MAX_ROWS;
    }
    if (max_j > MAX_COLS) {
        printf("WARNING: due to the declared size, matrix can only store\n"
               "         %d columns of a total of %d columns from the file.\n\n",
               MAX_COLS, max_j);
        max_j = MAX_COLS;
    }

    // now print the matrix
    printf("The matrix is:\n\n");
    for (i = 0; i < max_i; i++) {
        for (j = 0; j < max_j; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

3
Vývoj / Re:Načtení 2D pole v C
« kdy: 22. 11. 2022, 17:26:46 »
Tu je fix predosleho programu:

ocakam dalsie code review  ;)

matrix.c
Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ROWS 100
#define MAX_COLS 100
#define MAX_LINE_LENGTH 256

int main()
{
    FILE *fp;
    char data_line[MAX_LINE_LENGTH];
    char *matrix_element;
    int i, j, max_i, max_j;
    int matrix[MAX_ROWS][MAX_COLS] = { 0 };

    fp = fopen("matrix.dat","r");

    printf("Reading data from the file:\n\n");
    max_j = 0;
    i = 0;
    while (fgets(data_line, MAX_LINE_LENGTH, fp) != NULL) {
        // Remove trailing \n
        data_line[strcspn(data_line, "\n")] = 0;

        // split line into matrix elements
        matrix_element = strtok(data_line, ",;\t ");
        j = 0;
        while(matrix_element != NULL) {
            printf("%s ", matrix_element);
            // populate matrix
            if ((i < MAX_ROWS) && (j < MAX_COLS)) {
               matrix[i][j] = atoi(matrix_element);
            }
            j++;
            if (max_j < j) max_j = j;

            matrix_element = strtok(NULL, ",;\t ");
        }
        printf("\n");
        i++;
    }
    max_i = i;
    fclose(fp);
    printf("..Done.\n\n");
    printf("Datafile contains %d rows and %d columns\n\n", max_i, max_j);

    // eventually, adapt maximum indexes to the size of the matrix
    if (max_i > MAX_ROWS) {
        printf("WARNING: matrix contains only %d rows of %d data rows from the file\n",
               MAX_ROWS, max_i);
        max_i = MAX_ROWS;
    }
    if (max_j > MAX_COLS) {
        printf("WARNING: matrix contains only %d columns of %d data columns from the file\n",
               MAX_COLS, max_j);
        max_j = MAX_COLS;
    }

    // now print the matrix
    printf("\nThe matrix is:\n\n");
    for (i = 0; i < max_i; i++) {
        for (j = 0; j < max_j; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Malo by to spracovat aj zubatu maticu, ze chybajuce prvky budu nuly
Kód: [Vybrat]
1  2
5  6  7  8

4
Vývoj / Re:Načtení 2D pole v C
« kdy: 22. 11. 2022, 00:14:02 »
Otázka zní, zda vůbec používat funkci scanf() a zda by nebylo lepší udělat si vlastní konečný automat a načítat si ta čísla po znacích. Je to dost triviální.

...
Přesto mi nepřijde to řešení s konečným automatem v takovémto případě špatné - vyřeší celkem jednoduše řádkování atd. Znaménko, whitespace apod. jsou úplně v pohodě, ošetřit "správně" invalidní znak je triviální, poskládání integeru z dekadického zápisu je triviální. Řešit hexa číslo je zvláštní, že se int nevejde do mezí typu je sice možné, ale co na tom vyřeší scanf()? Co když někdo napíše do vstupu stočíslicovou hodnotu?

Ked to je pre teba take trivialne tak sem ukaz funkcny kod s tym konecnym automatom  8)

5
Vývoj / Re:Načtení 2D pole v C
« kdy: 22. 11. 2022, 00:05:05 »
...
na to stejne prijde postupem casu jak bude sam experimentovat.
presne tak, ak bude s tym experimentovat i tie "kritické bezpečnostní chyby" si najde a odstrani sam   

6
Vývoj / Re:Načtení 2D pole v C
« kdy: 21. 11. 2022, 19:30:42 »
To neni produkcny kod ale iba ukazka JAK NA TO.

To je spíš ukázka, JAK TO NEDĚLAT.
...
Toto su malicherne nedostatky, ktore sa daju lahko osetrit. Rozne ucebnice a navody su plne takychto prikladov. Cielom je aby bol priklad kratky a lahko zrozumitelny a to aj je.
Keby si mal nejaku sebareflexiu, tak by si namiesto kritiky radsej postol vlastny funkcny kod, co sa ale nestalo.

7
Vývoj / Re:Načtení 2D pole v C
« kdy: 21. 11. 2022, 19:00:19 »
No... stačí tam poslat více jak MAX_ROWS řádků a máme ukázkový buffer overflow na stacku s (remote) code execution.  CVSS score 10/10 ;).
To neni produkcny kod ale iba ukazka JAK NA TO.
Vyhnut sa problemu o ktorom hovoris sa da roznymi sposobmi - napriklad:
- Osetrit podmienkou aby sa do matice nacitalo len tolko riadkov kolko riadkov ma subor.
- Najprv nacitat subor 1. krat, pritom zistit pocet riadkov (pripadne aj stlpcov), nasledne alokovat maticu danej velkosti, potom urobit rewind a nacitat subor 2. krat  do matice.

8
Vývoj / Re:Alternativa za Excel Visual Basic?
« kdy: 21. 11. 2022, 17:15:42 »
...
Cize jedina pouzitelna nahrada je bud pouzit excel, alebo pouzit nieco mimo excel co je ale zarucene nainstalovane na PC -> napr nieco co bezi nad .net frameworkom ...
...
ano z toho dovodu pouzivam este stale VBscript, zatial je vsade (neviem sice ci aj na W11)
Skusal som aj powershell, ale na programovanie mi to pripada horsie ako VBscript a hlavne tam byvaju komplikacie so spustenim: treba bypasovat ExecutionPolicy a teda ku skriptu prikladat aj prikaz ako ho spustit.

9
Vývoj / Re:Načtení 2D pole v C
« kdy: 21. 11. 2022, 16:45:28 »
Zatial je tu mnoho filozofickej diskusie, ale malo kodu, tak postnem ja - ako som uz vyssie spomenul, da sa to vyriesit so standardnymi C funkciami fgets() a strtok() napr. takto:

matrix.c
Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ROWS 100
#define MAX_COLS 100
#define MAX_LINE_LENGTH 256

int main()
{
    FILE *fp;
    char matrix_line[MAX_LINE_LENGTH];
    char *matrix_element;
    int i, j, max_i, max_j;
    int num_element;
    int matrix[MAX_ROWS][MAX_COLS];

    fp = fopen("matrix.dat","r");

    printf("Reading data from the file into the matrix:\n");
    i = 0;
    while (fgets(matrix_line, MAX_LINE_LENGTH, fp) != NULL) {
        // split line into matrix elements
        matrix_element = strtok(matrix_line, ",;\t ");
        j = 0;
        while(matrix_element != NULL) {
            // populate matrix
            matrix[i][j] = atoi(matrix_element);
            j++;
            matrix_element = strtok(NULL, ",;\t ");
        }
        i++;
    }
    max_i = i;
    max_j = j;
    fclose(fp);
    printf("..DONE.\n\n");

    // now print the matrix
    printf("The matrix is:\n");
    for (i = 0; i < max_i; i++) {
        for (j = 0; j < max_j; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Nacita zo suboru matica.dat takuto
Kód: [Vybrat]
1 2 3 4
5 6 7 8
alebo aj takuto maticu kde su prvky oddelene roznymi separatormi.
Kód: [Vybrat]
1; 2, 3 4
5 6; 7 8

Output:
Kód: [Vybrat]
$ gcc matrix.c -o matrix

$ matrix
Reading data from the file into the matrix:
..DONE.

The matrix is:
1       2       3       4
5       6       7       8

10
Vývoj / Re:Alternativa za Excel Visual Basic?
« kdy: 21. 11. 2022, 14:14:05 »
Pretoze Python v LO vyzaduje nakonfigurovat:
+1

ano, zistil som ze si musim minimalne doinstalovat este toto:
Kód: [Vybrat]
sudo apt install libreoffice-script-provider-python

11
Vývoj / Re:Alternativa za Excel Visual Basic?
« kdy: 21. 11. 2022, 12:49:58 »
Na VBA neni nic zle, je to jednoduchy jazyk a je k tomu mnozstvo informacii a volne dostupneho kodu.
Niekde som cital, ze v LibreOffice Calcu sa da pouzivat na skriptovanie aj Python, ale ked som podla navodu hladal na mojom Linux PC, tak som tam taku moznost vobec nenasiel, ale len LibreOffice Basic.

12
Studium a uplatnění / Re:Doučování/konzultace jazyka C
« kdy: 20. 11. 2022, 18:46:10 »
Ahoj, hledám doučování/konzultace jakyka C. Progooglil jsem net a našel buď staré inzeráty, nebo šílenosti typu 1500kč/h. Jde mi o dovysvětlení některých věcí, popřípadě (pookud to bude možné) kontrolu kódu, který mi občas nefunguje. Vše v oblasti sš/vš úloh a příkladů... 

Poradíte někdo kde hledat?

díky
Ked sa chces naucit programovat musis nad tym stravit mnozstvo casu, bez toho to jednoducho nejde.
Jedna zo zakladnych dovednosti programatora je naucit sa kod debugovat, tak zistis preco ti to nefunguje. Naco by si za to hned platil velke sumy, ked pomoc mozes mat aj bezplatne. Prihlas sa do nejakeho programatorskeho fora a postuj tam svoje problemy a urcite sa niekto najde kto ti pomoze. Ked budes postovat sem https://www.tek-tips.com/threadminder.cfm?pid=205 pomozem ti aj ja :)
Ak chces naozaj sukromne doucovanie, daj sem emailovy kontakt.

13
Vývoj / Re:Načtení 2D pole v C
« kdy: 20. 11. 2022, 17:34:38 »
@Pejtl6:
Mozes pouzit takyto postup: Textovy subor s datami otvoris s fopen() a zavries s fclose()
Subor budes citat v cykle po riadkoch za pouzitia funkcie fgets(). Pritom cisla z kazdeho riadku rozparsujes funkciou strtok() a ulozis ich do 2D pola.
Ak si s tym nebudes vediet poradit postni svoj dotaz sem https://www.tek-tips.com/threadminder.cfm?pid=205 a ja tam postnem funkcny kod



   

14
Ja sice komplikovanejsie stavove diagramy moc neuznavam, lebo vacsinou tam autor nieco zabudne zakreslit a potom cely ten diagram stoji za h***o, ale taketo diagramy umoznuje kreslit LaTeX package TikZ - vid napr.: https://texample.net/tikz/examples/tcp-state-machine/

15
Hardware / Re:Viete mi pomôcť s nacenením PC zostavy?
« kdy: 29. 10. 2022, 22:06:58 »
PC je az moc nadupane. Ked uz niekto zaplati za takuto konfiguraciu tolko penazi (tipujem minimalne 2500-3000 EUR), tak predavat sa to neoplati, pretoze predat sa to bude dat len za cenu velmi velkej straty.
 

Stran: [1] 2 3 ... 11