[ Príspevkov: 20 ] 
AutorSpráva
Offline

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

Registrovaný: 02.12.06
Prihlásený: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...

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 | 0

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ý: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...
Napísal autor témyOffline : 24.03.2016 23:36 | zistenie naozajstneho poctu argumentov v C

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 | 3

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ý: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...
Napísal autor témyOffline : 25.03.2016 10:20 | zistenie naozajstneho poctu argumentov v C

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 | 0

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ý: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...
Napísal autor témyOffline : 25.03.2016 10:42 | zistenie naozajstneho poctu argumentov v C

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 | 3
NapísalOffline : 25.03.2016 11:01 | zistenie naozajstneho poctu argumentov v C

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ý: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...
Napísal autor témyOffline : 25.03.2016 11:11 | zistenie naozajstneho poctu argumentov v C

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 | 3
NapísalOffline : 25.03.2016 11:16 | zistenie naozajstneho poctu argumentov v C

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 | 0

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ý: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...
Napísal autor témyOffline : 25.03.2016 11:44 | zistenie naozajstneho poctu argumentov v C

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 | 0

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 | 0

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ý: 11.02.26
Príspevky: 815
Témy: 23 | 23
Bydlisko: Bratislava

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 | 11

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 | 3
NapísalOffline : 19.04.2016 19:36 | zistenie naozajstneho poctu argumentov v C

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 | 11

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ý: 26.04.26
Príspevky: 691
Témy: 35 | 35
Bydlisko: Rimavská So...
Napísal autor témyOffline : 19.04.2016 21:11 | zistenie naozajstneho poctu argumentov v C

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 | 3

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!
 [ Príspevkov: 20 ] 


zistenie naozajstneho poctu argumentov v C



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 Backend

3

566

27.04.2009 14:23

johny694

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

zistenie poctu id-ciek

v Backend

5

619

29.09.2008 17:19

Roko

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

Mysql zistenie počtu rôznych záznamov

v Databázy

4

869

28.12.2008 16:40

Unlink

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

Zistenie poctu uzivatelov na webe

v Backend

20

1235

18.07.2008 18:15

dulius

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

2244

26.07.2009 17:57

fista1

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

Vypis argumentov - Csh - UNIX

v Backend

0

722

07.10.2007 16:32

SAmo

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

resynchronizacia poctu prispevkov

v Ostatné

0

911

16.08.2007 10:34

Ďuri

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

podla poctu vytvorit

v Backend

9

594

25.11.2008 16:34

Blackshadow

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

Vypis poctu z MySQL

v Backend

11

746

30.01.2009 12:39

jtomcik

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

Overenie min. poctu suborov

v Backend

4

520

29.03.2009 15:45

zaciatocnik

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

782

18.10.2013 20:14

hanesovic

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

Nastavenie počtu prístupov na Apache

v Hosting, servery a domény

11

783

13.06.2009 12:04

Pablo Montero

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

Script na ratanie poctu downloadov?

v Backend

2

1265

03.08.2005 19:35

Pekaboo

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

Meranie počtu metrov v mobile

v Ostatné programy

5

878

06.03.2011 20:37

mato59

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

Obmedzenie poctu kopii na tlaciarni

v Externé zariadenia

8

707

17.04.2018 9:00

unset(array[0])

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

Sledovanie poctu stiahnuti suboru na webe

v Frontend

7

616

08.12.2012 18:10

capricorn7



© 2005 - 2026 PCforum, edited by JanoF