Visual c++

Non solo. Una libreria C/C++ comprende diverse componenti, fra cui file .h contenenti dichiarazioni e definizioni di funzioni e strutture dati fornite dalla libreria.

Premesso che ho abbandonato il C++ una decina d’anni fa perché lo consideravo troppo complesso, se il tuo file .h si trova nella stessa cartella dei sorgenti del tuo programma dovresti essere in grado di includerne le dichiarazioni/definizioni con:

#include "mioh.h"

Paolo Amoroso

Sembra che ti manchi una libreria di sistema Windows per la gestione di databse, ODBC.

Paolo Amoroso

fantastico e come le installo?

Sto provando a reinstallare tutto visual c++.

Piccolo aiuto: sto provando la funzione printf e scanf:

[code]
#include
#include <stdio.h>
#include <stdarg.h>

using namespace std;
int main()
{
FILE * tre;
tre = fopen (“C:\tre.txt”,“r”);

cout<<tre;
system ("pause");
return 0;

}[/code]

Nel file tre.txt ho scritto il numero 3.
Ora quando eseguo il programma mi appare 00000000…ho pensato che non fosse il contenuto della variabile tre ma la posizione giusto? E per mostrare il contenuto?

No, è l’indicatore del file. Fopen apre file e ritorna un puntatore al file, a cui a accedi come se fosse uno stream.

Per leggere il contenuto del file usa la funzione sscanf() (ad esempio).

Non credo che l’approccio piu’ giusto a questo problema sia porre domande COSI’ specifiche e attendere le risposte.
Rischi solo di aumentare la confusione che hai in testa.

Non credo che l'approccio piu' giusto a questo problema sia porre domande COSI' specifiche e attendere le risposte. Rischi solo di aumentare la confusione che hai in testa.

Si hai ragione sto andando ora a prendere un libro di c++ in biblioteca se lo trovo.
Il fatto è che stavo cercando di capire il codice che mi devo studiare e mi ero blaccato su queste funzioni (open,scanf,printf), e mi sono iniziato a vedere come funzionassero (e l’ho quasi capito). Però come dici tu non è il modo giusto.

Vediamo se con una bella guida mi chiarisco le idee

Controlla i tuoi PM tra qualche istante

Purtroppo non sono in grado di darti indicazioni su Windows, che ormai non conosco quasi più. Per quanto ne so i driver ODBC dovrebbero essere inclusi nell’installazione base di Windows.

L’intuizione mi sembra ragionevole. Prova con:

ofstream tre; tre.open ("C:\tre.txt"); tre << "3" << endl; tre.close();

Paolo Amoroso

mmm…troppa sintassi che non conosco. Io stavo provando cosi

[code]#include
#include <stdio.h>

using namespace std;

int main()
{
FILE * tre;
int a;
tre = fopen (“C:\tre.txt”,“r”);
if (tre != NULL)
{
fscanf(tre,“u”,&a);
printf(“il numero è %u”,a);
}
else{
cout<<“errore\n\n”;
}
system (“pause”);
return 0;
}
[/code]

e mi da sempre errore. Significa che dal file tre.txt non legge proprio??

Cmq passerò questi giorni a studiarmi qualche manuale di c++ :sunglasses: :sunglasses:

Anch’io ti consiglio di leggerti un buon libro sul C++, all’inizio ti annoierai un po’ ma sono sicuro che ti aiuterà parecchio…

sto iniziando a capirci qualcosa. Ho trovato molto complicato un pò di cose, io le chiedo se a qualcuno va di rispondere… :clap: :clap: :clap:

1)i puntatori, non ne capisco il senso. sono delle entità che invece di memorizzare un dato memorizzano l’indirizzo di un altra variabile? La cosa utile qual’è?

2)con questa libreria (libreria giusto?) posso fare molte operazioni sui file in I/O. Siccome a me in particolare per ora serve sapere prendere dei dati da un file e salvarli in un array, mi sto concentrando sulle funzioni:
scanf
printf
fopen

Ho visto molti esempi su vari libri che utilizzano maggiormente le funzioni fgets e fputs per prendere/inviare i dati tipo qui http://www.cplusplus.com/reference/clibrary/cstdio/FILE.html , vediamo se inizio a capire qualcosa di codice :

[code]
#include <stdio.h>

int main()
{
FILE * pFile;
char buffer [100];

pFile = fopen (“myfile.txt” , “r”);
if (pFile == NULL) perror (“Error opening file”);
else
{
while ( ! feof (pFile) )
{
fgets (buffer , 100 , pFile);
fputs (buffer , stdout);
}
fclose (pFile);
}
return 0;
}[/code]

FILE è il tipo di indicatore che devo usare per questa libreria, e cosi crea un puntatore su pFile.
Dopo crea un array buffer di tipo char con 100 posizioni. L’azione seguente legge (perche c’è la r) il file “myfile.txt”, poi mette una condizione di if else in caso il file fosse vuoto ed infine con fgets prende il file buffer e ci mette il contenuto di pFile.
Con fputs invece legge ciò che c’è in buffer e lo scrive in stdout (che deve essere di tipo FILE), e poi chiude pFile.
Giusto?

  1. Qui posto il pezzo di codice che sto cercando di capire :
float a,b;

FILE *fp1;
fp1 = fopen("c:\seat.txt","r");

    int i;
    for(i=0;i<MAX_INT;i++){
fscanf(fp1,"%f  %f \n",&a, &b);
tempo[i]=a;
accz[i]=b;
com_accz[i].re=b;
com_accz[i].im=0.000000000000;
printf("%f  %f  \n",tempo[i], com_accz[i]);
    }

Anche qui apre un file .txt come prima, ma poi con fscanf legge fp1 e lo immagazzina in a e b, sotto il tipo float (la %f).
Invece con printf stampa i valori float di tempo[i] e com_accz[i], ed essendo un ciclo ed essendoci \n verranno due colonne di dati giusto?

Premetto che non ho il file seat.txt ma lo avevo visto ed era anch’esso un due colonne di numeri reali (con decimali…quindi float è giusto).

Questa è una mia aggiunta fatta ora per vedere se ho capito delle funzioni:

float a,b;

FILE *fp1;
FILE *uscita;  // ho messo un altro puntatore di tipo FILE per il file di output

uscita = fopen("c:\uscita.txt","w");
fp1 = fopen("c:\seat.txt","r");

    int i;
    for(i=0;i<MAX_INT;i++){
fscanf(fp1,"%f  %f \n",&a, &b);
tempo[i]=a;
accz[i]=b;
com_accz[i].re=b;
com_accz[i].im=0.000000000000;
printf("%f  %f  \n",tempo[i], com_accz[i]);

fprintf (uscita, "Valori di a e b |n", a, b); // trascurando il significato dell'operazione di estrarre a e b
    }

Praticamente mi si crea un file uscita.txt con all’interni due colonne di valori a e b giusto?

Il puntatore non è utile, è essenziale :slight_smile: E` uno dei pochi tipi di dati su cui le CPU possono operare più o meno direttamente. I puntatori sono i mattoni di base per costruire strutture dati complesse. Servono inoltre per accedere a risorse hardware.

Alcuni linguaggi di programmazione ad alto livello di astrazione (es. Java) nascondono questa complessità eliminando i puntatori. Non è purtroppo il caso di linguaggi a più basso livello come C/C++, per usare i quali è meglio iniziare ad andare d’accordo con i puntatori (vedi in particolare la sezione Architectural roots).

Paolo Amoroso

Ciao con un puntatore definisco l’indirizzo di memoria di una certo oggetto (poniamo una variabile) e poi è possibile per esempio variare il valore della posizione a cui punta con un’azione di deferencing, giusto?
E a quanto leggo praticamente sono insensibili alla visibilità, mamma mia che brutta frase. Cioè anche in funzioni diverse l’indirizzo di memoria è lo stesso e quindi posso richiamarlo?

Dai qualcosina sto capendo :flushed:

Ni. La dereferenziazione accede all’oggetto puntato senza modificare il puntatore. Le operazioni aritmetiche sui puntatori, che ne modificano il valore, permettono di accedere ad altri oggetti collegati (es. elementi successivi di un array).

Sì.

Paolo Amoroso

Che spettacolo sono riuscito a far girare questo:

[code]#include
#include <stdio.h>

using namespace std;

int main ()
{
FILE* lettura;
FILE* uscita;
int a=0;
lettura = fopen(“c:/number.txt”,“r”);
uscita = fopen(“c:/uscita.txt”,“w”);
rewind (lettura);
fscanf (lettura,"%d",&a);
fclose (lettura);
fprintf(uscita,“Il numero è “,a);
cout<<a<<”\n”;
system (“pause”);
return(0);
}[/code]

:nerd: :nerd: :nerd:

Consiglio vivamente il libro “The Practice of Programming” di Kernighan e Pike (sito ufficiale).

Paolo Amoroso

Come detto sopra i puntatori sono fondamentali!
Ti permettono il passaggio per riferimento e non per valore alle funzioni cosa che è essenziale per programmi complessi!
Ti permettono inoltre di lavorare su oggetti complessi e non semplici variabili!
E’ necessario capire il loro funzionamento altrimenti è dura programmare in modo efficiente in C/C++
In pratica li puoi interpretare per quello che sono: una variabile in cui hai l’indirizzo di memoria in cui ci sono i dati che ti interessano
A questo punto puoi farci quel che ti pare:

  • operare sui dati reali usando il riferimento e magari far fare operazioni di modifica su quei dati a funzioni, se lo fai con semplici variabili, queste non varieranno il valore della variabile globale
  • operare sull’indirizzo per accedere per esempio direttamente al prossimo valore di un array o al decimo etc. Già gli array sono dei puntatori in realtà…

Ok grazie a tutti per le risposte.
Per ora mi sono preso un libro in biblio e in più consulto quelli che mi avete consigliato. Sto iniziando a capire le varie funzioni e la filosofia.

Ma nel frattempo cerco anche di capire i due progetti che possiedo e smanetto anche con alcune prove che faccio.

Tipo ho capito che le funzioni printf, scanf, fopen, fclose… fanno parte della libreria stdio mentre cout,cin…della libreria iostream, e l’uso di altre funzioni di altre librerie tipo la imsl, per fare le trasformate di Fourier ecc ecc.

C’è però un problema pratico che non riesco a superare e che per voi sarà invece routine. Se dovete includere nel vostro programma una libreria che vi viene fornita esternamente quali passi seguite per includerla??
Io ho allegato alla cartella IMSL un file dove sono indicate le operazioni da compiere ma non sono così intuitive e in ogni caso il programma non mi gira.

Mi potreste dire voi cosa fate quando dovete includere una libreria?

ahahahahhahahaahaaahhahaha :facepunch: :facepunch: :facepunch: :facepunch: :facepunch: :facepunch: ci sono riuscito. Dannate librerie.

Mancava questa http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist

la platform SDK, e poi ho capito come si devono integrare nelle opzioni del programma.

Ok adesso non mi funziona il programma del prof non so per quale motivo ma adesso posso continuare a studiare i libri più serenamente :grin: :grin:

Ok mi parte il programma della phidget mentre per quello del prof ho ancora problemi, mi da questo errore:

La libreria di runtime di Microsoft Visual Studio C ha rilevato un errore irreversibile in (nome file)

Cosa dovrei fare secondo voi?

cioè se faccio genera mi da :

Generazione: 1 completate, 0 non riuscite, 0 aggiornate, 0 ignorate

Mentre se faccio avvia mi dà quell’errore e blocca il programma. Però se poi vado a far partire il file .exe che mi ha creato mi funziona, anche se non perfettamente. Deve lavorare dei dati e poi si deve fermare e farmi vedere i risultati a video; invece parte fa l’analisi, vedo mentre fa i calcoli e poi in automatico chiude la finestra di comando. :ambulance: :ambulance: