He creado un arnés de prueba de unidad para probar mi programa. Quería que pudiera probar aleatoriamente cada ejecución, pero no estoy seguro de cómo hacerlo. Esto es lo que pensaba, pero me quedo atascado sobre qué hacer a continuación, cualquier orientación sería muy apreciada.

int main (void)
{
  int testNumber = 1; //for testing
  char carName[] = "";
  double carCost = 0;

  carName = carChosen (testNumber);
  carCost = assessCost (carName); //assessCost takes in the car name and checks what cost of the car will be (error checking so only certain cars can be chosen)

  return 0;
}

"testNumber" normalmente se sembraría con tiempo para crear diferentes números del 1 al 15, pero en esta situación será "1" para la prueba.

Esta es la siguiente parte con la que tengo problemas. Dentro de esta función, habría 15 opciones de coche diferentes y devolverá una dependiendo del número creado aleatoriamente.

char carChosen (int randNum)
{
  char carOne[] = "Honda";
  char carTwo[] = "Ford";
  if (randNum == 1)
  {
    return carOne; //local variables, not going to work...
  }
  else if (randNum == 2)
  {
    return carTwo; // Again, these return's are here to better represent what I'm trying to create but failing to do so..
  }
}

Entiendo que no puede devolver variables locales, ¿qué puedo hacer en su lugar?

1
Robolisk 27 ene. 2016 a las 12:12

2 respuestas

La mejor respuesta

Éste

void carChosen (int randNum, char * out)
{
  char carOne[] = "Honda";
  char carTwo[] = "Ford";
  if (randNum == 1)
  {
    strcpy(out, carOne); 
  }
  else if (randNum == 2)
  {
     strcpy(out, carTwo); 
  } //.. handle other cases
}

Llama como

  char carName[MAX_LEN];
  carChosen (testNumber, carName);

Además, quizás sea mejor usar switch en lugar de if..else anidado si tiene muchas condiciones para probar.

Pensé que era C mirando el código, si usa C ++, puede devolver objetos std::string de su función sin ningún problema.

2
giorgim 27 ene. 2016 a las 09:19

Como han señalado otros, su código se parece al código C. Si desea usar C ++, lea std :: string y utilícelo.

Si desea continuar con su enfoque (que es en gran medida un enfoque similar a C), entonces deberá comprender mejor cómo funcionan las cadenas de C. Es decir, cómo se almacenan en la memoria y en qué se diferencia un char de un char * de un char array[].

Dejando de lado la mayor parte de eso por ahora, mi primera suposición basada en su código de ejemplo es que en realidad no modificará el contenido de la cadena. Solo desea la cadena para su contenido, pero no los cambiará. Si esto es exacto, puede usar la variable char * normal para mantener un puntero a una cadena de caracteres. Solo necesita una copia de la cadena colgando, para que pueda pasar un puntero a esa copia y todos puedan leer desde ese puntero. Una forma rápida de hacer esto es simplemente usar la cadena literal directamente.

const char* carChosen (int randNum)
{
  if (randNum == 1)
  {
    return "Honda";
  }
  else if (randNum == 2)
  {
    return "Ford";
  } 
  else 
  {
    return "Audi";
  }
}

Tenga en cuenta que estamos devolviendo un const char *. El const solo indica que no modificaremos la cadena a la que se apunta. Definitivamente no queremos hacer eso porque apunta a un literal de cadena (que no está permitido modificar). Una vez que carChosen haya devuelto el const char *, puede pasarlo a otras funciones, p. Ej. evaluarCost.

0
Chris Badger 27 ene. 2016 a las 09:46