amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Timer [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2004-04-25, 00:42 h

THDany
Posts: 38
User
Mahlzeit!

Ich habe da ein kleines Problem. Im Zuge einer extremen Langeweile hab ich ein Programm geschrieben, welches die tm Struktur ausreizt. Das hab ich dann in den Newsgroups bekannt geben und tatsächlich interessiert sich jemand dafür.

Naja damit will ich euch aber nicht langeweilen. Auf jeden Fall gabs genug Interesse um eine Weiterentwicklung zu rechtfertigen. Bislang gab es da keine Probleme, doch als ich einen Wecker eingebaut habe, welche zu einer bestimmten Zeit eine frei wählbare Aktion ausführt, fingen meine Programe an. Die auszuführende Aktion kann mittels einen String-Feldes eingetragen werden. Soweit kein Problem. Doch will ich die Angaben auslesen und speichern muss ich Speicher für eine char Variable reservieren. Das mache ich seit jeher mit malloc();. Doch versuche ich das bei meine Uhr gibt es sofort einen illegalen Speicherzugriff. Selbst bei malloc(1);. Ich konnte das Problem jetzt soweit isolieren, dass es nur dann auftritt solange ich den Timer benutze. Ich hab allerdings nicht den hauch einer Idee wo ich da den Fehler gemacht habe. Hier kommt der entsprechende Quelltext zu meinem Timer:

#include <time.h>

struct Zeitmesser
{
struct timerequest *tr;
struct MsgPort *port;
} zeitmesser = { NULL, NULL };

void __saveds timer_ende()
{
if(zeitmesser.port)
{
if(zeitmesser.tr)
{
if(CheckIO((struct IORequest *)zeitmesser.tr)) return;
AbortIO((struct IORequest *)zeitmesser.tr);
WaitIO((struct IORequest *)zeitmesser.tr);
CloseDevice((struct IORequest *)zeitmesser.tr);
DeleteExtIO((struct IORequest *)zeitmesser.tr);
}
DeleteMsgPort(zeitmesser.port);
}
zeitmesser.port = NULL;
zeitmesser.tr = NULL;
}

BOOL __saveds timer_start()
{
if((zeitmesser.port = CreateMsgPort()))
if((zeitmesser.tr = (struct timerequest *)CreateExtIO(zeitmesser.port, sizeof(struct timerequest))))
if(!OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)zeitmesser.tr, 0))
return TRUE;
return FALSE;
}

void __saveds timer_stellen()
{
zeitmesser.tr->tr_node.io_Command = TR_ADDREQUEST;
zeitmesser.tr->tr_time.tv_secs = 1;
zeitmesser.tr->tr_time.tv_micro = 0;
SendIO((struct IORequest *)zeitmesser.tr);
}

Ich weiss, ich verwede keine Kommentare. Sorry aber meine guten Vorsätze in der Richtung bleiben irgendwie immer auf der Strecke.

Ich hoffe irgendjemand kann da den Fehler finden, da es ansonsten keinen Sinn macht meine Uhr weiter zu entwickeln.

Im Übrigen, sollte jemand einen anderen Weg kennen, sekündlich ein Signal zu bekommen, immer her damit.

Danke erstmal.

[ - Answer - Quote - Direct link - ]

2004-04-25, 01:41 h

thomas
Posts: 7718
User

Nun, du solltest eine main() Funktion dazutun, die den Fehler auslöst. So kann man nichts erkennen.

Das einzige, was mir nicht ganz klar ist, ist die Zeile mit dem if (CheckIO()) return;
Meines Erachtens bedeutet das, daß du das timer.device nicht schließt, wenn noch ein Timer läuft. Macht in meinen Augen keinen Sinn.

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Answer - Quote - Direct link - ]

2004-04-25, 12:43 h

Kronos
Posts: 1168
User
Zitat:
Original von THDany:
Mahlzeit!

I speichern muss ich Speicher für eine char Variable reservieren. Das mache ich seit jeher mit malloc();. Doch versuche ich das bei meine Uhr gibt es sofort einen illegalen Speicherzugriff. Selbst bei malloc(1);.


Leider kann ich jetzt nur raten :shock2: aber könnte es sein das du es irgendwie
schaffts den Zugriff auf die Standardfunktionen in der Linkerlib zu versperren ?
Eventuell mit dem __saveds-Zeugs ? (jaja ist lange her das isch mit SAS u.ä.
beschäftigt habe :glow: ).

Definiere doch einfach mal einen globalen Buffer (char buf[5000];) und weise
deinen Strings daraus Speicher zu. Dann wüssten wir wenigstens ob es
wirklich an malloc liegt oder nicht.


MfG
Kronos
--

