Помощ - Търси - Регистрирани - Календар
Пълна версия: argc,char *argv[] - като параметри
UniBG Forums > Дискусии > Dexter's Lab > Програмиране
guest_A
Здравейте! В тази задача:
CODE
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
typedef int Number;
Number randNum()
{    return rand();}
main(int argc, char *argv[])//ОТ КЪДЕ СЕ ПОЛУЧАВАТ ТИЯ АРГУМЕНТИ?!?
{
   int i, N = atoi(argv[1]);
   float m1 = 0.0, m2 = 0.0;
   Number x;
   for( i = 0; i < N; i++)
      {
         x = randNum();
         m1 += ((float)x)/N;
         m2 += ((float)x*x)/N;
      }
   printf("\tAverage:%f\n", m1);
   printf("Std. deviation:%f\n", sqrt(m2 - m1*m1));
   system("pause");
   return 0;
}

main(int argc, char *argv[])//ОТ КЪДЕ СЕ ПОЛУЧАВАТ ТИЯ АРГУМЕНТИ?!?[size="5"][/size]
dlh
argc е броят на подадените аргументи към програмата, а в argv се съдържат самите аргументи

./програма аргумент1 аргумент2
int21h
Например при format.com ако бъде извикана така:

c:\> format c: /q

Тогава:
argc = 3
argv[0] = "format.com"
argv[1] = "c:"
argv[2] = "/q"
Гост
argc = 3 (името, под което е извикана програмата, също влиза в сметката заедно с аргументите).
int21h
QUOTE(Гост @ Jul 4 2007, 02:39 AM) *
argc = 3 (името, под което е извикана програмата, също влиза в сметката заедно с аргументите).


Да, името също влиза.
Гост
QUOTE(int21h @ Jul 3 2007, 08:19 PM) *
Например при format.com ако бъде извикана така:

c:\> format c: /q

Тогава:
argc = 3
argv[0] = "format.com"
argv[1] = "c:"
argv[2] = "/q"


argv[0] e redno da e "format", a ne "format.com".
pod linux pone argv[0] e tova, chrez koeto si izvikal programata.
suotvetno ako imash soft-link kum programata, kojto se kazva 'boza', to argv[0] shte sudurja "boza".
int21h
QUOTE(Гост @ Jul 6 2007, 07:22 PM) *
argv[0] e redno da e "format", a ne "format.com".
pod linux pone argv[0] e tova, chrez koeto si izvikal programata.
suotvetno ako imash soft-link kum programata, kojto se kazva 'boza', to argv[0] shte sudurja "boza".


Да, ама не. :) Поне при Windows/DOS не е така (а е очевадно, че примерът е майкрософтски). В грешка си като смяташ, че ще се покаже само името на файла без разширението. Всъщност, аз също сгреших, защотото не само се показва разширението, но се показва и пътят до файла (навремето така определяхме текущата директория, може да има и други начини, но аз този ползвах).

Ето..

CODE
Microsoft Windows [Version 6.0.6000]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Users\int21h>cd\temp

C:\TEMP>type try01.cpp
#include <stdio.h>

void main( int argv, char *argc[] )
{
  printf( "Number of arguments: %d\n\n", argv );
  for( int Loop = 0; Loop < argv; Loop++ )
    printf( "ArgN: %d, Argument: %s\n", Loop, argc[ Loop ] );
}

C:\TEMP>bcc -3 -O2 -mh try01.cpp
Borland C++ 5.0 Copyright (c) 1987, 1996 Borland International
try01.cpp:
Turbo Link  Version 7.1.32.2. Copyright (c) 1987, 1996 Borland International

C:\TEMP>try01 parametyr1 parametyr2 parametyr3
Number of arguments: 4

ArgN: 0, Argument: C:\TEMP\TRY01.EXE
ArgN: 1, Argument: parametyr1
ArgN: 2, Argument: parametyr2
ArgN: 3, Argument: parametyr3

C:\TEMP>


Т.е. в примера от първия ми post по темата, argv[0] ще бъде C:\FORMAT.COM (имената на файловете и директориите не са case-sensitive).
Polizei
int21h: при теб се получава така или защото стартираш ДОС програма под CMD (32 битов команден интерпретатор), или заради runtime библиотеката на BCC.
Ето малко дъмп от мен (твоя код, gcc 3.4.5 mingw) :
CODE
C:\>a p1 p2 p3
Number of arguments: 4

ArgN: 0, Argument: a
ArgN: 1, Argument: p1
ArgN: 2, Argument: p2
ArgN: 3, Argument: p3

C:\>a.exe p1 p2 p3
Number of arguments: 4

ArgN: 0, Argument: a.exe
ArgN: 1, Argument: p1
ArgN: 2, Argument: p2
ArgN: 3, Argument: p3

C:\>C:\a.exe p1 p2 p3
Number of arguments: 4

ArgN: 0, Argument: C:\a.exe
ArgN: 1, Argument: p1
ArgN: 2, Argument: p2
ArgN: 3, Argument: p3

А в ДОС параметрите при извикване са тези каквито си ги написал, демек същата работа като при горния дъмп...
Доколкото съм дебъгвал/деасемблирал в ДОС програмите си четат параметрите от някаква си там environment variable, CMDLINE или нещо от сорта... Не помня.
Това е семпла версия на форума. За да видиш пълната версия, която има повече информация, по-добра подредба и снимки, натисни тук.
Invision Power Board © 2001-2008 Invision Power Services, Inc.