Codice C (non C++) con IDE di Visual Studio 2019. Si può?

di il
17 risposte

Codice C (non C++) con IDE di Visual Studio 2019. Si può?

Qualcuno sa se è possibile usare l'IDE di Micorsoft Visual Studio per scrivere codice in C (non C++, )?
Mi appare il main tipico del C++ e nonostante qui https://docs.microsoft.com/it-it/cpp/build/vscpp-step-0-installation?view=msvc-160
si parli di C e C++ e nelle proprietà del progetto appaia anche un'impostazione che parla di C/C++ (vedi foto) , del C neanche l'ombra.
Grazie a chi potra delucidarmi
PropC.png
PropC.png

17 Risposte

  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Basta usare l'estensione ".c" e NON ".cpp" o ".cxx" o ".c++"

    MA la domanda sorge spontanea:

    1) POICHE' il C e un SUBSET del C++, E
    2) POICHE' il compilatore per il C++ fa MOOLTI piu' controlli di quelli che vengono fatti per il C E
    3) POICHE' piu' controlli vuol dire trovare piu' errori E
    4) POICHE' per scrivere in C BASTA NON USARE i costrutti del C++ (fondamentalmente TUTTO quello che riguardano i template,"class", le classi in generale, i namespace E OVVIAMENTE il namespace "std" o "boost" o ...) E
    5) POICHE' se scrivi codice alla C e il compilatore C++ lo compila, allora SICURAMENTE lo compila anche il compilatore C

    6) PERCHE' questa domanda ????
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Basta cambiare i sorgenti in .c ma è C89, roba di trent'anni fa. Se devi fare qualcosa di serio cambia compilatore
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Mi serve per fare delle prove per un esame all'università.
    Per quanto riguarda l'IDE pensavo che mi potesse dare già un codice di partenza specifico C, invece mette ad esempio cout, non mette gli include standard del C ecc.ecc.

    Comunque ho copiato pari pari un codice C funzionante che avevo sul compilatore "onlinegdb" ma mi segnala un bel po di warning per
    scanf, fopen, fscanf, ecc..
    Ad esempio
    Errore	C4996	'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 
    oppure in
    FILE *Aprifile(char InpFile[], char* modal); //dichiarazione di funzione
    FILE* pf = Aprifile(InpFile, "r"); //Apre file in lettura 
    
    // qui mi segnala
    //Errore (attivo)	E0167	l'argomento di tipo "const char *" è incompatibile con il parametro di tipo "char *"
    //Errore	C2664	'FILE *Aprifile(char [],char *)': impossibile convertire l'argomento 2 da 'const char [2]' a 'char *'
    Spero si possano togliere seguendo questo
    (To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    All'università usano gcc di solito. Devi installare MinGW o Cygwin, e come IDE Netbeans, CodeBlocks o altro
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Sabo ha scritto:


    Comunque ho copiato pari pari un codice C funzionante che avevo sul compilatore "onlinegdb" ma mi segnala un bel po di warning per
    scanf, fopen, fscanf, ecc..
    ...
    Quelle funzioni non sono sicure e il loro uso è scoraggiato.

    Inserisci all'inizio del codice la linea

    #pragma warning(disable:4996)

    Inoltre, nelle proprietà generali, cambia il set di caratteri da Unicode a Multibyte
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Weierstrass ha scritto:


    All'università usano gcc di solito. Devi installare MinGW o Cygwin, e come IDE Netbeans, CodeBlocks o altro
    lE' vero, ma sono molto scomodi. Mi trovo meglio con Visual Studio che uso con VB.NET.

    oregon ha scritto:


    Inserisci all'inizio del codice la linea
    #pragma warning(disable:4996)
    Inoltre, nelle proprietà generali, cambia il set di caratteri da Unicode a Multibyte
    Si avevo già messo questa linea e ora ho fatto il cambio set che mi hai suggerito e non mi compaiono piu la maggior parte dei wairning.
    Mi rimangono solo questi due . Il primo è relativo alla funzione Aprifile che ho postato piu su (che nell'altro compilatore funziona)
    errori.png
    errori.png

  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Ti trovi meglio con Visual Studio, ma la Microsoft fa quello che vuole lei col C, mica segue gli standard. Al esempio i VLA non ci sono. Poi fai quello che credi giusto
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Sono programmini molto semplici... Qualche ciclo, e qualche array. Mi trovo anche col compilatore online "onlinegdb" ma spesso ha problemi di connessione col server percio volevo provare a usare Visual studio ma mi sa che desisterò.
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Con la 2015 non avviene. Prova semplicemente ad aggiungere

    FILE *Aprifile(char InpFile[], const char* modal)
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    oregon ha scritto:


    Con la 2015 non avviene. Prova semplicemente ad aggiungere

    FILE *Aprifile(char InpFile[], const char* modal)
    Si. Cosi funziona.
    Rimane solo questo Cl.ex termonato col codice 2
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    Esattamente che versione hai del VS2019?
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    16.8
    community (la free)
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    E' un bug del compilatore (potresti iniziare ad aggiornarlo alla 16.8.4)

    Mostra tutto il codice effettivamente utilizzato.
  • Re: Codice C (non C++) con IDE di Visual Studio 2019. Si può?

    oregon ha scritto:


    E' un bug del compilatore (potresti iniziare ad aggiornarlo alla 16.8.4)
    Si ho la 16.8.4

    oregon ha scritto:


    Mostra tutto il codice effettivamente utilizzato.
    Eccolo
    /* LOGICA DELLA SEQUENZA DELLE OPERAZIONI DEL PROGRAMMA
    Richiede nomefile input e di  output
    FUNCTION Aprifile input che restituisce il puntatore al file
    FUNCTION letturaValori(puntatore al file)
    legge e riempie i due vettori V1 e V2
    FUNCTION CreaVettoreUnione()
    Crea il vettore Unione(V3) e memorizza i doppioni
    FUNCTION StampaFile()
    Scive su file il vettore Unione(V3)
    A video mostra numero di doppioni */
    
    #pragma warning(disable : 4996)
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // VARIABILI GLOBALI
    int V1[20], V2[20], V3[40];
    // V1 e V2 sono i due vettori letti, V3 è il vettore unione risultante
    
    int lun_vet1 = 0, lun_vet2 = 0, lun_vet3 = 0;
    // lunghezza dei vettori V1, V2 e V3
    
    char InpFile[20], OutFile[20];   // Nomi dei due file da leggere e da scrivere
    int uguaglianze = 0;              // memorizza quante ugualglainze ci sno tra i due vettori
    
    //DICHIARAZIONI DELLE FUNZIONI
    FILE *Aprifile(char InpFile[], const char* modal);
    void LetturaValori(FILE* pf);
    void CreaVettoreUnione();
    void StampaFile(FILE *pf);
    //==================================================================
    
    int main()
    {
        // Richiede nomefile input e di  output
        printf("\nDigitare nome del file in input: ");
        scanf("%s", InpFile);
        printf("\nDigitare nome del file in output: ");
        scanf("%s", OutFile);
    
        FILE* pf = Aprifile(InpFile, "r"); //Apre file in lettura
    
        LetturaValori(pf); // riempie V1 e V2 
    
        CreaVettoreUnione(); // Crea il vettore unione (V3)
    
        pf = Aprifile(OutFile, "w"); // apre file in scrittura
    
        StampaFile(pf); // Scrive il vetrore unine nel file di output
    
        printf("\nSi sono verificate %d ripetizioni", uguaglianze);
        printf("\nELABORAZIONE TERMINATA");
    
        return 0;
    
    }
    //==============================================================================
    
    
    //==============================================================================
    FILE* Aprifile(char File[], const char* modal)
    {
        FILE* pf;
        char mod[1];
    
        pf = fopen(File, modal);
        if (pf == NULL)
        {
            perror("SI è VERIFICATO UN ERRORE DURANTE L'APERTURA DEL FILE: ");
            exit(1);
        }
        return pf; // restituisce il puntatore al file
    }
    //=======================================================
    
    
    //=======================================================
    void LetturaValori(FILE* pf)
    /* riceve in input il puntatore al file
       legge le due righe del file e provvede al
       riempimento con valori dei due vettori V1 e V2*/
    {
    
        int i;
    
        fscanf(pf, "%d", &lun_vet1);
        for (i = 0; i < lun_vet1; i++)
            fscanf(pf, "%d", &V1[i]);
    
        fscanf(pf, "%d", &lun_vet2);
        for (i = 0; i < lun_vet2; i++)
            fscanf(pf, "%d", &V2[i]);
    
        fclose(pf);
    }
    //==============================================================================
    
    void CreaVettoreUnione()
    
    // Crea il vettore unione ordinato e senza doppioni
    // e rileva quante uguaglianze ci sono tra i due vettori
    {
        int i1 = 0, i2 = 0;
        int Ult = 0, j = 0;
    
        while (i1 < lun_vet1 && i2 < lun_vet2)
        {
            if (V1[i1] <= V2[i2])
            {
                if (V1[i1] > Ult)     // se non è un valore gia memorizzato
                {
                    V3[j] = V1[i1];   // scrive valore nel vettore Unione
                    Ult = V1[i1];     // memorizza l'ultimo valore immesso
                    j++;
                }
                else
                    uguaglianze++;   // aggiunge un doppione
                i1++;
            }
            else
            {
                if (V2[i2] > Ult)
                {
                    V3[j] = V2[i2];  //scrive valore nel vettore Unione
                    Ult = V2[i2];
                    j++;
                }
                else
                    uguaglianze++;   //aggiunge un doppione
                i2++;
            }
        }
    
        //scrive i restanti numeri. Solo una di queste coindizioni risulterà vera
        // perchè una di esse è sicuro falsa essendo usciti dal while
        while (i1 < lun_vet1)
        {
            V3[j] = V1[i1];
            i1++;
            j++;
        }
        while (i2 < lun_vet2)
        {
            V3[j] = V2[i2];
            i2++;
            j++;
        }
    
        lun_vet3 = j; // Quantità elementi contenuti nel vettore unione
    }
    //==============================================================================
    void CreaVettoreUnione1()
    // prove di modifica per otimizzarlo ma non controlla doppioni immessi
    // Crea il vettore unione ordinato e senza doppioni
    // e rileva quante uguaglianze ci sono tra i due vettori
    {
        int i1 = 0, i2 = 0;
        int Ult = 0, j = 0;
    
        while (i1 < lun_vet1 && i2 < lun_vet2)
        {
            if (V1[i1] == V2[i2])
            {
                uguaglianze++;   // aggiunge un doppione
                V3[j] = V1[i1];   // scrive valore nel vettore Unione
                j++, i1++, i2++;
            }
            else if (V1[i1] < V2[i2])
            {
                V3[j] = V1[i1];   // scrive valore nel vettore Unione
                j++, i1++;
            }
            else
            {
                V3[j] = V2[i2];   // scrive valore nel vettore Unione
                j++, i2++;
            }
        }
    
        //scrive i restanti numeri. Solo una di queste coindizioni risulterà vera
        // perchè una di esse è sicuro falsa essendo usciti dal while
        while (i1 < lun_vet1)
        {
            V3[j] = V1[i1];
            i1++;
            j++;
        }
        while (i2 < lun_vet2)
        {
            V3[j] = V2[i2];
            i2++;
            j++;
        }
    
        lun_vet3 = j; // Quantità elementi contenuti nel vettore unione
    }
    //==============================================================================
    
    
    //==============================================================================
    void StampaFile(FILE* pf)
    {
        int i;
    
        fprintf(pf, "%d\t", lun_vet3);
        for (i = 0; i < lun_vet3; i++)
            fprintf(pf, "%d ", V3[i]);
    
        fclose(pf);
    }
    //==============================================================================
Devi accedere o registrarti per scrivere nel forum
17 risposte