Странный вывод при использовании atof (optarg)

Редактировать::
Решено — это было связано с неправильным пониманием использования функции getOpt.
Я ссылался на материалы в человеке здесь, на переполнение стека (http://linux.die.net/man/3/getopt) и документацию getOpt на веб-сайте GNU здесь: gnu.org/software/libc/manual/html_node/Example-of-Getopt.html Спасибо Биллу Линчу и Ремьябелю за ссылки на ранее упомянутые исходные материалы.

Кажется, есть проблема, когда я запускаю эту программу, используя переменную -f для запуска «Футбольных» команд, наряду с использованием -c. Однако я в первую очередь обеспокоен тем, чтобы заставить работать только одну из них.

Размещение на входе:

-f -p 16 -a 25 -y 267 -t 1 -i 2

Gives out::
pC = 0
pC = 32738
pY = -1052776240
T = 32738
I = 1

Теперь эти переменные должны просто выводить именно то, что я вставил, поскольку единственное преобразование, которое я использую (как показано ниже), это X = atof (optarg);
Я подозреваю, что это может иметь какое-то отношение к значениям ASCII, хотя я почти не понимаю.

#

#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <time.h>
#include <stdlib.h>
#include <cmath>

using namespace std;

int main(int argc, char *argv[])
{
srand(time(NULL));
double r =  (6 + ( std::rand() % ( 8 - 6 + 1 ) )) / 10;
int c;
int pA;
int pY;
int T;
int I;
int pC;

double mass;
double bMass;
double dist;
double velo;
double Cr = .001;
double k = .18;
double g = 9.8;
double CFdraft;
double Pair;
double Proll;
double Psec;
double timeTravel = 0.0;
double Et;
double E;
double Eavg = 0;
int x = 0;
double cT;
double cC;
double cY;
double cI;
double PasserRating;

while ((c = getopt (argc, argv, "c:m:b:v:d:f:p:a:y:t:i:")) != -1)
{
if (c == 'f') // There seems to be some kind of misunderstanding with what this is doing

// Строка c == ‘f’ предназначена для обозначения того, какой набор вычислений нужно выполнить, так что это должна быть // передовая переменная, которую нужно проверить в начале программы.
{
если (c == ‘p’)
{
рс = атоф (оптарг);

                }
if (c == 'a')
{
pA = atof(optarg);

}
if (c == 'y')
{
pY = atof(optarg);

}
if (c == 't')
{
T = atof(optarg);

}
if (c == 'i')
{
I = atof(optarg);

}
cout << "pC " << pC << endl;
cout << "pC " << pA << endl;
cout << "pY " << pY << endl;
cout << "T " << T << endl;
cout << "I " << I << endl;
//Calculations
cC = ((pC / pA) - 0 / 30) * 5;
cY = ((pY / pA) - 3) * 0.25;
cT = ((T / pA) * 20);
cI = ((2.375) - (I / pA) * 25);

if (cC <= 0)
{
cC = 0;
}
if (cC >= 2.375)
{
cC = 2.375;
}
if (cY <= 0)
{
cY = 0;
}
if (cY >= 2.375)
{
cY = 2.375;
}
if (cT <= 0)
{
cT = 0;
}
if (cT >= 2.375)
{
cT = 2.375;
}
if (cI <= 0)
{
cI = 0;
}
if (cI >= 2.375)
{
cI = 2.375;
}
PasserRating = (((cC + cY + cT + cI) / 6) * 100);
string strPR = "Poor";

if (PasserRating <= 85)
{
strPR = "poor";
}
if (PasserRating > 85)
{
strPR = "mediocre";
}
if (PasserRating > 90)
{
strPR = "good ";
}
if (PasserRating > 95)
{
strPR = "great ";
}
cout << strPR << " " << PasserRating << endl;
}
if (c == 'c')
{
if (c == 'm')
{
mass = atof(optarg);

}
if (c == 'b')
{
bMass = atof(optarg);

}
if (c == 'd')
{
dist = atof(optarg);

}
if (c == 'v')
{
velo = atof(optarg);
}
timeTravel = (dist * 1000) / velo;
cout << "time:" << timeTravel << endl;
cout << "mass " << mass << endl;
cout << "bMass " << bMass << endl;
cout << "dist " << dist << endl;
cout << "velo " << velo << endl;

for (x = 0; x < (10); x ++)
{
CFdraft = r;
Pair = k * CFdraft * (pow(velo, 3));
Proll = Cr * g * (mass + bMass) * velo;
Psec = Pair + Proll;
Et = (Psec * timeTravel);
E = E + Et;
Eavg = E / timeTravel;
}

cout << Eavg << " KJ" << endl;
}

}
return 0;
}

0

Решение

Я серьезно рекомендую правильный отступ ваш код. Если бы вы сделали, вы бы увидели это:

if(c == 'f'){
if (c == 'p')
...
}

очевидно c не будет равен 'f' а также 'p' в то же время.

6

Другие решения

Вы никогда выполнить ваш код синтаксического анализа — все внутри if(c == 'f') условие, которое, очевидно, верно только в первый раз, когда вы запускаете цикл … Таким образом, вы просто получаете случайные значения из памяти.

3

По вопросам рекламы [email protected]