.bin объект исполняемый в командной строке, но не в Visual Studio Code - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующий файл Practica1. cpp:

// Ejemplo de la ordenacion por burbuja sobre un vector de enteros

#include <cstdlib> // Para usar srand y rand
#include <chrono>
#include <iostream>
#include <fstream> // Para usar ficheros
using namespace std;

void OrdenaBurbuja(int *v, int n);


int main(int argc, char *argv[]) {

    int *v;
    int n, i, argumento;
    chrono::time_point<std::chrono::high_resolution_clock> t0, tf; // Para medir el tiempo de ejecución
    double tejecucion; // tiempo de ejecucion del algoritmo en ms
    unsigned long int semilla;
    ofstream fsalida;

    if (argc <= 3) {
        cerr<<"\nError: El programa se debe ejecutar de la siguiente forma.\n\n";
        cerr<<argv[0]<<" NombreFicheroSalida Semilla tamCaso1 tamCaso2 ... tamCasoN\n\n";
        return 0;
    }

    // Abrimos fichero de salida
    fsalida.open(argv[1]);
    if (!fsalida.is_open()) {
        cerr<<"Error: No se pudo abrir fichero para escritura "<<argv[1]<<"\n\n";
        return 0;
    }

    // Inicializamos generador de no. aleatorios
    semilla= atoi(argv[2]);
    srand(semilla);

    // Pasamos por cada tamaÒo de caso
    for (argumento= 3; argumento<argc; argumento++) {

        // Cogemos el tamanio del caso
        n= atoi(argv[argumento]);

        // Reservamos memoria para el vector
        v= new int[n];

        // Generamos vector aleatorio de prueba, con componentes entre 0 y n-1
        for (i= 0; i<n; i++)
            v[i]= rand()%n;

        cerr << "Ejecutando Burbuja para tam. caso: " << n << endl;

        t0= std::chrono::high_resolution_clock::now(); // Cogemos el tiempo en que comienza la ejecuciÛn del algoritmo
        OrdenaBurbuja(v, n); // Ejecutamos el algoritmo para tamaÒo de caso tam
        tf= std::chrono::high_resolution_clock::now(); // Cogemos el tiempo en que finaliza la ejecuciÛn del algoritmo

        unsigned long tejecucion= std::chrono::duration_cast<std::chrono::microseconds>(tf - t0).count();

        cerr << "\tTiempo de ejec. (us): " << tejecucion << " para tam. caso "<< n<<endl;

        // Guardamos tam. de caso y t_ejecucion a fichero de salida
        fsalida<<n<<" "<<tejecucion<<"\n";


        // Liberamos memoria del vector
        delete [] v;
    }

    // Cerramos fichero de salida
    fsalida.close();

    return 0;
}


void OrdenaBurbuja(int *v, int n) {

    int i, j, aux;
    bool haycambios= true;

    i= 0;
    while (haycambios) {

     haycambios=false; // Suponemos vector ya ordenado
     for (j= n-1; j>i; j--) { // Recorremos vector de final a i

         if (v[j-1]>v[j]) { // Dos elementos consecutivos mal ordenados
          aux= v[j]; // Los intercambiamos
          v[j]= v[j-1];
          v[j-1]= aux;
          haycambios= true; // Al intercambiar, hay cambio
         }
     }
    }
}

, поэтому я компилирую его так: g++ -o Practica1.bin Practica1.cpp -std=c++11 Затем я получаю свой Practica1.bin Однако, когда я пытаюсь .\Practica1.bin 12345 1000 2000 3000 Он просто открывается поврежденный записанный файл

Если я скомпилирую его как .exe: g++ -o Practica1.exe Practica1.cpp -std=c++11, я получу желаемый вывод: .\Practica1.exe 12345 1000 2000 3000:

Ejecutando Burbuja para tam. caso: 2000
        Tiempo de ejec. (us): 11853 para tam. caso 2000
Ejecutando Burbuja para tam. caso: 3000
        Tiempo de ejec. (us): 27954 para tam. caso 3000

С другой стороны, на cmd I может создать тот же .exe или .bin, что и раньше, и оба будут компилироваться с:

Practica1.bin salida.txt 12345 1000 2000 3000 или Practica1.exe salida.txt 12345 1000 2000 3000

, но без ./

Конечно Я пытался скомпилировать из Visual Studio Code .bin без ./, и он не работает

Я получаю лучшие результаты с .bin логически, поэтому я думаю, что это важно

Я хочу знать, возможно ли выполнить .bin файлы из Visual Studio Code

Заранее спасибо

1 Ответ

0 голосов
/ 19 февраля 2020

Я предполагаю, что вы используете Windows, потому что вы компилируете exe, возможно, unix системы ведут себя аналогично.

.\xyz попытается открыть файл xyz, но не обязательно выполнить его. Поэтому Windows будет обрабатывать файл в соответствии с его расширением.

В .\Practica1.exe 12345 1000 2000 3000 Windows распознает файл как исполняемый файл из-за расширения .exe, поэтому он будет запускать программу.

Однако при открытии .\Practica1.bin 12345 1000 2000 3000 Windows считает, что это двоичный файл данных из-за расширения .bin, и пытается открыть его в соответствующей программе, которая в вашей системе является текстовым редактором.

Это должно объяснить первое замешательство. Теперь расширение файла не имеет значения при выполнении. Просто скомпилируйте как .exe и будьте счастливы с ним.

...