Mir unbekanter Fehler, höchstwahrscheinlich fehler beim Array! Hilfe
-
Guten Abend =b
Obwohl ich jetzt schon seit 3/4 jahren programmiere und mir auch den Beruf als Softwareentwickler zum Ziel gesetzt habe (an diesem ziel arbeite ich hartnäckig, vernachlässige andere fächer dafür!) kann und kann ich einfach nicht den fehler finden.
Aufgabenstellung ist ein Piano zu programmieren, es sollte auf den ersten blick auch aussehen wie eines =b
die funktionen sind mir absolut klar, jetzt ist einfach, wenn ich eine taste drücke, soll es aussehen als ob die taste runtergedrückt wird. Die lösung dafür hab ich auch schon, jetzt brauch ich einfach die anfangs- und end-X-Koordinaten
windwow(x_anfang, y_anfang, x_ende, y_ende) // erzeugt ein fenster
naja, am logischsten war es für mich dafür ein array zu verwenden, was ich auch wie folgt getan habe =b
#include<inclu.h> // header mit folgenden header includiert: /* conio.h stdio.h stdlib.h window.h dos.h time.h iostream string.h */ void zeichne_Piano(int *taste_x1[8], int *taste_x2[8]); void main() { int *taste_x1[8]; int *taste_x2[8]; textbackground(3); clrscr(); zeichne_Piano(&taste_x1[8], &taste_x2[8]); for(int x=0; x<7; x++) printf("X: %d, Y: %d\n", taste_x1[x], taste_x2[x]); getch(); } void zeichne_Piano(int *taste_x1[8], int *taste_x2[8]) { int x_anfang=15, y_anfang=5, x_ende=19, y_ende=10,x1=15,y1=5,x2=56,y2=11; window(x1,y1,x2,y2); textbackground(8); clrscr(); for(int i=0; i<7; i++) { window(x_anfang,y_anfang,x_ende,y_ende); textbackground(7); clrscr(); *taste_x1[i]=x_anfang; // fehlerquelle *taste_x2[i]=x_ende; // fehlerquelle x_anfang+=6; x_ende+=6; } }
beim compilieren kein fehler, aber beim ausführen kommt folgende fehlermeldung:
Thread stopped C:\Users\Daniel\Desktop\temp_test\piano.exe: Fault; access violation at 0x4011cf: write of address 0x4046e8
was soll das heißen?
ach ja, noch was: das programm bleibt dann bei: *taste_x2[i]=x_ende; stehen. sprich die schleife wird nicht ein mal komplett durchgeführt. also kann es ja nur am array liegen
und compiler ist Borland C++ 5.2
Auf jedenfall jetzt schon ein großes Dankeschön an die Helfer
-
Du verwendest Arrays aus Zeigern auf int, obwohl du wahrscheinlich eigentlich Arrays aus int haben willst. Lösche am besten mal alle Sternchen aus deinem Programm und ruf die Funktion einfach mit
zeichne_Piano(taste_x1, taste_x2);
auf. (Arrays werden grundsätzlich nur als Zeiger an Funktionen übergeben, so dass du das Array dann auch in der Funktion füllen kannst)
Und wieso deklarierst du eigentlich Arrays der Größe 8, wenn du dann doch nur auf die ersten 7 Elemente zugreifst?
-
Softwareentwickeler - vernachlässige die anderen Fächer nicht all zu sehr
Warum ein C++ Header unter den C Headern?
Warum nicht:int main ()
Hab es nicht getestet, benötigst du bei dem Quelltext beim Borland den
#include <window.h>
?
MfG f.-th.
-
namespace invader schrieb:
Du verwendest Arrays aus Zeigern auf int, obwohl du wahrscheinlich eigentlich Arrays aus int haben willst. Lösche am besten mal alle Sternchen aus deinem Programm und ruf die Funktion einfach mit
zeichne_Piano(taste_x1, taste_x2);
auf. (Arrays werden grundsätzlich nur als Zeiger an Funktionen übergeben, so dass du das Array dann auch in der Funktion füllen kannst)
Und wieso deklarierst du eigentlich Arrays der Größe 8, wenn du dann doch nur auf die ersten 7 Elemente zugreifst?
danke =b aber hatte meine gedanken komplett wo anders =b
sprich ich hab nicht mitgedacht und war bei nem anderen programm an dem ich derzeit arbeite, wobei dieses hier jetzt vorrang hat.
-
f.-th. schrieb:
Softwareentwickeler - vernachlässige die anderen Fächer nicht all zu sehr
Warum ein C++ Header unter den C Headern?
Warum nicht:int main ()
Hab es nicht getestet, benötigst du bei dem Quelltext beim Borland den
#include <window.h>
?
MfG f.-th.
1. ach, ne schlechte angewohnheit von mir bzw. ein fehler im header, denn ich aber sogleich ausbessere (habs irgendwie immer verschwitzt zum ausbessern =b)
2. weil wir in der schule noch mit void main() arbeiten, und dies jetzt irgendwie halt nur ne gewöhnungssache ist =b
3. nein, noch nicht... der abschnitt kommt noch in dem ich die header brauche =b
und naja, vernachlässigen heisst bei mir: besser als genügend oder befriedigend muss es nicht sein =b ausser englisch und mathe =b und die anderen EDV-Fächer
-
Hy
soweit so gut, hab so gut wie alles fertig =b dachte ich bräuchte länger, wobei, war eh ganz klein das progrämmchen =b
noch mals danke für rasche hilfe, habt mir echt erspart jetzt schon ein graues haar auf meinem kopf zu finden =b
wobei, es könnte noch immer kommen, das ist ja das große problem! denn nun stellt sich heraus, dass borland C++ 5.2 nicht mehr wie seine vorgänger frequenzen ausgeben kann. aber ich hab bereits ne möglichkeit gefunden dies zu umgehen =b ich gebe einfach .wav dateien aus =b
nur jetzt das große problem, das mich wahrscheinlich zu meinem ersten grauen haar bringt und dies mit 16 jahren =b
ich finde keine passenden .wav dateien! ich bräuchte von der C-Dur alle töne in einer einzelnen .wav datei. wenns sein muss kann auch alles in einem sein, stört mich nicht, ich würde mir das auch zurecht schneiden =b aber jeweils einzeln wärs mir lieber.
und ja, ich hab den großen freund und helfer namens google bereits befragt, doch leider spuckt der nur müll aus (immer öfter wie ich leider feststellen muss!).
falls ihr mir noch ein mal helfen könntet, wäre ich euch wirklich sehr dankbar =b
-
itedvo schrieb:
ich finde keine passenden .wav dateien! ich bräuchte von der C-Dur alle töne in einer einzelnen .wav datei. wenns sein muss kann auch alles in einem sein, stört mich nicht, ich würde mir das auch zurecht schneiden =b aber jeweils einzeln wärs mir lieber.
Nimm doch http://www.youtube.com/watch?v=oD-sSolVDiY, musst du dir natürlich auch zurechtschneiden.
-
namespace invader schrieb:
itedvo schrieb:
ich finde keine passenden .wav dateien! ich bräuchte von der C-Dur alle töne in einer einzelnen .wav datei. wenns sein muss kann auch alles in einem sein, stört mich nicht, ich würde mir das auch zurecht schneiden =b aber jeweils einzeln wärs mir lieber.
Nimm doch http://www.youtube.com/watch?v=oD-sSolVDiY, musst du dir natürlich auch zurechtschneiden.
so in etwa das was ich gesucht habe =b wobei es wieder arbeit bedeutet... aber was wäre das leben nur ohne arbeit =b
danke
-
so, es ist fertig =b
aber es funktioniert nicht so wie erhofft, schade... damit es wirklich funktioniert wie es sollte bräuchte ich wohl oder übel threads an die ich mich noch nicht ran wage... aber naja, demnächst sollte ich anfangen =b
#include<inclu.h> void zeichne_Piano(int *taste_x1, int *taste_x2); void tastendruck(int *taste_x1, int *taste_x2, char); void abspielen_ton(char eingabe); void info_Bereich(); void main() { int taste_x1[8]; int taste_x2[8]; char eingabe; do { zeichne_Piano(taste_x1, taste_x2); eingabe=getch(); if(eingabe != '0' && eingabe != '8' && eingabe != '9') { tastendruck(taste_x1, taste_x2, eingabe); abspielen_ton(eingabe); } } while(eingabe !='0'); } void zeichne_Piano(int *taste_x1, int *taste_x2) { int x_anfang=15, y_anfang=5, x_ende=19, y_ende=10, x1=16, y1=5, x2=50, y2=11, y_1=y1-1; window(1,1,80,25); textbackground(3); clrscr(); info_Bereich(); window(15,y_1,49,y_1); textbackground(4); clrscr(); textcolor(7); cprintf(" 1 2 3 4 5 6 7"); window(x1,y1,x2,y2); textbackground(8); clrscr(); for(int i=0; i<7; i++) { window(x_anfang,y_anfang,x_ende,y_ende); textbackground(7); clrscr(); taste_x1[i]=x_anfang; taste_x2[i]=x_ende; x_anfang+=5; x_ende+=5; } } void tastendruck(int *taste_x1, int *taste_x2, char eingabe) { int x1, x2, y1=5,y2=11,d; switch(eingabe) { case '1': d=0; break; case '2': d=1; break; case '3': d=2; break; case '4': d=3; break; case '5': d=4; break; case '6': d=5; break; case '7': d=6; break; } x1=taste_x1[d]; x2=taste_x2[d]; window(x1,y1,x2,y2); textbackground(7); clrscr(); x1=taste_x2[d]; x1-=4; window(x1,y1,x1,y2); if(d != 0) textbackground(8); else textbackground(3); clrscr(); } void abspielen_ton(char eingabe) { switch(eingabe) { case '1': PlaySound( "Progn_C-Dur_1.wav", NULL, SND_FILENAME ); break; case '2': PlaySound( "Progn_C-Dur_2.wav", NULL, SND_FILENAME ); break; case '3': PlaySound( "Progn_C-Dur_3.wav", NULL, SND_FILENAME ); break; case '4': PlaySound( "Progn_C-Dur_4.wav", NULL, SND_FILENAME ); break; case '5': PlaySound( "Progn_C-Dur_5.wav", NULL, SND_FILENAME ); break; case '6': PlaySound( "Progn_C-Dur_6.wav", NULL, SND_FILENAME ); break; case '7': PlaySound( "Progn_C-Dur_7.wav", NULL, SND_FILENAME ); break; } } void info_Bereich() { window(1,25,80,25); textbackground(4); clrscr(); textcolor(8); cprintf(" Beenden: \"0\" %cDaniel Bauer", 169); }
warum es nicht so funktioniert wie erwartet ist glaube ich klar =b die töne spielen so lange bis sie fertig sind, was aber wenn der user nur kurz drauf drückt? dann soll der ton auch nur kurz abspielen. was hier aber nicht der fall ist
falls jemand nen wegweiser für mich hätte, wäre ich wirklich froh darüber =b
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.