Only the good die young all the evil seem to live forever

[ - Answer - Quote - Direct link - ]

2004-04-25, 13:39 h

THDany
Posts: 38
User
Hups..schäm.

Ja klar war es das __saveds. Hab den Timer aus nem anderen Programm das mit Near-Code compiliert wurde. Ich arveite aber mit Far-Code. __saveds gelöscht und schon gehts.

Aber leider bekomm ich vim Timer nicht mehr den ganzen Speicher freigegeben, auch wenn ich CheckIO entfert habe. Woran kann das liegen?

[ - Answer - Quote - Direct link - ]

2004-04-25, 15:20 h

thomas
Posts: 7718
User
Zitat:
Original von THDany:
Aber leider bekomm ich vim Timer nicht mehr den ganzen Speicher freigegeben, auch wenn ich CheckIO entfert habe. Woran kann das liegen?



Jedesmal oder nur wenn du das Programm das erste mal laufen läßt ? Versuch's mal mit Avail flush.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Answer - Quote - Direct link - ]

2004-04-26, 09:58 h

gni
Posts: 1106
User
Zitat:
THDany:
Ja klar war es das __saveds. Hab den Timer aus nem anderen Programm das mit Near-Code compiliert wurde. Ich arveite aber mit Far-Code. __saveds gelöscht und schon gehts.

Wenn Du mit DATA=FAR[ONLY] kompilierst, dann bewirkt __saveds nichts. Das es ohne __saveds geht, klingt supsekt.
Warum Du im übrigen time.h einbindest, ist mit schleierhaft. Dafür lässt Du alle OS Includes weg.

[ - Answer - Quote - Direct link - ]

2004-04-26, 11:30 h

THDany
Posts: 38
User
Wie ich lasse alle OS-Includes weg? Das versteh ich jetzt nicht? Was sollte ich denn da noch includen?

[ - Answer - Quote - Direct link - ]

2004-04-26, 12:45 h

thomas
Posts: 7718
User
Zitat:
Original von THDany:
Wie ich lasse alle OS-Includes weg? Das versteh ich jetzt nicht? Was sollte ich denn da noch includen?



proto/exec.h
devices/timer.h

Nur dann kann der Compiler überprüfen, ob du immer die richtigen Pointer übergibst. Du solltest beim Compiler unbedingt einschalten, daß er keine Funktionen ohne Prototypen zuläßt. Dann merkst du schnell, wenn du ein Include vergessen hast.

time.h brauchst du für den o.g. Abschnitt überhaupt nicht.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Answer - Quote - Direct link - ]

2004-04-26, 14:48 h

THDany
Posts: 38
User
hab ich gemerkt das ich das nicht brauche. Ist so ein Überbleibsel von einem anderen Programm genau wie __saveds.

Allerdings erkennt mein Compiler wenn eine Funktion keinen Prototyp hat. Ansonsten würde das Programm ja eh nicht laufen.

[ - Answer - Quote - Direct link - ]

2004-04-26, 17:31 h

thomas
Posts: 7718
User
Zitat:
Allerdings erkennt mein Compiler wenn eine Funktion keinen Prototyp hat. Ansonsten würde das Programm ja eh nicht laufen.

Natürlich läuft es auch ohne, wieso sollte es nicht ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Answer - Quote - Direct link - ]

2004-04-26, 20:05 h

THDany
Posts: 38
User
Wenn das Programm keine Funktionen findet kann es diese auch wohl schlecht ausführen. Oder gehst du jetzt nur von den Prototypen ohne Funktion aus? Die will mein Compiler (Storm C V3) auch haben sonst gibt es Fehlermeldungen.

[ - Answer - Quote - Direct link - ]

2004-04-27, 08:37 h

gni
Posts: 1106
User
Zitat:
THDany:
Wenn das Programm keine Funktionen findet kann es diese auch wohl schlecht ausführen.

Der Linker schaut nur auf die Namen.
Zitat:
Oder gehst du jetzt nur von den Prototypen ohne Funktion aus? Die will mein Compiler (Storm C V3) auch haben sonst gibt es Fehlermeldungen.
Dann kann Dein Compiler den hier geposteten Code nicht akzeptiert haben. Ausserdem solltest Du auch casten. Z.B. der IO-Request des Timers hat die passende Struktur für die Exec-Funktionen (tr_node).

[ - Answer - Quote - Direct link - ]

2004-04-27, 12:40 h

THDany
Posts: 38
User
Naja was spielts jetzt für ne Rolle? Er hat den Code akzeptiert, hat das Ganze compiliert und jetzt läuft es tadellos, seit ich die __saveds weggemacht habe.

Also mal Dank an die die mir Antworten gegeben haben.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Timer [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.