n° 219
Novembre 2017
Dicembre 16, 2017, 03:25:28 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Si può costruire un Direct Mode in C/C++ che eseguano singole righe ?  (Letto 1472 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« inserita:: Marzo 06, 2017, 08:07:37 »

Salve a tutti !
Ho costruito tre programmini che per funzionare devono essere contenuti nella stessa cartella , e inoltre devono avere un eseguibile .
Per fare questo i due programmi secondari vanno eseguiti anche se all'esecuzione crashano .
Fatto questo il programma principale all'esecuzione esegue i due eseguibili secondari passando loro dei parametri ed eseguendo il risultato dell'esecuzione nella stessa finestra console del programma principale .
Il secondo programma eseguibile si deve chiamare "printf.exe" e il terzo "for.exe" .
Programma principale:
Codice:
#include<stdio.h>
int main()
{
printf("Simulazione di Direct mode del basic\n");
system("START /ABOVENORMAL /SHARED /B printf.exe beppo63");
printf("\n");
system("START /ABOVENORMAL /SHARED /B /WAIT for.exe i 20 30 prova");
}

Secondo programma:
Codice:
#include<stdio.h>                     //Secondo programma
int main( int argc, char *argv[] )
{
    printf( "io sono %s\n", argv[1]);
}

Terzo programma:
Codice:
#include<stdio.h>                     //Secondo programma
int main( int argc, char *argv[] )
{

    for(argv[1]=atoi(argv[2]);argv[1]<=atoi(argv[3]);argv[1]++){printf("%d %s\n",argv[1],argv[4]);}
}
La mia domanda è , si può ottenere un eseguibile che esegua una linea qualsiasi del listato in fase di editazione ?
Ad esempio : system("START /ABOVENORMAL /SHARED /B /WAIT printf("Hello World"); ");
Qualunque suggerimento è ben accetto !
Ringrazio anticipatamente !
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #1 inserita:: Marzo 06, 2017, 08:09:46 »

Dimenticavo .
Io uso Code blocks 10.5 su Windows 7 a 64 bit !
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #2 inserita:: Marzo 06, 2017, 08:18:15 »

No, lascia perdere, non ricominciare con la fantaprogrammazione ...

Non inventare cose che non servono e che non si possono fare. Realizza programmi più concreti.
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +50/-1
Scollegato Scollegato

Messaggi: 2102



Mostra profilo WWW
« Risposta #3 inserita:: Marzo 08, 2017, 11:35:44 »

Citazione
La mia domanda è , si può ottenere un eseguibile che esegua una linea qualsiasi del listato in fase di editazione ?

Quello che vuoi fare, così come stai cercando di farlo, è completamente insensato.

Se vuoi creare un interprete, crea un interprete, nel modo in cui si scrivono gli interpreti. Suggerimenti:

1) Compra un buon libro di testo, che è la cosa che più ti serve. Il Dragon Book è Il Testo sulla creazione di compilatori e interpreti, per antonomasia, ma anche un equivalente ben scritto va bene.

2) Studia il libro al punto 1. Imparerai un sacco di cose: come scrivere un lexer, un parser, etc... soprattutto guarda bene come indentano il codice, che è una cosa con cui ancora hai dei problemi, nonostante i numerosi richiami.

3) Segui SOLO il libro. Non fare altro, se non quello che dice il libro, finché non l'hai finito.

4) Quando hai finito, sarai perfettamente in grado di scrivere un interprete che abbia un senso. Ma anche allora non sarà facile, e richiederà un mucchio di lavoro.


E' una via lunga e divertente, e non ci sono scorciatoie.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #4 inserita:: Marzo 08, 2017, 12:14:20 »

Non credo che la scrittura di un interprete C sia alla portata di beppo ... andiamo, lui dovrebbe cominciare dall'abc della programmazione C.

Non è bene porre limiti a nessuno ma a lui, per ora, servono libri DI BASE, tanti libri ...
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #5 inserita:: Agosto 09, 2017, 01:10:10 »

