0

Tengo el siguiente código donde el error está en el operador ternario dentro de un bloque for, debido a que si el caso es verdadero uso la sentencia continue; que continua con la siguiente iteración del bucle.

Pero no funciona el operador dice que hay "error en la expresión antes del continue" y no se cuál es el error que dice que es antes debido a que ya encapsulé las expresiones, ¿alguien sabe como solucionarlo ?

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

using namespace std;

void aleatory_ip(long ip){

    volatile int n1[ip];
    volatile int n2[ip];
    volatile int n3[ip];
    volatile int n4[ip];
   
    srand(time(NULL)); 
    
    int j = 0;
    int t = 0;
    int k = 0;
    for (int i = 0; i != ip; ++i)
    {

      n1[i] = 0 + rand() % (255); 
      n2[i] = 0 + rand() % (255); 
      n3[i] = 0 + rand() % (255); 
      n4[i] = 0 + rand() % (255); 
  
     }
     for (int i = 0; i < ip ; ++i)
     {

       (n1[i] >= 0 and n1[i] <= 255) ? continue; : n1[i] = 0 + rand() % (255);
       (n2[i] >= 0 and n2[i] <= 255) ? continue; : n2[i] = 0 + rand() % (255);
       (n3[i] >= 0 and n3[i] <= 255) ? continue; : n3[i] = 0 + rand() % (255);
       (n4[i] >= 0 and n4[i] <= 255) ? continue; : n4[i] = 0 + rand() % (255);

     }

      string IPs[ip];
      string IPa[ip];   

    for (int i = 0; i != ip; ++i){

     IPs[i] = to_string(n1[i]) + '.' +
              to_string(n2[i]) + '.' +
              to_string(n3[i]) + '.' +
              to_string(n4[i]);

     }

     cout<<"[server:][$:created IPs]"<<endl;
    
     for (int i = 0; i !=ip ; ++i){

        if (IPs[i]=="127.0.0.0"  )
        continue;
        if (IPs[i]=="0.0.0.0"    )
        continue;
        if (IPs[i]=="3.0.0.0"    )
        continue;
        if (IPs[i]=="15.0.0.0"   )
        continue;
        if (IPs[i]=="56.0.0.0"   )
        continue;
        if (IPs[i]=="10.0.0.0"   )
        continue;
        if (IPs[i]=="192.168.0.0")
        continue;
        if (IPs[i]=="172.16.0.0" )
        continue;
        if (IPs[i]=="100.64.0.0" )
        continue;
        if (IPs[i]=="127.0.0.10" )
        continue;
        if (IPs[i]=="198.18.0.0" )
        continue;
       else{

         IPa[j] = IPs[i];
         j++;

       }
     }
     for (int i = 0; i !=ip; ++i)
     {
        IPs[i] = IPa[i];
     }
     for (int i = 0; i != ip ; ++i)
     {
        t += sizeof(IPs[i]);
     }
     for (int i = 0; i < ip; ++i)
     {
         for (j = i+1; j < ip; ++j)
         {
            if(IPs[i] == IPs[j])
            {
                 k = j; 

                 while(k < ip)
                {
                   IPs[k] = IPs[k+1];
                   ++k;
                }
 
                 --ip;
                 --j;

             }
         }
     }

    
     
    for (const auto &IP : IPs){
        
     cout <<"[server:][aleatory_ip $]:"<< IP << '\n';
     Sleep(1000);

     }  
 }
void test_case(){

  long T;
  cin>>T; 
  aleatory_ip(T);
  
 } 
int main(){
  
  test_case();
   
  return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Y porque motivo no usas un if normal? La expresion que va ahi tiene que retornar un valor. La unica excepcion es si estas lanzando una excepcion. – Pablochaches Aug 15 '21 at 18:50
  • Saludos. Particularmente yo uso los operadores ternarios para obtener un valor no para ejecutar una sentencia como el `continue;` que estas usando. La asignación que colocas después de `:` por ser **c++** te lo permite. Si las asignaciones de tus `N` se realizaran si la condición no se cumple mejor usa `if`. **Nota** no veo la razón el `continue;` a mi parecer se cumpla o no la condición el ciclo seguira hasta que `i>=ip` no antes. – RobertoLeOr Aug 15 '21 at 19:27

1 Answers1

3

No entiendes el funcionamiento del operador ternario.


El operador ternario es una expresión que devuelve un valor. En otras palabras, al evaluar un operador ternario el resultado debe ser un valor.

La instrucción continue no es un valor, la instrucción continue no se puede interpretar como un valor, la expresión continue no puede substituir a un valor en ningún contexto.

Pero ese es el menor de tus problemas, tu código tiene errores de concepto y de algoritmo. Vamos a echarle un vistazo:

  • Estás programando en pero incluyes cabeceras de : <string.h>, <stdlib.h> y <time.h> son cabeceras de C y no deben ser usadas en C++.
    • Si realmente necesitases cabeceras de C en tu programa (lo cuál no es tu caso) deberías usar las versiones portadas a C++: <cstring>, <cstdlib> y <ctime>.
  • El cualificador volatile es inutil en este contexto: El cualificador volatile se usa para indicarle a el compilador que esa variable no debe someterse a optimizaciones que podrían afectar a un sistema concurrente. Tu código no es concurrente, no necesitas volatile.
  • Tanto en como en las formaciones1 en memoria automática2 deben definirse con un tamaño conocido en tiempo de compilación: En tu caso estás usando una variable, cuyo valor sólo se conoce en tiempo de ejecución, para definir las formaciones1 n1, n2, n3 y n4.
  • Las variables deben tener nombres autoexplic...

Mira, lo dejo ya. Es muy frustrante que la gente dedique tiempo a corregir problemas que tiene tu código y tú no des muestra alguna de haber entendido lo que se escribe y redactes una pregunta con exactamente los mismos problemas que ya se te señalaron anteriormente.

Varios de los fallos que cometes, cometiste y te empeñas en repetir, te han sido señalados en otras respuestas:

Por favor, lee y entiende lo que te responden al menos tan en serio como quienes dedicaron su tiempo a intentar aportarte algo, intento que al menos en tu caso, ha sido una pérdida de tiempo.


1También conocidas como arreglo o en inglés array.

2La memoria automática es la que no se pide con new.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82