Передача аргументов в главную функцию main().
————
Игорь Викторович, здравствуйте. Вас беспокоит ХХХХХХ , студент ХХХ группы. У меня не передается значение функции main. Прошу Вас помочь мне разобраться с моей проблемой. Задачник Абрамова задание 191. Спасибо.
#include <stdio.h>
void main(int argc,char *argv[])
{
FILE *fp;
int n, count=0, i, d;
float *arr,var;
l2: printf(«vyberite sposob zadaniya massiva\n 1)vruchnuyu\n 2)avtomat\n 3)iz fayla»);
scanf(«%d»,&i);
printf(«vvedite colichestvo elementov massiva %d %s»,argc,argv[1]);
scanf(«%d»,&n);
switch(i)
arr=malloc(sizeof(float)*n);
n—;
switch(i)
{
case 1:
{
for(i=0;i<=n;i++)
{
scanf(«%f»,&var);
arr[i]=var;
}
break;
}
case 2:
{
for(i=0;i<=n;i++) arr[i]=rand();
break;
}
case 3:
{
fp=fopen(argv[1],»r»);
i=0;
while(!feof(fp))
{
fscanf(fp,»%f»,&var);
arr[i]=var;
i++;
if (i>n) break;
}
fclose(fp);
break;
}
default:
{
printf(«\nvyberite odin iz dvuh punktov»);
goto l2;
}
}
for (i=0;i<=n;i++)
{
printf(«%f\t»,arr[i]);
if(arr[i]>=7) { count++; arr[i]=7;}
}
printf(«\nkolichestvo elementov, ravnyh bolee 7 = %d»,count);
sleep(5);
}
————————————————————-
Так как ответ может быть интересен всем, а не только человеку, приславшему мне письмо, то привожу этот ответ в своем блоге. Известно, что функция main может иметь аргументы, хотя очень часто потребность в них отсутствует, а в программе функцию main записываем без аргументов, то есть main().
На лекции я приводил следующую программу.
#include<stdio.h>
#include<conio.h>
main(argc,argv)
int argc;
char *argv[];
{clrscr();
printf(«\n agrc=%d»,argc);
while(argc>0) {
printf(«\n argc=%d argv[]=%s»,argc,*argv);
*argv++;
argc—;} }
Если программу скомпилировать и запустить (полученный в результате компиляции файл называется str.exe и находится на диске C: в папке TC) в командной строке, указав str.exe /HELP /AIV, то программа напечатает:
agrc=3
argc=3 argv[]=C:\TC\STR.EXE
argc=2 argv[]=/HELP
argc=1 argv[]=/AIV
Видно, что первый аргумент отвечает за число групп символов, разделенных между собой, по крайней мере, одним пробелом. Первая группа символов – полный путь с именем файла, следующие две группы это то, что передали в качестве параметров, запуская файл.
Какая ошибка в программе, связанная с обработкой передаваемого имени файла, мне достаточно очевидно. Надеюсь, что это будет очевидно и все читателям, после рассмотрения того, как работает приведенная ниже программа. Программа должна найти сумму всех элементов, записанных в файле 1.txt. В первой строке файла находится информация о том, сколько всего элементов будем суммировать, а далее эти элементы. Пример содержимого файла 1.txt:
6
11.3
11.7
1
2
3
4
Сложив числа, получим ответ 33. Пусть наша программу будет называться mainsum.c. Откомпилированный exe файл будет находиться в папке tc на диске H:. Файл 1.txt помещен там же.
Запускаем консоль (Например, кнопка Пуск, выполнить, cmd).
Если находимся в той же папке, то вполне можно записать
mainsum 1.txt
или
mainsum h:\tc\1.txt
Ecли в другой, то прописываем полный путь
h:\tc\mainsum h:\tc\1.txt
И получаем нужный результат. Внимание! Не надо записывать
mainsum h:\\tc\\1.txt
Да, С и С++ обратная косая черта служебный символ и ее надо удваивать если хотим получить обратную косую черту в записи текста программы.
Например, in=fopen(“c:\\tc\\1.txt”,”rt”); — записано правильно, а in=fopen(“c:\tc\1.txt”,”rt”); — с ошибкой.
Когда запускаем готовый exe файл, то обратную косую черту в записи пути удваивать не надо!
Текст программы:
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
main(int x, char *f[])
{FILE *in;
int n,i;
float sum=0, tmp;
float *a;
printf(«\n x=%d»,x);
printf(«\n x=%d f=%s»,x,*f);
printf(«\n x=%d f[0]=%s»,x,f[0]);
printf(«\n x=%d f[1]=%s»,x,f[1]);
printf(«\n x=%d f[1]=%s»,x,*++f);
printf(«\n x=%d f[1]=%s»,x,f[1]);
printf(«\n x=%d f[1]=%s»,x,*—f);
printf(«\n x=%d f[1]=%s»,x,f[1]);
in=fopen(f[1],»r»);
fscanf(in,»%d»,&n);
printf(«\n n=%d»,n);
a=calloc(n,sizeof(float));
printf(«\n float=%d»,sizeof(float));
for(i=1;i<=n;i++)
{fscanf(in,»%f»,&tmp);
a[i]=tmp;
printf(«\n a[%d]=%5.2f»,i,a[i]);
sum=sum+a[i];
}
printf(«\n Sum=%5.2f»,sum);
fclose(in);
}
И результаты ее тестирования:
Обратите внимание на то, что происходит, когда печатаю значение printf(«\n x=%d f[1]=%s»,x,f[1]);. Видите, что строка
printf(«\n x=%d f[1]=%s»,x,*—f);
появилась не случайно. Это грабли номер два, на которые можно налететь (первые — это ошибочное удваивание символа \). Двигаемся дальше. Замечу, что конструкция
fscanf(in,»%f»,&tmp);
a[i]=tmp;
использована сделана исключительно потому, что turbo C (ver 2.0 и ниже) не всегда корректно работает с вводимыми элементами массива. Для используемого языка С++ можно было записать fscanf(in,»%f»,&a[i]);
Рекомендую скачать архив https://mctrewards.ru/stud/main.zip и посмотреть программы в работе.
Если возникли какие либо вопросы по работе программ, то их можно задать (используйте форму ниже). Материалы лекций доступны тем читателям, кто зарегистрирован в блоге (регистрация бесплатная и ограничений нет) и указал при регистрации о себе полную информацию. Если человек, задавший вопрос, захочет поделиться с читателями корректно работающим (исправленным) вариантом программы, то может разместить его здесь (форма ниже). Конечно, можно было исправить присланный вариант, а не составлять другую программу (на что у меня ушло в разы больше времени), но считаю, что это не лучшее решение.
Вопросы по программированию Вы можете задавать в теме “Вопросы по программированию”. После модерации к показу допускаются все вопросы по теме, а на наиболее интересные я даю ответы. При желании любой читатель тоже может дать ответ на заданный вопрос.