View Full Version : A tutti i programmatori di C++ .Urgente !!!
Tenete presente la funzione gotoxy del Pascal o del C che serve a posizionarsi su un punto dello schermo ? Bene utilizzo Visual C++ . Net e tale funzione non riesco a trovarla . Nelle altre versioni era presente nella conio.h ma questa volta no . Infatti nonostante la includi gotoxy non sà proprio di cosa si tratti . Per favore aiutatemi . Grazie .
Purtroppo è ancora un mistero... Non sono riuscito a trovarla...
gotoxy non è una funzione standard e per questo non c'è (anche nel 6 non c'è)...
Una cosa che ci si avvicina molto è questa...
#include <windows.h>
void NewLine(void);
void ScrollScreenBuffer(HANDLE, INT);
HANDLE hStdout, hStdin;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
void main(void)
{
LPSTR lpszPrompt1 = "Type a line and press Enter, or q to quit: ";
LPSTR lpszPrompt2 = "Type any key, or q to quit: ";
CHAR chBuffer[256];
DWORD cRead, cWritten, fdwMode, fdwOldMode;
WORD wOldColorAttrs;
// Get handles to STDIN and STDOUT.
hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "GetStdHandle", "Console Error", MB_OK);
return;
}
// Save the current text colors.
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, "GetConsoleScreenBufferInfo", "Console Error", MB_OK);
return;
}
wOldColorAttrs = csbiInfo.wAttributes;
// Set the text attributes to draw red text on black background.
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED|FOREGROUND_INTENSITY))
{
MessageBox(NULL, "SetConsoleTextAttribute", "Console Error", MB_OK);
return;
}
// Write to STDOUT and read from STDIN by using the default
// modes. Input is echoed automatically, and ReadFile
// does not return until a carriage return is typed.
//
// The default input modes are line, processed, and echo.
// The default output modes are processed and wrap at EOL.
while (1)
{
if (! WriteFile(
hStdout, // output handle
lpszPrompt1, // prompt string
lstrlen(lpszPrompt1), // string length
&cWritten, // bytes written
NULL) ) // not overlapped
{
MessageBox(NULL, "WriteFile", "Console Error", MB_OK);
return;
}
if (! ReadFile(
hStdin, // input handle
chBuffer, // buffer to read into
255, // size of buffer
&cRead, // actual bytes read
NULL) ) // not overlapped
break;
if (chBuffer[0] == 'q') break;
}
// Turn off the line input mode, and echo the input mode.
if (! GetConsoleMode(hStdin, &fdwOldMode))
{
MessageBox(NULL, "GetConsoleMode", "Console Error", MB_OK);
return;
}
fdwMode = fdwOldMode &
~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if (! SetConsoleMode(hStdin, fdwMode))
{
MessageBox(NULL, "SetConsoleMode", "Console Error", MB_OK);
return;
}
// Without line and echo input modes, ReadFile returns
// when any input is available. Carriage returns must
// be handled, and WriteFile is used to echo input.
NewLine();
while (1)
{
if (! WriteFile(
hStdout, // output handle
lpszPrompt2, // prompt string
lstrlen(lpszPrompt2), // string length
&cWritten, // bytes written
NULL) ) // not overlapped
{
MessageBox(NULL, "WriteFile", "Console Error", MB_OK);
return;
}
if (! ReadFile(hStdin, chBuffer, 1, &cRead, NULL))
break;
if (chBuffer[0] == '\r')
NewLine();
else if (! WriteFile(hStdout, chBuffer, cRead,
&cWritten, NULL)) break;
else
NewLine();
if (chBuffer[0] == 'q') break;
}
// Restore the original console mode.
SetConsoleMode(hStdin, fdwOldMode);
// Restore the original text colors.
SetConsoleTextAttribute(hStdout, wOldColorAttrs);
}
// The NewLine function handles carriage returns when the processed
// input mode is disabled. It gets the current cursor position
// and resets it to the first cell of the next row.
void NewLine(void)
{
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, "GetConsoleScreenBufferInfo", "Console Error", MB_OK);
return;
}
csbiInfo.dwCursorPosition.X = 0; //prova a mettere 10 qui e vedi
// If it is the last line in the screen buffer, scroll
// the buffer up.
if ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y)
{
ScrollScreenBuffer(hStdout, 1);
}
// Otherwise, advance the cursor to the next line.
else csbiInfo.dwCursorPosition.Y += 1;
if (! SetConsoleCursorPosition(hStdout,
csbiInfo.dwCursorPosition))
{
MessageBox(NULL, "SetConsoleCursorPosition", "Console Error", MB_OK);
return;
}
}
void ScrollScreenBuffer(HANDLE h, INT x)
{
SMALL_RECT srctScrollRect, srctClipRect;
CHAR_INFO chiFill;
COORD coordDest;
srctScrollRect.Left = 0;
srctScrollRect.Top = 1;
srctScrollRect.Right = csbiInfo.dwSize.X - x;
srctScrollRect.Bottom = csbiInfo.dwSize.Y - x;
// The destination for the scroll rectangle is one row up.
coordDest.X = 0;
coordDest.Y = 0;
// The clipping rectangle is the same as the scrolling rectangle.
// The destination row is left unchanged.
srctClipRect = srctScrollRect;
// Set the fill character and attributes.
chiFill.Attributes = FOREGROUND_RED|FOREGROUND_INTENSITY;
chiFill.Char.AsciiChar = ' ';
// Scroll up one line.
ScrollConsoleScreenBuffer(
h, // screen buffer handle
&srctScrollRect, // scrolling rectangle
&srctClipRect, // clipping rectangle
coordDest, // top left destination cell
&chiFill); // fill character and color
}
Rielaborandola un po'...
#include <windows.h>
void gotoxy(int, int);
HANDLE hStdout, hStdin;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
void main(void)
{
DWORD cWritten, fdwMode, fdwOldMode;
WORD wOldColorAttrs;
// Get handles to STDIN and STDOUT.
hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "GetStdHandle", "Console Error", MB_OK);
return;
}
// Save the current text colors.
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, "GetConsoleScreenBufferInfo", "Console Error", MB_OK);
return;
}
wOldColorAttrs = csbiInfo.wAttributes;
// Set the text attributes to draw red text on black background.
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN|FOREGROUND_INTENSITY))
{
MessageBox(NULL, "SetConsoleTextAttribute", "Console Error", MB_OK);
return;
}
// Turn off the line input mode, and echo the input mode.
if (! GetConsoleMode(hStdin, &fdwOldMode))
{
MessageBox(NULL, "GetConsoleMode", "Console Error", MB_OK);
return;
}
fdwMode = fdwOldMode &
~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if (! SetConsoleMode(hStdin, fdwMode))
{
MessageBox(NULL, "SetConsoleMode", "Console Error", MB_OK);
return;
}
// Without line and echo input modes, ReadFile returns
// when any input is available. Carriage returns must
// be handled, and WriteFile is used to echo input.
LPSTR lpszPrompt1 = "Type a line and press Enter, or q to quit: ";
gotoxy(10, 5);
if (! WriteFile(
hStdout, // output handle
lpszPrompt1, // prompt string
lstrlen(lpszPrompt1), // string length
&cWritten, // bytes written
NULL) ) // not overlapped
{
MessageBox(NULL, "WriteFile", "Console Error", MB_OK);
return;
}
gotoxy(17, 12);
if (! WriteFile(
hStdout, // output handle
lpszPrompt1, // prompt string
lstrlen(lpszPrompt1), // string length
&cWritten, // bytes written
NULL) ) // not overlapped
{
MessageBox(NULL, "WriteFile", "Console Error", MB_OK);
return;
}
// Restore the original console mode.
SetConsoleMode(hStdin, fdwOldMode);
// Restore the original text colors.
SetConsoleTextAttribute(hStdout, wOldColorAttrs);
}
// The NewLine function handles carriage returns when the processed
// input mode is disabled. It gets the current cursor position
// and resets it to the first cell of the next row.
void gotoxy(int x, int y)
{
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, "GetConsoleScreenBufferInfo", "Console Error", MB_OK);
return;
}
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
if (! SetConsoleCursorPosition(hStdout,
csbiInfo.dwCursorPosition))
{
MessageBox(NULL, "SetConsoleCursorPosition", "Console Error", MB_OK);
return;
}
}
Purtroppo non si può usare la cout per l'output, ma solo la WriteFile...
Comunque volendo puoi crearti una classe che serializza i vari tipi di input e li scrive con la WriteFile...
Se ti serve mi sono fatto qualche classe di supporto per inpute e output :
#include <windows.h>
#include <iostream.h>
class Con_base
{
protected:
static HANDLE hStdout, hStdin;
static DWORD fdwMode, fdwOldMode;
static BOOL firstRun;
static WORD wOldColorAttrs;
DWORD read(void *buf, DWORD size);
BOOL print(const void *buf, const DWORD size);
public:
BOOL GotoXY(int x, int y);
BOOL TextColor(WORD mode);
Con_base();
~Con_base();
};
BOOL Con_base::firstRun = TRUE;
HANDLE Con_base::hStdout = 0;
HANDLE Con_base::hStdin = 0;
DWORD Con_base::fdwMode = 0;
DWORD Con_base::fdwOldMode = 0;
WORD Con_base::wOldColorAttrs = 0;
Con_base::Con_base()
{
if(firstRun)
{
firstRun = FALSE;
hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
if(!GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, "GetConsoleScreenBufferInfo", "Console Error", MB_OK);
return;
}
wOldColorAttrs = csbiInfo.wAttributes;
if(!GetConsoleMode(hStdin, &fdwOldMode))
{
MessageBox(NULL, "GetConsoleMode", "Console Error", MB_OK);
return;
}
fdwMode = fdwOldMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if(!SetConsoleMode(hStdin, fdwMode))
{
MessageBox(NULL, "SetConsoleMode", "Console Error", MB_OK);
return;
}
if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE)
MessageBox(NULL, "GetStdHandle", "Console Error", MB_OK);
}
}
Con_base::~Con_base()
{
SetConsoleMode(hStdin, fdwOldMode);
SetConsoleTextAttribute(hStdout, wOldColorAttrs);
}
BOOL Con_base::GotoXY(int x, int y)
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
if(!GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
return FALSE;
if(x >= csbiInfo.dwSize.X || y >= csbiInfo.dwSize.Y)
return FALSE;
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
if(!SetConsoleCursorPosition(hStdout, csbiInfo.dwCursorPosition))
return FALSE;
return TRUE;
}
BOOL Con_base::TextColor(WORD mode)
{
if(!SetConsoleTextAttribute(hStdout, mode))
return FALSE;
return TRUE;
}
BOOL Con_base::print(const void *buf, const DWORD size)
{
DWORD cWritten;
if(!WriteFile(hStdout, buf, size, &cWritten, NULL))
return FALSE;
if(cWritten != size)
return FALSE;
return TRUE;
}
DWORD Con_base::read(void *buf, DWORD size)
{
DWORD cRead;
DWORD pos = 1;
do {
if(!ReadFile(hStdin, ((char *)buf), 1, &cRead, NULL))
return 0;
print(((char *)buf), 1);
} while(isspace(((char *)buf)[0]));
do {
if(!ReadFile(hStdin, ((char *)buf) + pos, 1, &cRead, NULL))
return 0;
if(!isspace(((char *)buf)[pos]))
print(((char *)buf) + pos, 1);
++pos;
} while(!isspace(((char *)buf)[pos-1]) && pos < size);
return pos-1;
}
class ConOut : public Con_base
{
public:
ConOut(){ };
ConOut & operator << (const __int64 w);
ConOut & operator << (const int w);
ConOut & operator << (const char w);
ConOut & operator << (const char *w);
};
ConOut & ConOut::operator << (const __int64 w)
{
char buffer[256];
_i64toa(w, buffer, 10);
print(buffer, strlen(buffer));
return *this;
}
ConOut & ConOut::operator << (const int w)
{
return *this << (__int64)w;
}
ConOut & ConOut::operator << (const char w)
{
print(&w, sizeof(char));
return *this;
}
ConOut & ConOut::operator << (const char *w)
{
print(w, strlen(w));
return *this;
}
#define IN_BUFFER_SIZE 256
class ConIn : public Con_base
{
public:
ConIn(){ };
ConIn & operator >> (__int64 &w);
ConIn & operator >> (int &w);
ConIn & operator >> (char &w);
ConIn & operator >> (char *w);
};
ConIn & ConIn::operator >> (__int64 &w)
{
char buffer[256];
DWORD num = read(buffer, 255);
if(num > 0)
{
buffer[num] = '\0';
w = _atoi64(buffer);
}
return *this;
}
ConIn & ConIn::operator >> (int &w)
{
char buffer[20];
DWORD num = read(buffer, 19);
if(num > 0)
{
buffer[num] = '\0';
w = atoi(buffer);
}
return *this;
}
ConIn & ConIn::operator >> (char &w)
{
read(&w, sizeof(char));
return *this;
}
ConIn & ConIn::operator >> (char *w)
{
char buffer[256];
DWORD num;
if((num = read(buffer, 255)) > 0)
{
buffer[num] = '\0';
strcpy(w, buffer);
}
return *this;
}
void main(void)
{
ConOut out;
ConIn in;
out << 'a' << '<' << 10 ;
out.GotoXY(10, 10);
int a;
in >> a;
out.TextColor(FOREGROUND_BLUE|FOREGROUND_INTENSITY);
out << 'a' << '<' << 10 << ' ' << a;
out.GotoXY(17, 15);
char str[100];
in >> str;
out.TextColor(FOREGROUND_GREEN);
out << "ciao" << "\n\r" << "ciao " << str;
}
Ho incluso l'header con la classe che mi hai fornito : l'ho compilato tutto ok . Guarda un attimo il seguente codice :
void main()
{
ConIn pippo ;
clinica<info_paziente> clinica1;
char scelta;
do
{
system("cls");
cout << "+--------------------------------------------------------+\n";
cout << "¦ MENU' PRINCIPALE ¦\n";
cout << "¦--------------------------------------------------------¦\n";
cout << "¦ 1) Aggiunta Paziente ¦\n";
cout << "¦ 2) Ricerca Dati Paziente ¦\n";
cout << "¦ 3) Controlli ¦\n";
cout << "¦ 4) Statistiche ¦\n";
cout << "¦ 5) Uscita Dal Programma ¦\n";
cout << "+--------------------------------------------------------+\n";
cout << '\n';
cout << " Fai la tua scelta : " ;
pippo.GotoXY(12,12);
cin >> scelta ;
switch (scelta)
{
case '1':{aggiunta(clinica1);
};break;
case'2':{stampa(clinica1);
};break;
case'3':{
};break;
case'4':{
};break;
};
}while (scelta!='5');
};
ho dichiarato l'istanza della classe che gentilmente mi hai fornito . il mio obbiettivo è quello di leggere il carattere in una posizione prefissata dopo la comparsa del messaggio "fai la tua scelta : " ed invece il metodo gotoxy della classe a seconda dei parametri mi sposta la posizione del messaggio e non la posizione del cursore . Come posso fare ?
Devi usare anche ConOut per fare l'output... Come ho già detto non è compatibile con le normali classi di input e output (tu usi cout)...
se ti va, per mia curiosità personale, prova questo
#include <windows.h>
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
COORD coord;
coord.X = (short)atol(argv[1]);
coord.Y = (short)atol(argv[2]);
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, coord);
cout << "X (" << coord.X << ", " << coord.Y << ")" << endl;
return 0;
}
ho provato a fare la lettura e la stampa non con cout e cin ma con le classi che tu mi hai fornito ma non ottengo ciò che speravo . Mi potresti fare un pezzo di codice semplice semplice ? In un file cpp includi la classi che tu mi hai fornito . Dopodiche nella funzione main stampa una serie di messaggi del tipo :
cognome :
nome :
età :
sesso :
dopo la stampa di questi messaggi posizionati al fianco di ognuna con la gotoxy e leggi da tastiera . E' questo in realtà ciò che voglio fare . Mi potresti aiutare per cortesia . Sei già stato gentilissimo spero che continuerai ad esserlo . Grazie
Originariamente inviato da misterx
[B]se ti va, per mia curiosità personale, prova questo
#include <windows.h>
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
COORD coord;
coord.X = (short)atol(argv[1]);
coord.Y = (short)atol(argv[2]);
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, coord);
cout << "X (" << coord.X << ", " << coord.Y << ")" << endl;
return 0;
}
Potresti spiegarmi questo codice cortesemente ?
ma il funzionamento è intrinseco nella main; lancialo fornendo come argomnto due valori interi come ad esempio 10 8
ti dovrebbe apparire il cursore lampeggiante in decima colonna ed ottava riga
è tutto qui quello che fa il codice
si tratta solo di adattarlo alle proprie esigenze
questa è la mia prova il risultato è sotto (X (10, 8))
Project1.exe 10 8
X (10, 8)
La cin e la cout con Visual C++ non stampa dove ci si sposta con la SetConsoleCursorPosition...
leon84 : posta il codice...
Originariamente inviato da cionci
[B]La cin e la cout con Visual C++ non stampa dove ci si sposta con la SetConsoleCursorPosition...
Cavolo...invece fuziona... Eppure con il primo esempio postato se stampavo con la cout mi andava sempre in cima alla finestra... Mah...
leon84 : fai come dice misterx...
Originariamente inviato da misterx
[B]questa è la mia prova il risultato è sotto (X (10, 8))
Project1.exe 10 8
X (10, 8)
Date un occhiata a questo codice : ho utilizzato ciò che misterx mi ha postato anche se ho modificato qualcosa . Per favore compilatelo e ditemi se a voi funziona .
#include <windows.h>
#include <iostream.h>
#include <stdlib.h>
void gotoxy (int a , int b);
void main ()
{
system ("cls");
char cognome[20] ;
char nome [20];
system("cls");
gotoxy (0,0);
cout << "COGNOME' : " ;
gotoxy (0,1);
cout << "NOME : \n";
gotoxy(20,0);
cin >> cognome ;
gotoxy (20,1);
cin >> nome ;
};
void gotoxy (int a , int b)
{
COORD coord;
coord.X = a;
coord.Y = b;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, coord);
}
Comunque non ottengo i risultati sperati . Come ho già detto io voglio visualizzare cognome e nome e dopo pormi con la funzione gotoxy che mi sono creato al fianco di ognuno per leggere i dati . Con il Borland C++ e con Dev C++ non ci metto nulla . Perché sto cavolo di visual c++ tanto potente ha questi limiti (tra parentesi ovviamente ) ?
Nemmeno in DevC++ c'è la gotoxy !!!
Ho scoperto perchè prima a me non funzionava !!!
Era una questione di dichiarazione della cout e della cin...anche se me la spiego lo stesso male questa cosa...
#include <windows.h>
#include <iostream> //questo lo devi includere senza .h
#include <stdlib.h>
using namespace std; //devi usare il namespace std di iostream
void gotoxy (int a , int b);
void main ()
{
system ("cls");
char cognome[20] ;
char nome [20];
system("cls");
gotoxy (0,0);
cout << "COGNOME' : " ;
gotoxy (0,1);
cout << "NOME : ";
gotoxy(20,0);
cin >> cognome ;
gotoxy (20,1);
cin >> nome ;
}
void gotoxy (int a , int b)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X = a;
coord.Y = b;
SetConsoleCursorPosition(hConsole, coord);
}
Originariamente inviato da cionci
[B]Nemmeno in DevC++ c'è la gotoxy !!!
Ho scoperto perchè prima a me non funzionava !!!
Era una questione di dichiarazione della cout e della cin...anche se me la spiego lo stesso male questa cosa...
#include <windows.h>
#include <iostream> //questo lo devi includere senza .h
#include <stdlib.h>
using namespace std; //devi usare il namespace std di iostream
void gotoxy (int a , int b);
void main ()
{
system ("cls");
char cognome[20] ;
char nome [20];
system("cls");
gotoxy (0,0);
cout << "COGNOME' : " ;
gotoxy (0,1);
cout << "NOME : ";
gotoxy(20,0);
cin >> cognome ;
gotoxy (20,1);
cin >> nome ;
}
void gotoxy (int a , int b)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X = a;
coord.Y = b;
SetConsoleCursorPosition(hConsole, coord);
}
Ok Finalmente tutto a posto . Vi ringrazio tantissimo . Però un'altra cosa me la dovete dire : Quale è la differenza tra iostream e iostream.h e cosa è un namespace ? Ma la iostream a differenza della iostream.h mi permette di fare le stesse cose ?
Sapete mica come si implementa un pò di grafica sempre con sto benedetto Visual C++ di Microsoft ? Grafica intendo sotto DOS non l'ambiente visuale ( finestre) . Del tipo : tracciare linee , scrivere testo , tracciare cerchi , colore di sfondo , ecc .. Fatemi sapere ?
Originariamente inviato da leon84
[B]Sapete mica come si implementa un pò di grafica sempre con sto benedetto Visual C++ di Microsoft ? Grafica intendo sotto DOS non l'ambiente visuale ( finestre) . Del tipo : tracciare linee , scrivere testo , tracciare cerchi , colore di sfondo , ecc .. Fatemi sapere ?
Riguardo alla grafica sotto console... Dubito che ci sia un libreria adatta in Visual C++...
E dubito che la Borland distribuisca ancora la BGI con Borland C++ Builder...
iostream e iostream.h dovrebbero essere identiche in teoria...la differenza dovrebbe stare solo nell'uso dei namespace...
Il namespace definisce lo scoop di visibilità degli oggeti definiti al suo interno...
Più strutture possono stare all'interno di un namespace... Più include possono definire ed arricchire lo stesso namespace...
Se te indichi che vuoi usare un certo namespace... In quel blocco di codice avrai direttamente visibili gli oggetti definiti al suo interno...
Senza usare la using per usare cout e cin avrei dovuto "entrare" nel namespace con std::cin e std::cout...
Ad esempio potrei definire implementazioni diverse di una classe a seconda del namespace usato...
I principali oggetti della Standard Library e della Standard Template Library sono definiti all'interno del namespace std...
Il namespace è stato aggiunto in una definizione nemmeno tanto recente dello standard relativo al C++...
Se hai bisogno di più chiarezza : http://www.mvps.org/windev/cpp/nspaces.html
Scusa la mia ignoranza . Ma lo scoop cosa è ? Se ho capito bene , con la dichiarazione di un namespace posso includere diversi header e classi e nel momento che richiamo quel namespace in un programma automaticamente vengono incluse le librerie che esso contiene ? E' così più o meno ?
Originariamente inviato da leon84
[B]Scusa la mia ignoranza . Ma lo scoop cosa è ?
Scope...non scoop... Ho sbaglaito a scrivere nel post prima...
Scope è la porzione di codice in un cui una struttura (variabile, classe etc etc) è visibile...
Ad esempio...lo scope di una variabile locale è dalla dichiarazione fino alla fine del blocco in cui è dichiarata...
Originariamente inviato da leon84
[B]Se ho capito bene , con la dichiarazione di un namespace posso includere diversi header e classi e nel momento che richiamo quel namespace in un programma automaticamente vengono incluse le librerie che esso contiene ? E' così più o meno ?
Più o meno è così... Più che incluse...vengono rese visibili direttamente...
Comunque guarda il link che ti ho postato prima...
Grazie per l'auto con il gotoxy . Ora è tutto a posto . Però è sorto un altro problema . Il programma all'interno del quale utilizzo gotoxy , mi dà problemi nel momento in cui assieme a iostream includo anche fstream.h . Non essendo esperto in materia di namespace , ho eliminato la h a fstream ed il programma parte . iL FILE SU CUI SCRIVERE , PERò NON VIENE GENERATO . Con fstream a differenza di fstream.h l'apertura del file come segue mi dà problemi :
fstream file ; // Tutto ok ;
file.open ("dati.txt",ios::app,ios::binary); // Qui non va
Mi dice , infatti che la funzione prende solo due parametri . Ma non è che bisogna includere il namespace dell' fstream ? Vi prego aiutatemi . Mi rivolgo soprattutto a cionci e misterx che fino ad ora sono stati gentilissimi
file.open ("dati.txt",ios::app|ios::binary);
Quelle sono costanti e vanno "accoppiate" con l'or bit a bit...
Originariamente inviato da cionci
[B]file.open ("dati.txt",ios::app|ios::binary);
Quelle sono costanti e vanno "accoppiate" con l'or bit a bit...
L'istruzione che mi hai fornito è ok per il compilatore , infatti non mi dà alcun problema di sintassi . Il punto è che il file lo crea solo quando inserisco la clausola ios::out . Perché con ios::app non mi crea il file ? Di seguito il codice sorgente dell'applicazione : mi faresti la cortesia di dargli una occhiata ? potrebbe essere qualche altra cosa la causa del problema :
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <fstream>
struct persona
{
char cognome[20];
int numero;
};
using namespace std;
void stampa ();
void gotoxy (int a , int b);
void main ()
{
char scelta;
persona appoggio ;
fstream file ;
file.open ("dati.txt",ios::out|ios::binary);
system ("cls");
gotoxy (0,0);
cout << "COGNOME' : " ;
gotoxy (0,1);
cout << "NOME : ";
gotoxy(20,0);
cin.getline (appoggio.cognome,20); ;
gotoxy (20,1);
cin >>appoggio.numero;
file.write ((char *) &appoggio,sizeof appoggio);
file.close();
stampa();
cin >> scelta ;
}
void gotoxy (int a , int b)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X = a;
coord.Y = b;
SetConsoleCursorPosition(hConsole, coord);
}
Ragazzi ho un altro problema : la funzione gotoxy di per se funziona . L'ho inserita nel programma che vi allego , ma il compilatore mi dà uno strano problema . Per favore datemi una mano . I file sono due : header.h e main.cpp . il file header.h è incluso nel file main.cpp . L'errore strano è il seguente : mi dice che nel modulo aggiunta e nel modulo stampa non può convertire il parametro dal tipo clinica<dato> a clinica<dato> . Mi sembra assurdo ma compilate il codice allegato e fatemi sapere . Il file allegato è un .zip . Vi prego fatemi sapere .
A me compila perfettamente...
Prova a creare un nuovo progetto da zero...
Ah...il punto e virgola serve dopo la } solo nelle struct, nelle class, nelle union...e probabilmente in altre situazioni, ma non alla fine delle funzioni o di un blocco del programma...
Inoltre le parentesi {} non servono nei case ;)
Ho provato a creare un nuovo progetto . Ho eliminato i punti e virgola come mi dicevi , ma non ho risolto il problema . Mi faresti un favore ? Elimina tu tutti i punti e virgola e allega i file corretti così riprovo a compilarli . OK ? Mi faresti questo favore ? Sto perdendo la testa con sto C++ . Grazie cionci .
Originariamente inviato da leon84
[B]Ho provato a creare un nuovo progetto . Ho eliminato i punti e virgola come mi dicevi , ma non ho risolto il problema . Mi faresti un favore ? Elimina tu tutti i punti e virgola e allega i file corretti così riprovo a compilarli . OK ? Mi faresti questo favore ? Sto perdendo la testa con sto C++ . Grazie cionci .
I punto e virgola non davano problemi...
Un punto e vergola è uno statement vuoto quindi se lo metti compila ugualmente...
Io ho preso il tuo sorgente e l'ho compilato a diritto...senza metterci mano...
Se hai Visual C++ ti mando il file del progetto...
Ok mandami il file del progetto . Ma per curiosità : compili con Visual C++ .NET o Visual C++ 6.0 ? Io uso il .NET . Comunque mandami il file del progetto . Anzi perché non mi mandi tutta la cartella con i file che il compilatore crea ? Il mio indirizzo email è :
[email protected]
Ho la versione 6...
Non importa la mail...ecco qui tutta la cartella...
Stranissimo !!!!!!!!!!!!!!!!!!!!! Ho compilato il tuo progetto e mi dà gli stessi errori . Non ce la faccio più !!!!!!!!!!!!!!! Ma io sto pensando ad una cosa ? Sarà che è un baco del .NET ? Che dici lo cancello e reinstallo il 6.0 ? Ti prego dammi un consiglio . Sai a volte per ché odio il C++ ? Perché è talmente tanto potente , talmente tanto potente , che lo porta ad essere veramente difficile . Io ho esperienze di programmazione in Pascal , Visual Basic , ma non mi è mai capitato un linguaggio come il C . UFFA !!!!
Ma a che riga hai l'errore ?
L'errore viene generato alla chiamata del modulo aggiunta e stampa . Mi dice che il parametro non può essere convertito e pure il parametro che gli passo è dello stesso tipo
Ho reinstallato Visual C++ 6.0 e fortunatamente quell'errore non me lo dà più . Il problema è diventato un altro . Io devo scrivere e leggere su di un file binario . Alla partenza del programma io voglio conservare i vecchi dati del file aggiungendone altri : per questo utilizzo la clausola ios::app . Ma sta volta ios::app non mi crea il file . Se invece elimino il namespace std includo iostream.h anziche iostream ed fstream.h anziché fstream la generazione del file avviene correttamente ma la funzione gotoxy non mi funziona più nel senso che gotoxy (12,12) , per esempio , invece di posizionarmi il cursore nel punto 12 12 , mi fà un casino di cose sullo schermo . Come posso risolvere ? E possibile che non riesco a far funzionare questa gotoxy correttamente con il programma ? Cionci ti chiedo di fare una prova con il listato che ti ho mandato . La compilazione è OK , questo già me lo hai detto . Vedi se puoi come risolvere il problema di generazione del file . Ti chiedo quest'altra cortesia . Grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.