Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
La semicitazione dal Manzoni è per chiedere lumi sulla funzione nanosleep(), che il compilatore mi segnala come sconosciuta con "C:\Users\Cicci\Desktop\GiocoDel15_CODEBLOCKS\main.c|65|warning: implicit declaration of function 'nanosleep' [-Wimplicit-function-declaration]|". Addirittura, un errore riferito alla variabile ts (C:\Users\Cicci\Desktop\GiocoDel15_CODEBLOCKS\main.c|43|error: storage size of 'ts' isn't known|) blocca la compilazione del programma.
A quanto pare si tratta di funzioni e tipi dati non standard.
Da una ricerca molto superficiale, parrebbe trattarsi di materiale "esclusivo" di linux.
Soluzioni?
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
nanosleep è implementato in time.h
l'ho usato perché Sleep, mi viene segnalato come deprecato e che è stato sostituito da nanosleep (lavora in nanosecondi), dopo essermi documentato sulle modalità d'uso, l'ho implementato, funziona perfettamente con il mio GCC sotto Win.
Il programma non funziona sotto Linux perché usa windows.h, se qualche linuxxiano può dare info su come si potrebbe fare il porting del programma, ne sarei felicissimo.
Di seguito la routine int main() con Sleep al posto di nanosleep:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <ctype.h>
int main()
{
SetConsoleTitle(Titolo);
POINT pCoor;
HWND hwnd=0;
//attende la creazione della finestra per prelevare hwnd
while(hwnd==0)
hwnd=FindWindow(NULL, Titolo);// handle della finestra
TrovaCasella(pCoor.x, pCoor.y, console);// TrovaCasella modifica la struct GiocoDel15
if(GiocoDel15.riga!=0&& GiocoDel15.colonna!=0){// click dentro lo schema
for(int i=0; i<4; i++){// controllo in 4 direzioni predefinite in aControllo
if(GiocoDel15.iSequenza[aControllo[GiocoDel15.casella][i]]==0){// è la casella vuota, swap
GiocoDel15.iSequenza[aControllo[GiocoDel15.casella][i]]=GiocoDel15.iSequenza[GiocoDel15.casella];// scrivo il valore della casella cliccata nella casella vuota
GiocoDel15.iSequenza[GiocoDel15.casella]=0;// nella casella cliccata metto zero, lo swap è completo
Avevo immaginato che fosse "parente" di Sleep(), però nanosleep() non mi risulta in time.h
Magari perché è richiesta una versione più recente del compilatore?
Oppure perché non è strettamente standard ed esiste solo in alcune implementazioni?
Una funzione con una risoluzione del genere è senz'altro intrigante...
Avevo già provato io stesso a sostituire nanosleep() con Sleep() (tra l'altro, praticamente con gli stessi valori che suggerisci tu ora). Il programma vien compilato correttamente, il lancio riesce e il primo menù, quello nel quale viene chiesto di scegliere la versione del sistema operativo, risulta funzionante. La successiva schermata si apre con tutte le componenti grafiche apparentemente in ordine, però poi i comandi non "lavorano" come dovrebbero (nessuna area risulta sensibile al click).
Al solito, viviamo in un Mistero Insondabile.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Nel mio time.h c'è, sarà una questione di versioni.
Il codice l'ho provato sulla console di Win7 32bit e di Win10 64bit.
nella routine trovacasella c'è un printf remmato che mostra le variabili modificate dopo un click.
Se trovacaselle non viene eseguita il click del mouse nel while(1) non è stato intercettato:
Se trovacaselle viene eseguita devi verificare le coordinate restituite se cadono nel range di valori da me estrapolati.
Questo è il primo codice che ho scritto per verificare le coordinate del mouse nella finestra console.
Codice sorgente - presumibilmente C++
#include <windows.h>
constchar Titolo[]="TEST coordinate";
int main(){
SetConsoleTitle(Titolo);
HWND hwnd =0;
//attende la creazione della finestra
while(hwnd == 0)
hwnd = FindWindow(NULL, Titolo);
//-----------------------------------
POINT aCoor;
while(1){
system("cls");
GetCursorPos(&aCoor);
ScreenToClient(hwnd,&aCoor);// se eliminato le coordinate sono del desktop
printf("Posizione x = %d y = %d", aCoor.x, aCoor.y);
}
return0;
}
senza Sleep il loop viene eseguito milioni di volte al secondo, può causare il blocco della console se si esce con la x sulla console.
EDIT: scusa se scrivo una cosa scontata, ma è una possibilità del malfunzionamento:
Sleep(200), attende 200 ms.
sleep(200), attende 200 secondi, più di tre minuti...
Ultima modifica effettuata da Carlo il 25/01/2021 alle 16:19
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.