Salve ho trovato il sistema per eseguire singole righe di un programma principale però esso non solo è poco stabile ma ha bisogno che il computer trovi il compilatore fra le variabili d'ambiente .
Funziona si code block 10.5 su Windows 7
Codice:
#include <stdio.h>
#include <setjmp.h>
#define gosub(s){if(setjmp(GosubStack[GosubNdx++])==0)goto s;else{}}
#define Return longjmp (GosubStack [--GosubNdx],1 );
char *esegui_riga(char riga_estratta[]);
jmp_buf GosubStack[32];
int     GosubNdx;
char *creafile(char nomefile[],char parametro[],int flag);
char *legge_file_riga(char nome_file[],int n_riga);
char *strchr_(const char *s, int c);
char* accorcia_str_da_destra(char *a,int x);
int main()
  {  {  printf("Ciao !"); }
  {  printf("\nRiCiao !"); }
    char riga_estratta[900]="";
    int f;
    char stringa_temporanea[900]="";
    char c[900]="";
    char stringa_di_ritorno[900]="";
    //chamata di funzione che ritorna la righa
    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",25));


    printf("\nStringa commentata:\n%s\n",riga_estratta);
    ///   char c[]="printf("\nArrivederci !");";
    gosub(sottoprogramma_esegui_commento);

    printf("\n\nContinuazione programmadopo il gosub\n");

    //stampa del contenuto della variabile c
    printf("\nLa variabile c ora contiene:\n%s",c);
    strcpy(stringa_di_ritorno,creafile("prova.c","",0));
    strcpy(stringa_di_ritorno,creafile("prova.c",c,1));
    //compila e crea file .c
    system("gcc \"prova.c\" -o eseguibile.exe");
    //esegue file .c
    printf("\n\nEseguo contenuto della variabile c :\n");
    system("START /ABOVENORMAL /SHARED /B /WAIT eseguibile.exe");
    printf("\n");
    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",13));

    esegui_riga(riga_estratta);

    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",14));

    esegui_riga(riga_estratta);

    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",28));
    esegui_riga(riga_estratta);

    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",65));
    esegui_riga(riga_estratta);
    //printf("\nContenuto riga_estratta\n%s",riga_estratta);
    return 0;

  sottoprogramma_esegui_commento:
  for(f=0;f<=strlen(riga_estratta);f++)
      if(riga_estratta[f]=='/' && riga_estratta[f+1]=='/' && riga_estratta[f+2]=='/'){
         strcpy(stringa_temporanea,strchr_(riga_estratta,'\"'));
         strcpy(stringa_temporanea,accorcia_str_da_destra(stringa_temporanea,2));
         printf("\nContenuto stringa_temporanea estratta dalla riga commentata\n%s",stringa_temporanea);
         strcpy(c,stringa_temporanea);
  Return;
      }
printf("Fine");}

char *legge_file_riga(char nome_file[],int n_riga)
{
     char line[900];
     char bo[900]="";
     //int conta_righe=0;
     int c=0;
     FILE *fp;

     //tenta di aprire in lettura il file
     if (!(fp=fopen(nome_file,"r"))) {
         printf("Errore in apertura");
         return 1;
     }
while((fgets(line,900,fp))!=NULL) // fgets usa NULL per vedere se la lettura e' andata a buon fine, quindi a fine di ogni riga
 {
     //conta_righe++;
 c++;
if (c==n_riga){
    strcpy(bo,line);
    } //stampo
 }

     fclose (fp);
      bo[strlen(bo)-1]='\0';
     return bo;
}

char *strchr_(const char *s, int c)
 {
 const char ch = c;
 for ( ; (*s != ch) ; s++) if (*s == '\0') return 0;
 s++;
 return (char *)s;
 }

char* accorcia_str_da_destra(char *a,int x)
{
char *b=NULL;
int i,c;
c=strlen(a);
b=a;
if(x==0){return b;}
if(x==c){return "";}
if(x<=strlen(a)&&x!=0){for (i=x;i<=strlen(a);i--){a[strlen(a)-x]=a[i-1];}}
if(x>c&&x!=0){return "";}
return a;
}

char *strchr_isalpha(const char *s)
 {
 for ( ; (isalpha(*s)== 0) ; s++) if (*s == '\0') return 0;
 return (char *)s;
 }

char *creafile(char nomefile[],char parametro[],int flag)
{
   if(flag==0){
   FILE *stream;
   char list[900];
   int  i, numread, numwritten=0;
   /* Open file in text mode: */
   if( (stream = fopen( nomefile, "w+t" )) != NULL )
   {
         strcpy(list,"#include <stdio.h>\nint main()\n{\n");
      /* Write to stream */
      numwritten = fwrite( list, sizeof( char ), strlen(list), stream );
      //printf( "\nNumero di caratteri scritti %d\n", numwritten );
      fclose( stream );
      //return list;
   }
   else
      printf( "Problem opening the file\n" );
      fclose( stream );
   }
   if(flag==1){
       FILE *stream;
   char list[900];
   int  i, numread, numwritten=0;
   /* Open file in text mode: */
   if( (stream = fopen( nomefile, "a+t" )) != NULL )
   {
         strcpy(list,parametro);
         strcat(list,"\nreturn 0;");

      /* Write to stream */
      numwritten = fwrite( list, sizeof( char ), strlen(list), stream );

      strcpy(list,"\n}");

      numwritten = fwrite( list, sizeof( char ), strlen(list), stream );

      //printf( "Numero di caratteri scritti %d\n", numwritten );
      fclose( stream );
      return list; //in questo caso la stringa da ritornare è "\n}"
   }
   else
      printf( "Problem opening the file\n" );
      fclose( stream );
   }
      flag=0;
      return "";
}
char *esegui_riga(char riga_estratta[])
{
    int f,g,numero_parentesi=0;
    char stringa_temporanea[900]="";
    char stringa_di_ritorno[900]="";
    printf("\nRiga estratta dal file\n%s",riga_estratta);

    //se intruzioni sono dentro le parentesi allora
    for(f=0;f<=strlen(riga_estratta);f++){if(riga_estratta[f]=='{'||riga_estratta[f]=='}')numero_parentesi++;}
    for(f=0;f<=strlen(riga_estratta);f++){
    if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 != 0){printf("aa");strcpy(stringa_temporanea,strchr_(riga_estratta,'{'));break;}
    else if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 == 0){printf("bb");strcpy(stringa_temporanea,riga_estratta);break;}
    }
    numero_parentesi=0;

    for(f=0;f<=strlen(riga_estratta);f++){if(riga_estratta[f]=='{'||riga_estratta[f]=='}')numero_parentesi++;}
    for(f=0;f<=strlen(riga_estratta);f++){
    if(isalpha(riga_estratta[f]) && riga_estratta[strlen(riga_estratta)-1]==';'&& numero_parentesi==0){printf("yy");strcpy(stringa_temporanea,riga_estratta);break;}
    //else if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 == 0){printf("bb");strcpy(stringa_temporanea,riga_estratta);break;}
    }
    numero_parentesi=0;

    for(f=0;f<=strlen(riga_estratta);f++){if(riga_estratta[f]=='{'||riga_estratta[f]=='}')numero_parentesi++;}
    for(f=0;f<=strlen(riga_estratta);f++){
    if(isalpha(riga_estratta[f]) && riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi==1){printf("xx");strcpy(stringa_temporanea,accorcia_str_da_destra(riga_estratta,1));break;}
    //else if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 == 0){printf("bb");strcpy(stringa_temporanea,riga_estratta);break;}
    }
    numero_parentesi=0;


continuo:
         printf("\n\nRiga pulita :\n%s",stringa_temporanea);

         strcpy(stringa_di_ritorno,creafile("prova.c","",0));
    //printf("aaaaa%s",stringa_di_ritorno);
    strcpy(stringa_di_ritorno,creafile("prova.c",stringa_temporanea,1));
 //compila e crea file .c
    system("gcc \"prova.c\" -o eseguibile.exe");
//esegue file .c
    printf("\n\n\nEseguo riga :\n");
    system("START /ABOVENORMAL /SHARED /B /WAIT eseguibile.exe");
    printf("\n");

         return stringa_temporanea;
}
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #6 inserita:: Agosto 09, 2017, 01:11:52 »

Salve ho trovato il sistema per eseguire singole righe di un programma principale però esso non solo è poco stabile ma ha bisogno che il computer trovi il compilatore fra le variabili d'ambiente .
Funziona si code block 10.5 su Windows 7
Codice:
#include <stdio.h>
#include <setjmp.h>
#define gosub(s){if(setjmp(GosubStack[GosubNdx++])==0)goto s;else{}}
#define Return longjmp (GosubStack [--GosubNdx],1 );
char *esegui_riga(char riga_estratta[]);
jmp_buf GosubStack[32];
int     GosubNdx;
char *creafile(char nomefile[],char parametro[],int flag);
char *legge_file_riga(char nome_file[],int n_riga);
char *strchr_(const char *s, int c);
char* accorcia_str_da_destra(char *a,int x);
int main()
  {  {  printf("Ciao !"); }
  {  printf("\nRiCiao !"); }
    char riga_estratta[900]="";
    int f;
    char stringa_temporanea[900]="";
    char c[900]="";
    char stringa_di_ritorno[900]="";
    //chamata di funzione che ritorna la righa
    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",25));


    printf("\nStringa commentata:\n%s\n",riga_estratta);
    ///   char c[]="printf("\nArrivederci !");";
    gosub(sottoprogramma_esegui_commento);

    printf("\n\nContinuazione programmadopo il gosub\n");

    //stampa del contenuto della variabile c
    printf("\nLa variabile c ora contiene:\n%s",c);
    strcpy(stringa_di_ritorno,creafile("prova.c","",0));
    strcpy(stringa_di_ritorno,creafile("prova.c",c,1));
    //compila e crea file .c
    system("gcc \"prova.c\" -o eseguibile.exe");
    //esegue file .c
    printf("\n\nEseguo contenuto della variabile c :\n");
    system("START /ABOVENORMAL /SHARED /B /WAIT eseguibile.exe");
    printf("\n");
    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",13));

    esegui_riga(riga_estratta);

    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",14));

    esegui_riga(riga_estratta);

    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",28));
    esegui_riga(riga_estratta);

    strcpy(riga_estratta,legge_file_riga("assegnamento con dentro virgolette buono.c",65));
    esegui_riga(riga_estratta);
    //printf("\nContenuto riga_estratta\n%s",riga_estratta);
    return 0;

  sottoprogramma_esegui_commento:
  for(f=0;f<=strlen(riga_estratta);f++)
      if(riga_estratta[f]=='/' && riga_estratta[f+1]=='/' && riga_estratta[f+2]=='/'){
         strcpy(stringa_temporanea,strchr_(riga_estratta,'\"'));
         strcpy(stringa_temporanea,accorcia_str_da_destra(stringa_temporanea,2));
         printf("\nContenuto stringa_temporanea estratta dalla riga commentata\n%s",stringa_temporanea);
         strcpy(c,stringa_temporanea);
  Return;
      }
printf("Fine");}

char *legge_file_riga(char nome_file[],int n_riga)
{
     char line[900];
     char bo[900]="";
     //int conta_righe=0;
     int c=0;
     FILE *fp;

     //tenta di aprire in lettura il file
     if (!(fp=fopen(nome_file,"r"))) {
         printf("Errore in apertura");
         return 1;
     }
while((fgets(line,900,fp))!=NULL) // fgets usa NULL per vedere se la lettura e' andata a buon fine, quindi a fine di ogni riga
 {
     //conta_righe++;
 c++;
if (c==n_riga){
    strcpy(bo,line);
    } //stampo
 }

     fclose (fp);
      bo[strlen(bo)-1]='\0';
     return bo;
}

char *strchr_(const char *s, int c)
 {
 const char ch = c;
 for ( ; (*s != ch) ; s++) if (*s == '\0') return 0;
 s++;
 return (char *)s;
 }

char* accorcia_str_da_destra(char *a,int x)
{
char *b=NULL;
int i,c;
c=strlen(a);
b=a;
if(x==0){return b;}
if(x==c){return "";}
if(x<=strlen(a)&&x!=0){for (i=x;i<=strlen(a);i--){a[strlen(a)-x]=a[i-1];}}
if(x>c&&x!=0){return "";}
return a;
}

char *strchr_isalpha(const char *s)
 {
 for ( ; (isalpha(*s)== 0) ; s++) if (*s == '\0') return 0;
 return (char *)s;
 }

char *creafile(char nomefile[],char parametro[],int flag)
{
   if(flag==0){
   FILE *stream;
   char list[900];
   int  i, numread, numwritten=0;
   /* Open file in text mode: */
   if( (stream = fopen( nomefile, "w+t" )) != NULL )
   {
         strcpy(list,"#include <stdio.h>\nint main()\n{\n");
      /* Write to stream */
      numwritten = fwrite( list, sizeof( char ), strlen(list), stream );
      //printf( "\nNumero di caratteri scritti %d\n", numwritten );
      fclose( stream );
      //return list;
   }
   else
      printf( "Problem opening the file\n" );
      fclose( stream );
   }
   if(flag==1){
       FILE *stream;
   char list[900];
   int  i, numread, numwritten=0;
   /* Open file in text mode: */
   if( (stream = fopen( nomefile, "a+t" )) != NULL )
   {
         strcpy(list,parametro);
         strcat(list,"\nreturn 0;");

      /* Write to stream */
      numwritten = fwrite( list, sizeof( char ), strlen(list), stream );

      strcpy(list,"\n}");

      numwritten = fwrite( list, sizeof( char ), strlen(list), stream );

      //printf( "Numero di caratteri scritti %d\n", numwritten );
      fclose( stream );
      return list; //in questo caso la stringa da ritornare è "\n}"
   }
   else
      printf( "Problem opening the file\n" );
      fclose( stream );
   }
      flag=0;
      return "";
}
char *esegui_riga(char riga_estratta[])
{
    int f,g,numero_parentesi=0;
    char stringa_temporanea[900]="";
    char stringa_di_ritorno[900]="";
    printf("\nRiga estratta dal file\n%s",riga_estratta);

    //se intruzioni sono dentro le parentesi allora
    for(f=0;f<=strlen(riga_estratta);f++){if(riga_estratta[f]=='{'||riga_estratta[f]=='}')numero_parentesi++;}
    for(f=0;f<=strlen(riga_estratta);f++){
    if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 != 0){printf("aa");strcpy(stringa_temporanea,strchr_(riga_estratta,'{'));break;}
    else if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 == 0){printf("bb");strcpy(stringa_temporanea,riga_estratta);break;}
    }
    numero_parentesi=0;

    for(f=0;f<=strlen(riga_estratta);f++){if(riga_estratta[f]=='{'||riga_estratta[f]=='}')numero_parentesi++;}
    for(f=0;f<=strlen(riga_estratta);f++){
    if(isalpha(riga_estratta[f]) && riga_estratta[strlen(riga_estratta)-1]==';'&& numero_parentesi==0){printf("yy");strcpy(stringa_temporanea,riga_estratta);break;}
    //else if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 == 0){printf("bb");strcpy(stringa_temporanea,riga_estratta);break;}
    }
    numero_parentesi=0;

    for(f=0;f<=strlen(riga_estratta);f++){if(riga_estratta[f]=='{'||riga_estratta[f]=='}')numero_parentesi++;}
    for(f=0;f<=strlen(riga_estratta);f++){
    if(isalpha(riga_estratta[f]) && riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi==1){printf("xx");strcpy(stringa_temporanea,accorcia_str_da_destra(riga_estratta,1));break;}
    //else if(riga_estratta[f]=='{'&& riga_estratta[strlen(riga_estratta)-1]=='}'&& numero_parentesi % 2 == 0){printf("bb");strcpy(stringa_temporanea,riga_estratta);break;}
    }
    numero_parentesi=0;


continuo:
         printf("\n\nRiga pulita :\n%s",stringa_temporanea);

         strcpy(stringa_di_ritorno,creafile("prova.c","",0));
    //printf("aaaaa%s",stringa_di_ritorno);
    strcpy(stringa_di_ritorno,creafile("prova.c",stringa_temporanea,1));
 //compila e crea file .c
    system("gcc \"prova.c\" -o eseguibile.exe");
//esegue file .c
    printf("\n\n\nEseguo riga :\n");
    system("START /ABOVENORMAL /SHARED /B /WAIT eseguibile.exe");
    printf("\n");

         return stringa_temporanea;
}
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #7 inserita:: Agosto 09, 2017, 03:09:15 »

Bentornato beppo...!

Non hai risolto un bel niente, come sempre, con la tua fantaprogrammazione sballata piena di errori e assurdità ... ma buone ferie anche a te ... ne hai proprio bisogno ... ! 😄
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #8 inserita:: Agosto 09, 2017, 03:38:51 »

festeggiamo i 100 smite
Registrato

Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines