PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schleife abrechen mit return...



Ciro
05-04-2004, 12:57
Das Programm gibt farbige Rechtecke an beliebiger stelle aus...Die Funktion wird in einer Schleife ausgegeben.Wenn ich nun will das die Schleife mit einem Tastendruck unterbrochen werden soll,wie stelle ich das an?Hab es mit getch versucht wie ihr seht...Es Funktioniert aber so nicht die Schleife wird nicht unterbrochen...Kann es sein das ich die Tastenabfrage in der Funktion machen muß?


#include<stdio.h>
#include<curses.h>
char key;
int i,c;
void dummy(int n);
int main(){

initscr();
curs_set(0);
key=getch();//Tasteneingabe
refresh();

while(key!='q'){//Tastenabfrage
for(i=0;i<1000;i++){//Funktion wird mit schleife gestartet...
dummy(i);
refresh();
}}
endwin();
}
void dummy(int i){//Funktion
int *wert;
for(c=0;c<12;c++){
wert[0]=rand()%70;//Farbwert wird mit zufalls Allgo bestimmt...
wert[1]=rand()%70;
wert[2]=rand()%70;
wert[3]=rand()%70;
wert[4]=rand()%70;
wert[5]=rand()%70;
wert[6]=rand()%70;
wert[7]=rand()%70;
wert[8]=rand()%70;
for(i=0;i<9;i++){
start_color();
mvprintw(wert[i],wert[c]," ",i);//Positionierung der Kästchen im Terminal wird erstellt....
init_pair(i,i,i);//farbwert wird initialisiert
attron(A_BOLD);
attrset(COLOR_PAIR(i)|A_BOLD);
refresh();
}}}

panzi
05-04-2004, 16:37
Bitte Code Tags verwenden!



#include<stdio.h>
#include<curses.h>

void dummy( int n );

int main() {
int i; // Warum war diese Variable Global?
WINDOW * rootwin = NULL;

rootwin = initscr();
// nodelay == TRUE bewirkt das getch() nicht blockiert
// und ERR zurückliefert, wenn kein Zeichen eingegeben wurde.
// Diese Funktion benötigt aber ein Fenster als Parameter,
// deswegen hab ich mir den Rückgabewert von initscr() gemerkt,
// denn der ist das Rootfenster.
nodelay( rootwin, TRUE );
noecho();
curs_set( 0 );
refresh();

while( getch() != 'q' ) { // Tastenabfrage
for( i = 0; i < 1000; ++ i ) { // Funktion wird mit schleife gestartet...
dummy( i );
refresh();
}
}
delwin( rootwin );
endwin();
refresh();

return 0;
}

void dummy( int i ) { // Funktion
// HIER war ein Fehler: Du hast nicht initialisierten Speicher verwendet.
int wert[ 9 ];
int c; // Warum war diese Variable Global?
for( c = 0; c < 12; ++ c ) {
wert[ 0 ] = rand() % 70; // Farbwert wird mit zufalls Allgo bestimmt...
wert[ 1 ] = rand() % 70;
wert[ 2 ] = rand() % 70;
wert[ 3 ] = rand() % 70;
wert[ 4 ] = rand() % 70;
wert[ 5 ] = rand() % 70;
wert[ 6 ] = rand() % 70;
wert[ 7 ] = rand() % 70;
wert[ 8 ] = rand() % 70;

for( i = 0; i < 9; ++ i ) {
start_color();
mvprintw( wert[ i ], wert[ c ], " " , i ); // Positionierung der Kästchen im Terminal wird erstellt....
init_pair( i, i, i ); // farbwert wird initialisiert
attron( A_BOLD );
attrset( COLOR_PAIR( i ) | A_BOLD );
refresh();
}
}
}

Der Code sollte gehn. Oder willst du auch den Zeichenvorgang selbst abbrechen können?

Edit:
Noch eine Frage: Warum übergibst du dummy() einen Wert int i, wenn du diesen dann in der for-Schleife setzt und vorher aber nie ausließt?

Ciro
05-04-2004, 17:23
Danke für deine Antwort hab es so gelöst...


#include<stdio.h>
#include<curses.h>
char key;
int i,c;
void dummy(int n);

int main(){
initscr();
start_color();
curs_set(0);
refresh();
for(i=10;i>1;i++){//Funktion wird mit schleife gestartet...
mvprintw(1,8,"Starten Sie das Programm mit RETURN und beenden sie es mit 'q'",1);
refresh();
key=getch();
refresh();
dummy(i);
refresh();
nodelay(stdscr,1);
if(key=='q'){break;}
refresh();}
endwin();
system("clear");}

void dummy(int i){
int *wert;
for(c=0;c<10;c++){
wert[0]=rand()%200;//Farbwert wird mit zufalls Allgo bestimmt...
wert[1]=rand()%200;
wert[2]=rand()%200;
wert[3]=rand()%200;
wert[4]=rand()%200;
wert[5]=rand()%200;
wert[6]=rand()%200;
wert[7]=rand()%200;
wert[8]=rand()%200;
for(i=0;i<9;i++){
start_color();
mvprintw(wert[i],wert[c]," ",i);//Positionierung der Kästchen im Terminal wird erstellt....
init_pair(i,i,i);//Farbwert wird initialisiert / Disco-effect mit init_pair(i,i-c,c*i)
attron(A_BLINK);
attrset(COLOR_PAIR(i)|A_BOLD);
refresh();
}}}

Ciro
05-04-2004, 17:41
zu deiner frage in dem fall ist es egal ob sie global sind...du hast aber recht es sieht schöner aus wenn sie im code sind:-)
cu....

panzi
06-04-2004, 15:52
#include<stdio.h>
#include<curses.h>
char key;
int i,c;
void dummy(int n);

int main(){
initscr();
start_color();
curs_set(0);
refresh();
for(i=10;i>1;i++){//Funktion wird mit schleife gestartet...
mvprintw(1,8,"Starten Sie das Programm mit RETURN und beenden sie es mit 'q'",1);
refresh();
key=getch();
refresh();
dummy(i);
refresh();
nodelay(stdscr,1); // Warum nodelay errst NACH dem einlesen mit getch()?
if(key=='q'){break;} // Dieser Ausdruck ist total Sinnlos! Denn das break bricht nur den if-block ab!!
refresh();}
endwin();
system("clear");} // WARUM system("clear") ???? ncurses hat clear() und das ist Terminal/Shell unabhängig! Natürlich sollt man das dann vor endwin() und auch vor refresh() aufrufen.

void dummy(int i){
int *wert;
for(c=0;c<10;c++){
wert[0]=rand()%200;//Farbwert wird mit zufalls Allgo bestimmt...
wert[1]=rand()%200;
wert[2]=rand()%200;
wert[3]=rand()%200;
wert[4]=rand()%200;
wert[5]=rand()%200;
wert[6]=rand()%200;
wert[7]=rand()%200;
wert[8]=rand()%200;
for(i=0;i<9;i++){
start_color();
mvprintw(wert[i],wert[c]," ",i);//Positionierung der Kästchen im Terminal wird erstellt....
init_pair(i,i,i);//Farbwert wird initialisiert / Disco-effect mit init_pair(i,i-c,c*i)
attron(A_BLINK);
attrset(COLOR_PAIR(i)|A_BOLD);
refresh();
}}}


man 3 clear (http://unixhelp.ed.ac.uk/CGI/man-cgi?3%20clear)
man ncurses (http://unixhelp.ed.ac.uk/CGI/man-cgi?ncurses)


Und die Code-Tags bringen nix wenn du den Source nicht einrückst. Programmierst du tatsächlich so???

Ciro
06-04-2004, 21:04
ok du hast ja recht:D so besser???


#include<stdio.h>
#include<curses.h>

void dummy(int n);

int main(){
int f;
initscr();
start_color();
curs_set(0);
cbreak();
nodelay(stdscr,TRUE);
keypad(stdscr,TRUE);
do{
getch();
dummy(f);}
while(getch()==ERR);
endwin();}

void dummy(int i){
int wert[9],c;
for(c=0;c<10;c++){
wert[0]=rand()%200;
wert[1]=rand()%200;
wert[2]=rand()%200;
wert[3]=rand()%200;
wert[4]=rand()%200;
wert[5]=rand()%200;
wert[6]=rand()%200;
wert[7]=rand()%200;
wert[8]=rand()%200;
for(i=0;i<9;i++){
mvprintw(wert[i],wert[c]," ",i);
init_pair(i,i,i);
attron(A_BLINK);
attrset(COLOR_PAIR(i)|A_BOLD);
}}}

panzi
06-04-2004, 21:51
Ja besser.
Aber das erste getch() ist wohl unnötig (das IN der do-while-Schleife) und programmierst du wircklich mit so unformatierten sourcen, wo man keine Struktur erkennen kann?

Ciro
06-04-2004, 21:56
ich bin c neuling hab erst damit angefangen...für mich ist erstmal vorrangig das das programm auch das tut was man will dann kommt die optik:D ich denke das werd ich mit der zeit schon noch alles lernen...was würdest du anderst machen von der sruktur her oder was ist in deinen augen falsch?gibt es da vorschriften?

serum
09-04-2004, 02:06
nein vorschriften nicht, aber stell dir mal vor... du arbeitest an einem großen projekt mit und jemand anders muss über deinen source fliegen, dem wünsch ich viel spass :)

wie der quelltext auszusehen hat, bleibt im endeffekt dir überlassen, aber an einige formatierungsregeln sollte man sich schon halten -> C++ Coding Standard (http://www.possibility.com/Cpp/CppCodingStandard.html)
gestalte den quelltext einfach übersichtlich und strukturiere ihn sinnvoll.

panzi
09-04-2004, 16:29
Halt dich einfach an folgendes:
Bereiche zwischen { und } immer einrücken. Wenn der Bereich in einen anderen drin ist, dann rück in relation zu den andren ein. (etc.)
Schreib nie mehrere } in einer zeile hinereinander, sondern halt dich auch da an die Einrückungsebenen. Also z.B. so:

{
...
{
...
{
...
}
}
}
Wenn die bereiche so lang sein, das man beim } trotzdem nicht weiß zu welchen { es gehört, dann schreibt man noch einen Kommentar dazu.
Das sollte aber nur bei so Sachen wie namespaces vorkommen, alles andere sollte man kürzer halten können.

namespace bla {
...
} // namespace bla

Variablen/Klassen/Funktinsnamen sollten natürlich immer möglichst unkryptisch und sprechend sein.
Und deklarier Variablen nur in dem scope (mehr od. weniger Bereich. Nähere Erklärung erfolgt auf Wunsch.) in dem sich aub benötigt werden.

Das sollte für's Erste reichen, damit Du hier Sourcen posten kanns't, die auch relativ leicht zu lesen sind und wo niemand über die Form mekern wird. ;)