Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 20 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok NapísalOffline : 24.03.2016 23:12

Ahoj da sa v Cecku pred kompilaciou zistit aky je naozajstny pocet argumentov? v argc je t len pocet argumentov zadanych pri spusteni +1 pricom 0.ty je cesta s akou sa programspustil.
Niekedy vsak shell ulozi do dalsich argumentov udaje o systems a podobne da sa to zistit pred kompilaciou ci si programator moze dovolit argv[argc] a viac bez segmentation fault resp. crash?







_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 24.03.2016 23:27

Shell nikdy nič do argv neukladá a v argc je počet platných elementov (tie údaje tam dáva štandardná knižnica a tá sa postará o to, aby boli tie údaje správne).

Technicky je posledný parameter argv[argc-1] (pretože sa čísluje od 0), každopádne dá sa použiť aj argv[argc] bez toho, aby program spadol (pretože to pole obsahuje o jeden prvok viac a ten je vždy NULL).

PS: A pri kompilácii ani pred ňou sa počet parametrov zistiť nedá (pretože to má zmysel len pri spustenom programe).


Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok Napísal autor témyOffline : 24.03.2016 23:36

Tak neviem ci shell ci kernel ci terminal ci priamo kompilator,ale nieco to tam v linuxoch uklada skus v debian-like spustit program bez parametrov ktory vypisuje parametre v cykle na debiane vo virtualboxe to spadlo az pri indexe 40 pricom null sa striedalo s NAZOV=hodnota







_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 25.03.2016 0:26

To, že ti to spadne až na 40. prvku je náhoda, nie zámer. To pole je proste veľké presne argc položiek (+null). Všetko za je bordel v pamäti.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok Napísal autor témyOffline : 25.03.2016 10:20

tak asi to pridáva aj terminál, lebo zmenil som xterm či ako sa to volá čo je v xfce za terminator a začalo to padať až na indexe 44 a nekompiloval som znovu, ale keď som to pustil znovu na tom istom terminály tak bol ten istý výstup iba keď som zmenil priečinok cez cd tak pribudol jeden argument OLDPWD=starypwd







_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 25.03.2016 10:33

To tvrdíš, že v argc si mal 44 alebo dokonca väčšie číslo?


Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok Napísal autor témyOffline : 25.03.2016 10:42

nie v argc bolo 1 ako treba,ale v argv boli aj iné veci ako cesta ku programu
Kód:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
for(int i=0;i==i;i++){
printf("%d. argument je : %s\n", argc+i, argv[argc+i]);
}
return 0;
}       


tento kód spadne až pri i>40







_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 25.03.2016 11:01

Ten kód náhodou spadne až pri i>40. U mňa na Windows to spadne už na 1. A keď to spustíš na inom stroji, nemusí to spadnúť vôbec.

Ešte raz: Pole je veľké argc prvkov. Všetko ďalej je bordel v pamäti.
Urob toto
Kód:
 char * a = (char *)malloc(1);

a urob rovnaký cyklus. A sleduj.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok Napísal autor témyOffline : 25.03.2016 11:11

ja viem, že to vo windows spadne hneď preto som sa pýtal či sa to kódom nedá zistiť pred kompiláciou
teda či je aspoň teoreticky možné spraviť funkciu SF
Kód:
int (SF(int i,int j,char **argv)){
return (argv[i][j]sposobi segfault);
}

samozrejme bez sposobenia segfault







_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 25.03.2016 11:16

Tu máš takú funkciu:
Kód:
int SF( argv, argc, i ) {
   return i > argc;
}


To, že ti to nespadne neznamená, že je to volanie správne, ale - ešte raz zdôrazňujem - že je to NÁHODA.
Volať prvok za hranicou pola je vždy zle.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 25.03.2016 11:17

Nie, zistiť sa to nedá. Ak chceš, aby program padol, stačí, ak budeš čítať z adresy 0 a ak nechceš, aby spadol, čítaj len toľko položiek, koľko ich v argv je.


Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok Napísal autor témyOffline : 25.03.2016 11:44

BX píše:
Ten kód náhodou spadne až pri i>40. U mňa na Windows to spadne už na 1. A keď to spustíš na inom stroji, nemusí to spadnúť vôbec.

Ešte raz: Pole je veľké argc prvkov. Všetko ďalej je bordel v pamäti.
Urob toto
Kód:
 char * a = (char *)malloc(1);

a urob rovnaký cyklus. A sleduj.

díky dokonca to spadlo až na i=135152







_________________
Math is the best!
Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0
Príspevok NapísalOffline : 26.03.2016 6:54

jarrro píše:
tak asi to pridáva aj terminál...

Argumenty se předávají pomocí zásobníku, takže to co prohrabáváš jsou záznamy předchozí činnosti, které budou ještě potřeba. Po spuštění programu totiž proběhne řada kroků, které pro něj připravují prostředí, a teprve potom se zavolá funkce main(). Pokud tam zkusíš něco změnit a půjde to, můžeš shodit nejenom svůj program, ale s trochou štěstí (nebo smůly) i systém.
Při ukončení program po sobě zase uklidí, pomocí těch údajů na zásobníku, to jsou věci které se dělají automaticky a programátor se o ně nemusí vůbec starat, maximálně tam pomocí atexit() něco přidá.







_________________
"Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson)
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 26.03.2016 10:14

Funkcia main môže mať, na niektorých systémoch, aj tvar main(int argc, char **argv, char **envp), a štandardná knižnica dá do envp premenné prostredia. Pri niektorých implementáciách štandardnej knižnice sa môže stať, že tie premenné sú uložené hneď za argv (ale môžu byť uložené aj úplne inde).


Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 14.03.11
Prihlásený: 02.08.23
Príspevky: 814
Témy: 23
Bydlisko: Bratislava
Príspevok NapísalOffline : 19.04.2016 10:57

jarrro píše:
nie v argc bolo 1 ako treba,ale v argv boli aj iné veci ako cesta ku programu
Kód:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
for(int i=0;i==i;i++){
printf("%d. argument je : %s\n", argc+i, argv[argc+i]);
}
return 0;
}       


tento kód spadne až pri i>40


for(int i=0;i==i;i++){

Čo má robiť i==i ?
Ako sa to dostane na 40? Podľa mňa to skončí hneď (sory, bol som dlho PN a ešte mi asi hlava nefunguje).


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.08.11
Prihlásený: 14.12.23
Príspevky: 2361
Témy: 11
Príspevok NapísalOffline : 19.04.2016 15:17

i==i plati vzdy, takze to moze len zhodit OS, ked budes strkat prsty do pamate, co nie je tvoja.
//to som ale Captain Obvious


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 19.04.2016 19:36

Zhodiť OS v dnešnej dobe takýmto cyklom? To musíš púšťať na poriadne starom systéme.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.08.11
Prihlásený: 14.12.23
Príspevky: 2361
Témy: 11
Príspevok NapísalOffline : 19.04.2016 19:37

Nie, nie, zle som to napisal. OS zhodi program. Nie program OS.


Offline

Užívateľ
Užívateľ
zistenie naozajstneho poctu argumentov v C

Registrovaný: 02.12.06
Prihlásený: 23.03.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok Napísal autor témyOffline : 19.04.2016 21:11

marian_r píše:
jarrro píše:
nie v argc bolo 1 ako treba,ale v argv boli aj iné veci ako cesta ku programu
Kód:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
for(int i=0;i==i;i++){
printf("%d. argument je : %s\n", argc+i, argv[argc+i]);
}
return 0;
}       


tento kód spadne až pri i>40


for(int i=0;i==i;i++){

Čo má robiť i==i ?
Ako sa to dostane na 40? Podľa mňa to skončí hneď (sory, bol som dlho PN a ešte mi asi hlava nefunguje).

je to len nekonečný for cyklus aby som mal riadiacu premennú to isté by spravilo
Kód:
int i=0;
while(1){
printf("%d. argument je : %s\n", argc+i, argv[argc+i]);
i++;
}

každopádne je to (snáď) vyriešené
pri vysokých indexoch nepristupujem do argv ale do pamäte za ním, kde sa v niektorých prípadoch nachádzajú zmysluplné informácie, v niektorých nič a v niektorých informácie potrebné pre chod iných programov OS a vtedy to spadne
je to tak?







_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 20.04.2016 8:59

Nie, do pamäte iných programov tvoj program nevidí a nemá šancu do nich sahať (teda nie takýmto spôsobom)
https://cs.wikipedia.org/wiki/Virtu%C3%A1ln%C3%AD_pam%C4%9B%C5%A5
Program ti spadne na segfault
https://cs.wikipedia.org/wiki/Poru%C5%A1en%C3%AD_ochrany_pam%C4%9Bti

Ale som chcel ešte k tomu cyklu - veľmi obľúbený je aj nekonečný cyklus
Kód:
for(;;) { ... }

Potom môžeš urobiť niečo ako (joke)
Kód:
#define ever ;;
for(ever) { ... }

Ale v reálnych programoch neodporúčam :)







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Odpovedať na tému [ Príspevkov: 20 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. zistenie počtu v array

v PHP, ASP

3

494

27.04.2009 14:23

johny694 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zistenie poctu id-ciek

v PHP, ASP

5

554

29.09.2008 17:19

Roko Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Mysql zistenie počtu rôznych záznamov

v Databázy

4

782

28.12.2008 16:40

Unlink Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zistenie poctu uzivatelov na webe

v PHP, ASP

20

1139

18.07.2008 18:15

dulius Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nastavenie poctu riadkov a poctu znakov vo Word 2007

v Ostatné programy

0

2155

26.07.2009 17:57

fista1 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vypis argumentov - Csh - UNIX

v Assembler, C, C++, Pascal, Java

0

645

07.10.2007 16:32

SAmo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. podla poctu vytvorit

v PHP, ASP

9

511

25.11.2008 16:34

Blackshadow Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. resynchronizacia poctu prispevkov

v Ostatné

0

831

16.08.2007 10:34

Ďuri Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zmenšovanie počtu premapovaných sektorov

v Pevné disky a radiče

2

692

18.10.2013 20:14

hanesovic Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vypis poctu z MySQL

v PHP, ASP

11

643

30.01.2009 12:39

jtomcik Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Overenie min. poctu suborov

v PHP, ASP

4

446

29.03.2009 15:45

zaciatocnik Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nastavenie počtu prístupov na Apache

v Webhosting a servery

11

720

13.06.2009 12:04

Pablo Montero Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Obmedzenie poctu kopii na tlaciarni

v Externé zariadenia

8

598

17.04.2018 9:00

unset(array[0]) Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Script na ratanie poctu downloadov?

v PHP, ASP

2

1199

03.08.2005 19:35

Pekaboo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Meranie počtu metrov v mobile

v Ostatné programy

5

800

06.03.2011 20:37

mato59 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Sledovanie poctu stiahnuti suboru na webe

v HTML, XHTML, XML, CSS

7

525

08.12.2012 18:10

capricorn7 Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra