Предоставление аргументов с плавающей точкой через язык командной строки C - PullRequest
0 голосов
/ 13 января 2019

Мне трудно использовать командную строку, чтобы взять переменные (записанные в командной строке) и использовать их в программе. Идея состоит в том, чтобы я скомпилировал программу, используя:

gcc main.c

и запустите его, запустив созданный a.exe с последующими аргументами.

следующим образом:

C: \ Users \ Pc \ Desktop \istance> gcc main.c

C: \ Users \ Pc \ Desktop \istance> a.exe 0,0005 1,5 160

48.000000 49.000000 49.000000 Недостаточно аргументов

Последняя строка - это значение, полученное мной из кода, которое не соответствует действительности, как видно из приведенных мною аргументов.

А также тот факт, что код завершается оператором if "Недостаточно аргументов". Это снова сбивает с толку, так как * argv [] начинается с 0 * argv [0], который должен быть равен "a.exe", и поэтому следующие аргументы должны = * argv [1] ... ect

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float areaOfcircle(float radius_circle)
{
    float area_circle;
    area_circle = M_PI * radius_circle * radius_circle;

    return area_circle;
}
void resitance_current(float length, float area_circle, float voltage, float* resistance, float* current)
{
    float resistivity;
    resistivity = 1.782*pow(10, -8);
    *resistance = ((resistivity*length) / area_circle);
    *current = (voltage / *resistance);
}
int main(int argc, char *argv[])
{
    float radius, voltage, length, current, resistance;
    float length_u, length_l;
    voltage = *argv[1];
    length = *argv[2];
    radius = *argv[3];
    printf("%f %f %f", voltage, length, radius);
    //char response, yes;
    // take radius as input
    //printf("Enter the radius of wire : ");
    //scanf("%f", &radius);
    if (argc != 3)
    {
        printf("Not enough arguments supplied");
    }
    else
    {
        if (radius < 0)
        {
            exit(1);
        }
        else
        {
            //printf("Enter the Voltage of circuit : ");
            //scanf("%f", &voltage);
            if (voltage < 0)
            {
                exit(1);
            }
            else
            {
                //printf("Enter the Length of Wire : ");
                //scanf("%f", &length);
                if (length < 0)
                {
                    exit(1);
                }
                else
                {
                    resitance_current(length, areaOfcircle(radius), voltage, &resistance, &current);
                    printf("Resistance = %f , Current = %f\n", resistance, current);
                    printf("\nEnter the Upper Length of Wire : ");
                    scanf("%f", &length_u);
                    printf("\nEnter the Lower Length of Wire : ");
                    scanf("%f", &length_l);
                    if ((length_l < 0) || (length_l >= length_u))
                    {
                        exit(1);
                    }
                    else
                    {
                        for(length_l = length_l; length_l<=length_u; length_l++)
                        {
                            length = (length_l + 1);
                            resitance_current(length, areaOfcircle(radius), voltage, &resistance, &current);
                            printf("\nLength = %0.3f Resistance = %0.3f , Current = %0.3f", length, resistance, current);
                        }
                    }

                }
            }
        }
    }
    return 0;
}

В строках 23-25 ​​я пытаюсь присвоить имена переменных предоставленным аргументам. сделать чтение кода проще.

Основная проблема, с которой я пытаюсь найти помощь, заключается в том, как получить (целые числа / числа с плавающей запятой, которые считываются / вводятся из командной строки после имени program.exe и правильно используются в коде.

* Код был предварительно написан, и это был последний шаг, поэтому, если я что-то пропустил в коде, пожалуйста, помогите с этим, спасибо заранее. Надеюсь, вы можете помочь:)

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Что это делает?

  voltage = *argv[1];
    length = *argv[2];
    radius = *argv[3]

Вы пытаетесь взять строковое значение и присвоить его числу с плавающей точкой. Это не будет работать. Вам нужно преобразовать строку, используя что-то вроде функции atof () (https://www.tutorialspoint.com/c_standard_library/c_function_atof.htm).

ex;   voltage = atof(argv[1])

Также скомпилируйте с полными предупреждениями.

0 голосов
/ 13 января 2019

Вы можете попробовать распечатать значение argc и все строки argv, чтобы увидеть, какие они есть. Возможно, вас ждет сюрприз. Добавьте следующую функцию в ваш код:

void dumpargs(int argc, char *argv[])
  {
  int i;

  printf("argc = %d\n", argc);

  for(i = 0 ; i < argc ; ++i)
    printf("argv[%d] = '%s'\n", i, argv[i]));
  }

затем добавьте следующее в качестве первой строки после объявления переменных в main:

dumpargs(argc, argv);
0 голосов
/ 13 января 2019

предупреждение, что путь к программе является первым аргументом, поэтому argc в вашем случае необходимо сравнить с 4, поэтому у вас такое поведение

другое замечание: вам нужно проверить argc перед , чтобы получить доступ к argv

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...