atari-home.de - Foren
Software => Coding => Thema gestartet von: laufkopf am Fr 05.06.2015, 18:06:32
-
Sorry für den dämlichen Betreff. Mir ist nichts weiter eingefallen.
Aufgrund von ataristar Anliegen Betreff seines Acc, hatte ich auch mal angefangen etwas in C zu schreiben. Unter Pure C funktioniert übersetzen und ausführen tadellos. Mit AHCC wird auch übersetzt, aber das Programm stürzt ab und ich habe keinen Plan warum ???
#include <stdint.h>
#include <aes.h>
#include <tos.h>
#include <stdio.h>
#include <float.h>
DISKINFO *phdfree;
void main (void){
char acc_name[] = " HD Info...";
int16_t ap_id, menu_id;
int16_t msg_buf[8];
int16_t ret, i;
int32_t laufwerke, lw[32];
char alw = 'A';
double gesamt[32], frei[32];
ap_id = appl_init();
if (ap_id >= 0)
{
menu_id = menu_register(ap_id, acc_name);
if (menu_id >= 0)
{
for (;;)
{
evnt_mesag (msg_buf);
switch (msg_buf[0])
{
case AC_OPEN:
if (msg_buf[4] == menu_id)
{
if (Pdomain(-1) == 1)
{
printf("\nWir laufen in einer MiNT-Domain.");
}
else
{
printf("\nWir laufen in einer TOS-Domain.");
}
laufwerke = Drvmap();
printf("\nLaufwerke laut Drvmap(): ");
for(i=0;i<32;i++)
{
lw[i]=((laufwerke>>i)&1);
printf("%ld",lw[i]);
}
printf("\nDetails..\n");
for(i=2;i<32;i++)
{
if(lw[i] == 1)
{
ret = Dfree(phdfree, i+1);
if (ret == 0)
{
printf("\nLW %c Anz freie Cluster : %ld\n",alw+i,(*phdfree).b_free);
printf("Geamtzahl Cluster : %ld\n",(*phdfree).b_total);
printf("Bytes pro Sektor : %ld\n",(*phdfree).b_secsiz);
printf("Sektoren / Cluster: %ld\n",(*phdfree).b_clsiz);
gesamt[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);
printf("Gesamt Speicher in MB: %.2lf\n", gesamt[i]);
printf("Freier Speicher in MB: %.2lf", frei[i]);
/*form_alert( 1, "[1][Accessorie][ OK ]");*/
}
}
}
}
break;
case AC_CLOSE:
if (msg_buf[3] == menu_id)
{
}
break;
}
}
}
}
for(;;) evnt_mesag (msg_buf);
}
Vielleicht habt ihr ja nen Rat ?
-
Vielleicht habt ihr ja nen Rat ?
Nur mal so ins Blaue: AHCC kann keine floats und doubles. Jedenfalls dann nicht, wenn keine FPU im Rechner steckt.
-
Ohne debugger würde ich printfs einbauen, um rauszubekommen wo es passiert. Mit dem pure-debugger kann man sich ansonsten auch anhand der Crash-Adresse die Codestelle anzeigen lassen ("View source", dann crash-PC+(akt.-text-start-crash-text-start)). Der text ist im PD in _base.
Erstmal würde ich auf stack-Überlauf tippen, aber mit AHCC kenn ich mich überhaupt nicht aus.
-Helmut
-
Die Ausgabe läuft definitiv bis zu dieser passage
gesamt = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);
Im Anhang n Shot vom build
-
Im Anhang n Shot vom build
Nach den Ausgaben zu urteilen nutzt Du die ST Version. Wie Markus schon schrieb Du benötigst einen 68020 und 68881/2 oder höher.
-
Alles läuft auf einer Emulation mit Aranym. Derselbe Source wird ja mit Pure C korrekt übersetzt und läuft auch.
-
Alles läuft auf einer Emulation mit Aranym. Derselbe Source wird ja mit Pure C korrekt übersetzt und läuft auch.
Wie schon gesagt, AHCC braucht eine FPU. Nun ist ja in Aranym eine drin, allerdings muß man dann auch passenden Code dafür erzeugen. Deine Compilerausgabe sieht so aus, als ob das nicht der Fall wäre.
Hast Du die Schalter "-2" und "-8" gesetzt?
-
Auch mit den Schaltern bekomme ich dasselbe Ergebnis. :(
-
in pure c waren/sind diese schalter auch aus.
-
in pure c waren/sind diese schalter auch aus.
Irgendwie scheinst Du nicht richtig hinzuhören: Pure-C _kann_ Soft-float, AHCC kann's nicht.
-
Hi mfro,
ich lese hier nur so mit und versuche mal Licht in das Ganze zu bringen.
Du schreibst: Pure-C _kann_ Soft-float
Bedeutet: Das compilierte Prg. läuft auf allen Rechnern
Wird ein/mehrere Schalter gesetzt benötigt das Prg. auf dem Rechner eine FPU
Bei AHCC geht alles nur mit FPU, muß zwingend aber mit Schalter 2/8 compiliert werden.
Für Rechner ohne FPU muß man das Prg. umschreiben, also auf Double/FLoat verzichten
Habe ich das geschriebene so richtig verstanden?
Gruß
Wolfgang
-
Habe ich das geschriebene so richtig verstanden?
exakt.
-
Ich habe etwas abgeändert
von
gesamt[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);
nach
gesamt[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_total) / 1024) / 1024);
frei[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_free) / 1024) / 1024);
und dann noch
.C [-8]
in die Projektdatei ergänzt.
Jetzt läuft es.
-
Wie schaut denn das Resultat aus?
-
Wie schaut denn das Resultat aus?
Schaut nun fast wie unter Pure C aus.
Wir laufen in einer TOS-Domain.
Laufwerke laut Drvmap(): 10110001000000000000100000000000
Details..
LW C Anz freie Cluster : 4556
Geamtzahl Cluster : 19176
Bytes pro Sektor : 8192
Sektoren / Cluster: 2
Gesamt Speicher in MB: 299.62
Freier Speicher in MB: 71.19
LW D Anz freie Cluster : 18225238
Geamtzahl Cluster : 54945657
Bytes pro Sektor : 1048576
Sektoren / Cluster: 1
Gesamt Speicher in MB: 54945657
Freier Speicher in MB: 18225238
LW H Anz freie Cluster : 18225238
Geamtzahl Cluster : 54945657
Bytes pro Sektor : 1048576
Sektoren / Cluster: 1
Gesamt Speicher in MB: 54945657
Freier Speicher in MB: 18225238
LW U Anz freie Cluster : 4556
Geamtzahl Cluster : 19176
Bytes pro Sektor : 8192
Sektoren / Cluster: 2
Gesamt Speicher in MB: 299.62
Freier Speicher in MB: 71.19
Ist also immer noch nur Text. D und H sind Laufwerke vom Host und die Werte stimmen überhaupt nicht.
Aber ohne das abändern und Schalter -8 stürzte es auch ab.
Ich habe etwas abgeändert
von
gesamt[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);
nach
gesamt[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_total) / 1024) / 1024);
frei[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_free) / 1024) / 1024);
und dann noch
.C [-8]
in die Projektdatei ergänzt.
Jetzt läuft es.
war also auch notwendig.
Nächster Schritt für mich ist nun die Ausgabe in ein Fenster zu legen. Ich übe mich da langsam ran
-
Ich hab ne Lösung ohne Floats gefunden 8)
-
Die Rechnerei geht mit long genausogut, wenn man ein bißchen aufpaßt:
free = phdfree.b_free * phdfree.b_clsiz * phdfree.b_secsiz / 1024;
full = phdfree.b_total * phdfree.b_clsiz * phdfree.b_secsiz / 1024;
percentage = 100 * free / full;
sprintf(str, "Laufwerk %c %d.%d MB (%d%%) von %d.%d MB frei", i + 'A',
free / 1024, free % 1024, percentage, full / 1024, full % 1024);
-
Ich hab es nun mit etwas herumschieben geschafft.
#ifdef __AHCC__
uint32_t gesamt[32], frei[32];
#else
double gesamt[32], frei[32];
#endif
ifdef __AHCC__
gesamt[i] = (((((*phdfree).b_secsiz>>8) * (*phdfree).b_clsiz) * (*phdfree).b_total)>>12);
frei[i] = (((((*phdfree).b_secsiz>>8) * (*phdfree).b_clsiz) * (*phdfree).b_free)>>12);
printf("Gesamt Speicher in MB: %ld\n", gesamt[i]);
printf("Freier Speicher in MB: %ld", frei[i]);
#else
gesamt[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_total) / 1024) / 1024);
frei[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_free) / 1024) / 1024);
printf("Gesamt Speicher in MB: %.2lf\n", gesamt[i]);
printf("Freier Speicher in MB: %.2lf",frei[i]);
#endif
Sicherlich schaut das nicht soo elegant aus, aber funktioniert.
edit: ok, nachkommastellen gibt es hier jetzt auch nicht.
edit2: und sieht nicht so elegant aus
-
Nur kurz draufgeguckt: phdfree ist nicht initialisiert. Wundere dich also nicht, wenn seltsame Dinge passieren.
-
hm, bisher alles normal
hab dann aber noch was abgeändert.
DISKINFO *phdfree = malloc(sizeof(DISKINFO));
und das dann nach main verschoben.
Immer noch alles ok.
-
Hallo,
auch wenn es hier konkret ohne floats geht: es existieren auch einige soft float libs (z. B. soft-fp, auch im Linux Kernel). Hat schon einmal jemand hier diese (mit AHCC) ausprobiert?
Viele Grüße
Markus
-
Sofern ich Henk richtig verstanden habe, ist es nicht möglich. (Ich frage, ob ich seine Email hier zitieren darf)
-
ok hier die Antwort/das Zitat
Henk Robbers schreef op 6/7/15 om 1:47 PM:
> AHCC does not support software floating point.
To be more precise:
AHCC does not provide calls to routines that perform
floating point operations.
Nor does it provide such routines.
(Pure C does.)
This can lead to internal inconsistencies.
hence the 'OE' message.
Please avoid any floating point usage in cases where
integral would be possible in stead.
-
hm, bisher alles normal
hab dann aber noch was abgeändert.
DISKINFO *phdfree = malloc(sizeof(DISKINFO));
und das dann nach main verschoben.
Immer noch alles ok.
Tip: dynamische Speicherverwaltung besser nur, wenn sie wirklich gebraucht wird. Hier ist das nicht der Fall. In einem Accessory ist das u.U. sogar tödlich (und deswegen nicht erlaubt).
Laß' das malloc() weg und ersetze lieber:
DISKINFO *phdfree;
...
Dfree(phdfree, i + 1);
durch
DISKINFO phdfree;
...
Dfree(&phdfree, i + 1);
-
Danke für den Tipp!
Dadurch entfallen alle Zeiger, es wird bedeutend übersichtlicher und spart noch einige Bytes ein (sofern ich das richtig beobachtet habe).
-
Juhu, nun mit sauberer Ausgabe in ein Fenster.
-
Update: Funktioniert nun als ACC oder APP. Einfach umbenennen,
-
Update: Nun auch mit hübschen Balken ..
Edit: vergessen die virtuelle workstation zu löschen.
-
Kannst du daraus auch ein CPX machen, welches das betagte HD-Free.cpx mal ablösen könnte? Das hat nämlich bei großen Platten einen doofen Darstellungsfehler.
-
CPX ist wieder ne neue Herausforderung. Ich bin ja noch Anfänger. Vielleicht sollte das jemand mit Erfahrung machen.
-
Ich hab mir mal das Beispiel aus dem Profibuch angeschaut. Egal ob Form oder Event CPX, ist es erlaubt mit normalen VDI-Befehlen in das eigene Fenster zu malen/schreiben? Oder geht das nur über einen Objektbaum/RSC?
-
Update: Das Fenster wird nun beim Öffnen in der Breite und Höhe optimal angepasst. Zudem waren die Balken nicht richtig.
Die AHCC-Version versagt bei sehr großen Partitionen (16GB Image probiert und geht noch) (die Werte stimmen dann nicht mehr). Die PureC-Version zeigt richtig an.
-
Ich hab mir mal das Beispiel aus dem Profibuch angeschaut. Egal ob Form oder Event CPX, ist es erlaubt mit normalen VDI-Befehlen in das eigene Fenster zu malen/schreiben? Oder geht das nur über einen Objektbaum/RSC?
Man darf. Ganz einfach ist das aber nicht.
Viel einfacher wäre es, das ganze als Objektbaum aufzubauen. Ist ja nichts dabei, was sich damit nicht ganz simpel darstellen ließe (die Anzeigebalken können als G_BOX-Objekte, die Anzeigetexte als G_STRING realisiert werden). Die Bildschirmausgabe übernimmt dann XForm_do() und mit redraws muß man sich nicht selbst rumschlagen. Dafür sind die AES da.
-
Ich hab mal frech n Coldfire Compilat beigefügt. Wäre schön, wenn das mal wer testen könnte.
CPX guck ich mir dann mal am WE an. Vielleicht hab ich ja erfolg
Edit2606: Unterscheidung MB GB, Beachtung AP-TERM, etwas vereinfacht.
-
Ich steh grad etwas auf m schlauch.. Wie warte ich denn auf das loslassen einer Maustaste?
edit: Ich doof. Ich habs
-
Wenn man die CF App als Programm startet kann man zwar auch den Fenster schliessenknopf klicken und das Fenster schliesst sich auch aber das Programm beendet sich nicht, der Desktop kommt nicht.
(http://forum.atari-home.de/index.php?action=dlattach;topic=12014.0;attach=8490;image)
Die normale 68k Version läuft genau so gut.
Bei der Firebee ist wichtig das Laufwerk A:\ mit abzufragen weil es dort die SD Karte ist.
Als ACCs läuft es gar nicht, es kommt kein Fenster.
-
Der Firebee Test zuvor lief unter single FireTOS ...
Unter MiNT/XaAES auf der Firebee läuft alles einwandfrei, bis auf das Laufwerk A:\ fehlt.
(http://forum.atari-home.de/index.php?action=dlattach;topic=12014.0;attach=8492;image)
Auch die 68k Version läuft einwandfrei !