DOMANDA Esecuzione programma c++ in ambiente non windows

Michele S.J.

Nuovo Utente
13
0
Rieccomi.
Ho seguito per intero la procedura indicata nel tutor "
".
Inizialmente il programmino di prova (simile a quello che mi hai fornito tu) ha girato normalmente, poi ha iniziato a darmi errori del tipo "access denied" e ciao ciao.
Adesso, addirittura, non riesco a cancellare in alcun modo nessuno dei files .exe creati con sflm (nè da windows nè dal prompt). Ho anche scaricato un software chiamato unlocker ma senza esito, o meglio, unlocker mi da esito positivo ma il file è sempre lì ed è sempre incancellabile. A quanto pare è in perpetuo uso da parte del sistema.
 

Michele S.J.

Nuovo Utente
13
0
Sono appena riuscito a cancellarlo.
Amen.
Nei prossimi giorni provo ad installare sdl2. Tu lo usi con Code Blocks o con Visual Studio? Me lo consigli?
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Io uso Visual Studio + SDL.
Visual Studio però è per Windows, se non usi Windows allora c'è Visual Studio Code che almeno è simile ed multi-piattaforma, altrimenti Sublime Editor o altro.
In visual studio, un .exe ti viene generato ogni volta che lanci il programma (nella cartella Debug se lanci in modalità debug) percui non capisco perchè stai cercando di eliminarlo :/
In SDL una situazione simile si può verificare se fai robe strane, tipo chiudere la finestra ma non uscire dal while() loop, quindi a te sembra che il programma è stato chiuso correttamente ma in reltà se vai su Gestione Attività l'.exe è ancora in esecuzione (perchè sei sempre dentro il loop del tuo codice), quindi se non fai prima "termina processo" da lì, non puoi eliminare l'.exe o ri-compilare (e ripeto, non hai nessun motivo di eliminarlo, viene sovrascritto ogni volta che ri-compili il tuo codice), quindi questo indica che hai un bug nel tuo codice e devi eliminare il bug e non l'.exe :D
Se funziona come SDL allora ci sono funzioni che vanno chiamate in maniera simmetrica (spero sia il termine corretto) tipo SDL_Init() ed SDL_Quit(), oppure SDL_CreateWindow() ed SDL_DestroyWindow(), percui assicurati che stai chiamando le funzioni in quel modo lì, se anche SFML funziona nello stesso modo.

Inoltre quando rispondi sul qui forum, se clicchi su il bottone "inserisci" (icona '+') "codice (icona "</>") puoi mettere qui il tuo codice, per vedere se c'è qualcosa di strano.
il tag CODE=CPP nel primo tag che ti crea attorno al codice ti dà l'highlight giusto per C++ :)

Ti mostro il loop che uso io,codice sotto.
Un pò piu complicato, ma in sostanza "Running" è una bool che indica se l'app è in esecuzione, se l'input per chiudere la finestra (SDL_QUIT) viene dato (cliccando nella X rossa sopra la finestra ed in alcuni altri modi penso) allora si esce dal while() e poco dopo tutti i giusti destructor vengono chiamati

EDIT: questo link è un'esempio dalla pagina della documentazione dell'API, nota che non è return 0 come nel video ma è return EXIT_SUCCESS; prova a cambiare quello e vedi se risolvi.

C++:
void App::GameLoop()
{
    while (Running)
    {
        Timer->Tick();

        //Input
        SDL_Event Event;
        if (SDL_PollEvent(&Event))
        {
            switch (Event.type)
            {
                case SDL_QUIT:
                {
                    Running = false;
                }
            }
        }

        //Update
        while(Timer->CurrentTime() > Timer->NextUpdateTime())
        {
            Game->CurrentState()->Update(Timer->DeltaTime());
            Timer->Advance();
        }

        //Draw
        Game->CurrentState()->Draw(Timer->Interpolation());
    }
}

App class destructor:
C++:
App::~App()
{
    if (Window) { SDL_DestroyWindow(Window); }
    if (Renderer) { SDL_DestroyRenderer(Renderer); }
    SDL_Quit();
}
 
Ultima modifica:

Michele S.J.

Nuovo Utente
13
0
Alla fine sono riuscito a cancellare il file.
Anche Code Blocks genera il .exe ad ogni esecuzione, salvandolo nella cartella bin\debug; il motivo per cui ho cancellato il tutto è stato quello di fare un pò d'ordine nella cartella dei progetti C++.
Vedrò di documentarmi in merito a SDL.
Ad ogni modo, tanto SFML quanto SDL lavorano su schermo in modalità grafica; io cercavo qualcosa che lavorasse in modalità testo (crt) o console, se preferisci e che, appunto, mi desse modo di tenere fissa ed isolare la finestra di esecuzione, così come ho scritto nelle prime domande di questo topic. Non ne conosci alcuna?
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
No, non ne conosco.Suppongo l'api Windows abbia molta roba al riguardo. Ma nulla ti vieta di crearti una cosa che emuli quel funzionamento tramite finestra (come esercizio magari :D ) e se sei abbastanza bravo, rendere l'esperienza d'utilizzo indistinguibile.
Sotto il codice di base che ti permette di scrivere dentro la finistra, ed una .gif che lo mostra in funzione. Non ho implementato robe come cancellare il testo, ritorno a capo ecc..., ma penso sia un esercizio interessante e ti permette di creare le funzioni che davvero ti servono, quindi ogni cosa che aggiungi è una sfida ed è motivata. Non prendere esempio dal mio codice, è orribile di proposito (no error checking, niente classi ecc...), per tenerlo breve (codice a fine post)
uZfOape.gif


Codice in SDL (oltre SDL2 richiede una seconda libreria chiamata SDL_ttf 2.0 che ti permette di aprire un font in maniera semplice):
C++:
#include <string>
#include "SDL2\SDL.h"
#include "SDL2\SDL_ttf.h"
using namespace std;

void InitAll(SDL_Window** window, SDL_Renderer** renderer)
{
    SDL_Init(SDL_INIT_EVERYTHING); //tutti i sistemi SDL
    TTF_Init(); //libreria aggiuntiva per maneggiare font

    *window = SDL_CreateWindow("MyWindow", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1024, 768, SDL_WINDOW_SHOWN);
    *renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
}

int main(int argc, char *argv[])
{
    SDL_Window* Window = nullptr;
    SDL_Renderer* Renderer = nullptr;
    InitAll(&Window, &Renderer);

    TTF_Font* Arial = TTF_OpenFont("arial.ttf", 24);
    SDL_Rect TextBox{ 200,200,0,0 };
    string Text;

    SDL_StartTextInput();

    bool Running = true;
    while (Running) {
  
        SDL_Event Event;
        if (SDL_PollEvent(&Event)) {
            switch (Event.type) {

                case SDL_QUIT:
                {
                    SDL_StopTextInput();
                    Running = false;
                }
                break;

                case SDL_TEXTINPUT:
                {
                    // Aggiungi testo alla string
                    Text += Event.text.text;
                    //ri-dimensiona la destinazione su schermo del testo in base allo spazio richiesto
                    TTF_SizeText(Arial, Text.c_str(), &TextBox.w, &TextBox.h);
                }
                break;

                case SDL_TEXTEDITING:
                {
                    //
                }
                break;
            }
        }

        //Draw

        //text to surface
        SDL_Surface * TextSurface = TTF_RenderText_Solid(Arial, Text.c_str(), SDL_Color{ 210, 165, 121, 255 });
        //surface to texture
        SDL_Texture* Texture1 = SDL_CreateTextureFromSurface(Renderer, TextSurface);
  
        //disegna sfondo
        SDL_SetRenderDrawColor(Renderer, 15, 25, 35, 255);
        SDL_RenderClear(Renderer);
        //disegna testo
        SDL_RenderCopy(Renderer, Texture1, NULL, &TextBox);
        //mostra BackBuffer
        SDL_RenderPresent(Renderer);

        //cleanup
        SDL_FreeSurface(TextSurface);
        SDL_DestroyTexture(Texture1);
    }
    //cleanup
    TTF_CloseFont(Arial);
    TTF_Quit();
    SDL_Quit();

    return EXIT_SUCCESS;
}
 
Ultima modifica:

Michele S.J.

Nuovo Utente
13
0
Molto bene.
Mi metto subito in cerca delle due librerie.
Immagino che mi servirà anche un qualche tutorial che mi spieghi esattamente la sequenza. Lo cerco su youtube.
Grazie, sei gentile e disponibile come sempre.
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
SDL2
SDL_ttf
Di tutorial su SDL è pieno, molti si concentrano sui videogame ma le conoscenze richieste sono le stesse, ovvero creare una finestra,maneggiare input ecc... quindi anche quelli vanno bene.
Onestamente non ho manco visto nulla su SDL_ttf, a sto punto preferisco aprire la documentazione dell'API e trovare i nomi delle funzioni che mi servono (e leggere cosa fanno), e così ho fatto per SDL_ttf xD
 

Michele S.J.

Nuovo Utente
13
0
Proprio ora stavo documentandomi su wikipedia. Ci sono 3 possibili modi per installare SDL; credo che proverò la più semplice e valuterò i pro e i contro rispetto alle altre 2.
Dove posso trovare la documentazione API? La trovo online oppure è me la porto dietro all'atto dell'installazione?
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Sempre dal link che ti ho passato, sotto Wiki -> https://wiki.libsdl.org/FrontPage (e per sdl_ttf sempre dal link nel reply sopra, su documentazione o qualcosa del genere)

Questa playlist invece contiene la procedura per importare su visual studio(video 1) e su codeblock(video 2) ->
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
By the way, ti risparmio un bug nel caso copi-incolli e provi ad eseguide il mio codice:
devi andare nella cartella di windows dove tieni i font, copiare arial.ttf ed incollarlo nella cartella del tuo progetto, altrimenti TTF_OpenFont() non lo trova
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!