C-čko a zápis mimo proměnnou

robotron

Re:C-čko a zápis mimo proměnnou
« Odpověď #15 kdy: 31. 10. 2017, 20:32:26 »
Co to je za blbost? :D Pokud tvrdíš, že vstupniSoubor se nebude měnit

No já ten řetězec modifikoval (strcp), tím vznikl přesah a proto se měnil při změnách pole...

To by nevadilo, ze jsi lama. Ale vadi, ze v dotazu pises vyrazne jinej kod, nez kterej zpusobuje chybu a jeste zamerne tvrdis opak, nez delas (ze se nebude menit). Takhle se s cennym casem lidi jako Jenda nebo Tisnik nepracuje.


MaLaMuT

Re:C-čko a zápis mimo proměnnou
« Odpověď #16 kdy: 31. 10. 2017, 20:38:13 »
No já to nechtěl na sebe prášit, ale udělal jsem tuhle chybu a nevšiml si toho.

char vstupniSoubor[] ="in.tx";
strcat(vstupniSoubor, argv[1]);

To způsobilo, že se ty dvě proměnné překryly.
Taková blbá chyba no  ::)

Njn. C# není Cčko, musím víc přemýšlet a míň prasit.
Díky za objasnění.

hu

Re:C-čko a zápis mimo proměnnou
« Odpověď #17 kdy: 31. 10. 2017, 20:43:32 »
No já to nechtěl na sebe prášit, ale udělal jsem tuhle chybu a nevšiml si toho.

char vstupniSoubor[] ="in.tx";
strcat(vstupniSoubor, argv[1]);

To způsobilo, že se ty dvě proměnné překryly.
Taková blbá chyba no  ::)

Njn. C# není Cčko, musím víc přemýšlet a míň prasit.
Díky za objasnění.

Šiš. Vždyť je to úplně něco jinýho.

MaLaMuT

Re:C-čko a zápis mimo proměnnou
« Odpověď #18 kdy: 31. 10. 2017, 20:43:51 »
ze v dotazu pises vyrazne jinej kod

A jednak to bylo v úplně jiné části, než kde jsem tu chybu hledal.
Myslel jsem, že ta chyba vzniká v kódu, který modifikuje to první pole.
Tam jsem tu chybu celou dobu honil.
Nenapadlo mě, že jsem si jí vyrobil o sto řádků předtím.

Můj čas je také drahý, lidem radím s jinými problémy, takže to dobro posílám dál.
Ale jinak Jendo díky a Robertotrone:

MaLaMuT

Re:C-čko a zápis mimo proměnnou
« Odpověď #19 kdy: 31. 10. 2017, 20:45:16 »
Šiš. Vždyť je to úplně něco jinýho.

Je, ale je to o sto řádků výš.
Chyba se neprojevila, dokud jsem nezačal manipulovat s prvky toho druhého pole.
Chybně jsem identifikoval zdroj problému.
Jenda mě nakop  ;)


calixaren

Re:C-čko a zápis mimo proměnnou
« Odpověď #20 kdy: 31. 10. 2017, 21:04:43 »
Je to proste, char vstupniSoubor[] ="in.tx" je ekvivalentni char vstupniSoubor[5] ={'i', 'n', '.', 't', 'x'}; , tedy bez koncoveho '\0'.
Pro konstantni string je nejjednodusi char *vstupniSoubor="in.tx" (jak jsem psal vyse), resp. pro promeny string bud char vstupniSoubor[] ="in.tx\0", nebo char vstupniSoubor[6] ="in.tx\0", fungovat by melo i vstupniSoubor[6] ="in.tx".

tisnik

Re:C-čko a zápis mimo proměnnou
« Odpověď #21 kdy: 31. 10. 2017, 21:15:28 »
Je to proste, char vstupniSoubor[] ="in.tx" je ekvivalentni char vstupniSoubor[5] ={'i', 'n', '.', 't', 'x'}; , tedy bez koncoveho '\0'.
Pro konstantni string je nejjednodusi char *vstupniSoubor="in.tx" (jak jsem psal vyse), resp. pro promeny string bud char vstupniSoubor[] ="in.tx\0", nebo char vstupniSoubor[6] ="in.tx\0", fungovat by melo i vstupniSoubor[6] ="in.tx".

nee prosím - http://www.tutorialspoint.com/cprogramming/c_strings.htm

cituji "Actually, you do not place the null character at the end of a string constant. The C compiler automatically places the '\0' at the end of the string when it initializes the array."

calixaren

Re:C-čko a zápis mimo proměnnou
« Odpověď #22 kdy: 31. 10. 2017, 21:25:33 »

nee prosím - http://www.tutorialspoint.com/cprogramming/c_strings.htm

cituji "Actually, you do not place the null character at the end of a string constant. The C compiler automatically places the '\0' at the end of the string when it initializes the array."

Nemam tu knihu momentalne k disposici ale jestli si to pamatuji spravne, tak "Herout, Ucebnice jazyka C" uvadi to, co jsem psal ja...

ByCzech

  • *****
  • 1 870
    • Zobrazit profil
    • E-mail
