Autor Thema: Mit Pure C ja, mit AHCC nein.  (Gelesen 30472 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Mit Pure C ja, mit AHCC nein.
« 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 ?
« Letzte Änderung: Mo 22.06.2015, 09:49:57 von laufkopf »

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #1 am: Fr 05.06.2015, 19:49:07 »
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.
And remember: Beethoven wrote his first symphony in C

Offline HelmutK

  • Benutzer
  • Beiträge: 676
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #2 am: Fr 05.06.2015, 22:08:48 »
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
« Letzte Änderung: Fr 05.06.2015, 22:12:06 von HelmutK »

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #3 am: Fr 05.06.2015, 22:35:57 »
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

Offline KarlMüller

  • Benutzer
  • Beiträge: 422
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #4 am: Sa 06.06.2015, 16:10:46 »
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.

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #5 am: Sa 06.06.2015, 17:17:37 »
Alles läuft auf einer Emulation mit Aranym. Derselbe Source wird ja mit Pure C korrekt übersetzt und läuft auch.

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #6 am: Sa 06.06.2015, 17:59:57 »
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?
And remember: Beethoven wrote his first symphony in C

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #7 am: Sa 06.06.2015, 19:08:07 »
Auch mit den Schaltern bekomme ich dasselbe Ergebnis.  :(

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #8 am: Sa 06.06.2015, 19:40:05 »
in pure c waren/sind diese schalter auch aus.

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #9 am: Sa 06.06.2015, 21:10:23 »
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.
And remember: Beethoven wrote his first symphony in C

Offline Wosch

  • Benutzer
  • Beiträge: 771
  • Ich liebe dieses Forum!
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #10 am: Sa 06.06.2015, 21:39:15 »
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



Milan060, Falcon FX36, TT,STE,MST,ST, MagicPC,STEmulator,Lynx,Jag,2600,5200,7800, 400,800,600XL,800XL,65XE,130XE,1200XL,PCs mit Win7, Win10, Linux, div. Apple Geräte, div. RPis

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #11 am: Sa 06.06.2015, 22:30:05 »
Habe ich das geschriebene so richtig verstanden?

exakt.
And remember: Beethoven wrote his first symphony in C

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #12 am: So 07.06.2015, 12:06:44 »
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.

guest3182

  • Gast
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #13 am: So 07.06.2015, 14:49:58 »
Wie schaut denn das Resultat aus?

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #14 am: So 07.06.2015, 17:13:29 »
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
« Letzte Änderung: So 07.06.2015, 17:16:07 von laufkopf »

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #15 am: So 07.06.2015, 19:47:13 »
Ich hab ne Lösung ohne Floats gefunden  8)

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #16 am: So 07.06.2015, 20:15:23 »
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);

And remember: Beethoven wrote his first symphony in C

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #17 am: So 07.06.2015, 20:46:29 »
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
« Letzte Änderung: Mo 22.06.2015, 09:50:46 von laufkopf »

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #18 am: So 07.06.2015, 20:54:24 »
Nur kurz draufgeguckt: phdfree ist nicht initialisiert. Wundere dich also nicht, wenn seltsame Dinge passieren.
And remember: Beethoven wrote his first symphony in C

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Mit Pure C ja, mit AHCC nein.
« Antwort #19 am: So 07.06.2015, 21:27:58 »
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.