Одномерный массив. Простые числа. "Предупреждения" и "замечания" при компиляции в gcc под linux - C (СИ)
Формулировка задачи:
Доброго времени суток. Нужна помощь.
Не могу разобраться, почему не компилируется.
задача:
gcc ругается:
Спасибо!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "my.c"
/* my.c требуется написать по заданию.
в нем void функции ввода/вывода одномерного массива.
содержимое файла ниже. */
main (int argc, char* argv[])
{
int N, A[N];
logo();
if (argc<3) {
puts("Программа находит простые числа в одномерном целочисленном массиве и выводит их номера.");
puts("Для запуска используйте аргументы командной строки:");
puts("./03 N r -- автоматическое задание массива размером N;");
puts("./03 N h -- ручное задание массива размером N;");
puts(", где N - целое число.");
puts("Пример:");
puts("./03 10 r - автоматическое задание массива размером 10.");
}
if (argc=2) {
N=atoi(argv[1]);
if (N<2||N>40) {
puts("Ошибка.\nКол-во элементов должно быть больше 1 и меньше 40"); exit(1);
}
if (strcmp(argv[2], "r")==0) {
printf("Был выбрал АВТОМАТИЧЕСКИЙ способ заполнения массива размером %d\n", N);
GetsArrayRand(A[N], N);
}
if (strcmp(argv[2], "h")==0) {
printf("Был выбрал РУЧНОЙ способ заполнения массива размером %d\n", N);
GetsArrayHand(A[N], N);
}
}
puts("Исходный массив:\n");
PutsArray(A[N], N);
}// Функция рандомного ввода массива
void GetsArrayRand(int A[], int N)
{
int i;
srand(time(NULL));
for (i=1; i<=N; i++)
A[i]=rand()%100;
}
// Функция ручного ввода массива
void GetsArrayHand(int A[], int N)
{
int i;
char buffer[10];
for (i=1; i<=N; i++) {
printf("Введите A[%d]=", i);
fgets(buffer,5,stdin);
A[i]=atoi(buffer); }
}
// Вывод массива
void PutsArray(int A[], int N)
{
int i;
for (i=1; i<=N; i++) {
printf("%d ", A[i]); }
puts(" ");
}
03.c: В функции «main»:
03.c:53:7: предупреждение: при передаче аргумента 1 «GetsArrayRand» целое преобразуется в указатель без приведения типа [по умолчанию включена]
03.c:7:6: замечание: expected «int *» but argument is of type «int»
03.c:57:7: предупреждение: при передаче аргумента 1 «GetsArrayHand» целое преобразуется в указатель без приведения типа [по умолчанию включена]
03.c:15:6: замечание: expected «int *» but argument is of type «int»
03.c:61:1: предупреждение: при передаче аргумента 1 «PutsArray» целое преобразуется в указатель без приведения типа [по умолчанию включена]
03.c:25:6: замечание: expected «int *» but argument is of type «int»
Не по теме:
Также буду благодарен за небольшую подсказку, как лучше организовать поиск простых чисел в массиве.
Решение задачи: «Одномерный массив. Простые числа. "Предупреждения" и "замечания" при компиляции в gcc под linux»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void GetsArrayRand(int A[], int N)
{
int i;
srand(time(NULL));
//for (i = 1; i <= N; i++)
// Адресация в массиве начинается с 0
for (i = 0; i < N; i++)
{
A[i] = rand() % 100;
}
}
void GetsArrayHand(int A[], int N)
{
int i;
char buffer[10];
//for (i = 1; i <= N; i++)
// Адресация в массиве начинается с 0
for (i = 0; i < N; i++)
{
printf("Введите A[%d]=", i);
fgets(buffer, 5, stdin);
A[i] = atoi(buffer);
}
}
void PutsArray(int A[], int N)
{
int i;
//for (i = 1; i <= N; i++)
// Адресация в массиве начинается с 0
for (i = 0; i < N; i++)
{
printf("%d ", A[i]);
}
printf("\n");
}
//main(int argc, char* argv[])
// Функция main должна возвращать int
int main(int argc, char* argv[])
{
//int N, A[N];
// N не инициализирована, соответственно размерность
// массива не известна
int N = 0, A[40];
//logo();
// Не понятно что за функция
//if (argc < 3)
// Аргументов должно быть 3. Первым (т.е. 0-ым) идёт имя программы
if (argc != 3)
{
puts("Программа находит простые числа в одномерном целочисленном массиве и выводит их номера.");
puts("Для запуска используйте аргументы командной строки:");
puts("./03 N r -- автоматическое задание массива размером N;");
puts("./03 N h -- ручное задание массива размером N;");
puts(", где N - целое число.");
puts("Пример:");
puts("./03 10 r - автоматическое задание массива размером 10.");
return 1;
}
//if (argc = 2)
// Даже если это и оставлять и не пользоваться return-ом 3-мя строчками выше
// всё равно не верно, ибо аргументов будет 3
N = atoi(argv[1]);
if (N < 2 || N > 40)
{
puts("Ошибка.\nКол-во элементов должно быть больше 1 и меньше 40");
exit(1);
}
if (strcmp(argv[2], "r") == 0)
{
printf("Был выбрал АВТОМАТИЧЕСКИЙ способ заполнения массива размером %d\n", N);
//GetsArrayRand(A[N], N);
// Передаём весь массив, а не значение одного его элемента
GetsArrayRand(A, N);
}
if (strcmp(argv[2], "h") == 0)
{
printf("Был выбрал РУЧНОЙ способ заполнения массива размером %d\n", N);
//GetsArrayHand(A[N], N);
// Передаём весь массив, а не значение одного его элемента
GetsArrayHand(A, N);
}
puts("Исходный массив:\n");
//PutsArray(A[N], N);
// Передаём весь массив, а не значение одного его элемента
PutsArray(A, N);
return 0;
}
Объяснение кода листинга программы
- Объявлены функции:
- GetsArrayRand()
- GetsArrayHand()
- PutsArray()
- main()
- В функции main() инициализированы переменные:
- N = 0
- A[40]
- Проверка аргументов командной строки:
- Если аргументов меньше или равно 2, выводится сообщение об ошибке и программа завершается.
- Если аргументов больше 2, то:
- Переменная N инициализируется значением первого аргумента командной строки.
- Переменная N проверяется на соответствие условиям (больше 1 и меньше 40).
- Если условия не выполняются, выводится сообщение об ошибке и программа завершается.
- Если условия выполняются, то:
- Если второй аргумент равен
r, то вызывается функция GetsArrayRand(). - Если второй аргумент равен
h, то вызывается функция GetsArrayHand().
- Вывод исходного массива:
- Вызывается функция PutsArray().
- Возвращение значения 0, что означает успешное завершение программы.