Re:C-čko a zápis mimo proměnnou
« Odpověď #23 kdy: 31. 10. 2017, 21:27:22 »
Je to proste, char vstupniSoubor[] ="in.tx" je ekvivalentni char vstupniSoubor[5] ={'i', 'n', '.', 't', 'x'}; , tedy bez koncoveho '\0'.
Pro konstantni string je nejjednodusi char *vstupniSoubor="in.tx" (jak jsem psal vyse), resp. pro promeny string bud char vstupniSoubor[] ="in.tx\0", nebo char vstupniSoubor[6] ="in.tx\0", fungovat by melo i vstupniSoubor[6] ="in.tx".

Nikoli!

Kód: [Vybrat]
char s[] = "in.tx";
je ekvivalentem

Kód: [Vybrat]
char s[6] = {'i', 'n', '.', 't', 'x', '\0'};
a

Kód: [Vybrat]
char *s = "in.tx";
je ekvivalentem

Kód: [Vybrat]
char __unnamed[] = "in.tx";
char *s = __unnamed;

« Poslední změna: 31. 10. 2017, 21:35:54 od ByCzech »

Re:C-čko a zápis mimo proměnnou
« Odpověď #24 kdy: 31. 10. 2017, 21:28:00 »
Lidi naučte se C++ a přestanete řešit voloviny

Kit

Re:C-čko a zápis mimo proměnnou
« Odpověď #25 kdy: 31. 10. 2017, 21:32:36 »
Njn. C# není Cčko, musím víc přemýšlet a míň prasit.

Ve srovnání s C# je programování v C jako procházka minovým polem. Občas pomohou přepínače, které bohužel nebývají defaultně zapnuty kvůli zpětné kompatibilitě.

tisnik

Re:C-čko a zápis mimo proměnnou
« Odpověď #26 kdy: 31. 10. 2017, 21:46:49 »

nee prosím - http://www.tutorialspoint.com/cprogramming/c_strings.htm

cituji "Actually, you do not place the null character at the end of a string constant. The C compiler automatically places the '\0' at the end of the string when it initializes the array."

Nemam tu knihu momentalne k disposici ale jestli si to pamatuji spravne, tak "Herout, Ucebnice jazyka C" uvadi to, co jsem psal ja...

Na rozdíl od Zemana si nic přesně nepamatuju :-), tak jsem "Herouta" zkoukl a je to na straně 196, poznámka vlevo nahoře (třetí upravené vydání, v dalších  vydáních to možná bude o kousek dál).

Kiwi

Re:C-čko a zápis mimo proměnnou
« Odpověď #27 kdy: 31. 10. 2017, 21:58:37 »

nee prosím - http://www.tutorialspoint.com/cprogramming/c_strings.htm

cituji "Actually, you do not place the null character at the end of a string constant. The C compiler automatically places the '\0' at the end of the string when it initializes the array."

Nemam tu knihu momentalne k disposici ale jestli si to pamatuji spravne, tak "Herout, Ucebnice jazyka C" uvadi to, co jsem psal ja...
Spíš bych tipoval, že si to správně nepamatuješ. Takovou blbost by snad Herout nenapsal.

Lidi naučte se C++ a přestanete řešit voloviny
C je jednoduchý a s určitou praxí a cvikem příjemný nízkoúrovňový jazyk. Kdežto C++ je... raději no comment, nerad užívám sprostých slov. Ale když chce někdo objektově programovat, měl by použít objektový jazyk a ne C++.

Njn. C# není Cčko, musím víc přemýšlet a míň prasit.

Ve srovnání s C# je programování v C jako procházka minovým polem. Občas pomohou přepínače, které bohužel nebývají defaultně zapnuty kvůli zpětné kompatibilitě.
Je to jazyk z přelomu 60. a 70. let. Tenkrát se ještě nepočítalo s tím, že ho budou používat lidé mentálně předurčení spíše k manuálním činnostem, jak je tomu v IT dnes  ;)

Re:C-čko a zápis mimo proměnnou
« Odpověď #28 kdy: 31. 10. 2017, 23:23:46 »
Lidi naučte se C++ a přestanete řešit voloviny
C je jednoduchý a s určitou praxí a cvikem příjemný nízkoúrovňový jazyk. Kdežto C++ je... raději no comment, nerad užívám sprostých slov. Ale když chce někdo objektově programovat, měl by použít objektový jazyk a ne C++.

Nejde o objekty, ale třeba kdyby použil std::string, tak se vyhne většině bezpečnostních problémů a další drtivé většina běžných začátečnických problémů. Mimochodem, práce s řetězci je z pravidla příčinou různých chyb typu buffer overrun, což je i tenhle případ, jako demonstrace postačí.
« Poslední změna: 31. 10. 2017, 23:26:14 od Ondřej Novák »

MaLaMuT

Re:C-čko a zápis mimo proměnnou
« Odpověď #29 kdy: 31. 10. 2017, 23:38:08 »
Ve srovnání s C# je programování v C jako procházka minovým polem.

Přesně tak, běžně jedu v C# a jen některé věci jedu v čistém Cčku (výpočty).
Nepoužívám C++, protože na OOP mám C#

Kdežto C++
C++ je překonaný jazyk, byl překonán Javou a C#.
Multithreading v C++ je opruz, C# má poměrně velkou paletu nástrojů a to nejen pro tohle.

Z mého pohledu je kombinace C99 a C# 7 ideální.
Tady jsem udělal chybu, protože si hlídám čísla a přitom jsem si nepohlídal jednu hloupou proměnnou.