Autor Thema: Abfrage freier Speicher / TOS 2.06  (Gelesen 52622 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #20 am: Mi 01.05.2013, 17:44:00 »
Danke für die Erklärungen.
Ich habe hier das Buch "C Programmieren von Anfang an" von Helmut Erlenkötter. 16. Auflage von 2009.
Ist das brauchbar?

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.808
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #21 am: Mi 01.05.2013, 18:12:20 »
Danke für die Erklärungen.
Ich habe hier das Buch "C Programmieren von Anfang an" von Helmut Erlenkötter. 16. Auflage von 2009.
Ist das brauchbar?

Ja, in jedem Fall. Ich weiss z.B. aus dem alten Profibuch von 1988, daß da auch nicht ordentlich mit Pointern beschrieben wird, sondern auch immer nur mit long.

C hat den Vorteil, daß die Sprachbasis unabhängig ist. Alle Aufrufe, ob Windows oder TOS spezifisch, sind nur Funktionsaufrufe aus Bibliotheken. Die kann man dan separat erlernen, wenn die Grundlagen sitzen.

AUch genrelle fragen einfach hier reinstellen, auch wenns nur C allgemein und nicht Atari spezifisch ist. Helfen können wir immer zumindest versuchen ;)
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #22 am: Mi 01.05.2013, 19:14:43 »
die korrigierte lösung, nun ohne Warnungen, schaut so aus

#include <tos.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main(void){
uint16_t i,j=0;
int32_t mem=1, frei=0;
void *merk[255];
for(i=0;i<255;i++){
merk[i]=0;
}
i=0;
while(mem != 0){
mem = (long) Malloc(-1);
if(mem>0){
merk[i] = (long *) Malloc(mem);
frei=frei+mem;
i++;
}
}
printf("%d Speicherbl”cke allociert.\n",i);
for (j=0;j!=i;j++){
Mfree(merk[j]);
}
printf("Bytes frei %ld",frei);
return EXIT_SUCCESS;
}

edit: korrektur im quelltext
edit2: weiteres edit im quelltext. zudem compilat angefügt.
« Letzte Änderung: So 09.06.2013, 20:13:31 von HamSTer »

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.808
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #23 am: Mi 01.05.2013, 20:04:28 »
merk = (long *) Malloc(mem);

Deine Merker sind vom Typ void *, warum weist Du long * zu? Ja es funktioniert, aber eigentlich musst du sinngemäß auch auf void * casten. (Das aber nur am Rande.)
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #24 am: Mi 01.05.2013, 20:17:31 »
hm..

hab dann ein

long *merk[255];

draus gemacht.
so ist es dann wohl doch irgendwie sinnvoller.

oder aber beim malloc

merk = (void *) malloc(mem);

??



Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.808
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #25 am: Mi 01.05.2013, 20:27:43 »
Letzteres macht mehr Sinn, da Malloc ja generell Speicher hergibt, ohne zu sagen, daß er longs enthält.

Deswegen bekommst Du erst einen void * vom Malloc. Dein pointer würde dann auf den Typ zeigen, den Du da abspeichern möchtest. Für deine reine Zählung reichts es den bei void * zu belassen.

Aber stell Dir vor, du möchtest den Speicherplatz für ein Degasbild allozieren:

struct Degasbild
{
  uint16_t res;
  uint16_t palette[16];
  uint8_t daten[32000];
};

struct Degasbild * meinBild;

meinBild = (struct Degasbild *) Malloc(sizeof(struct Degasbild));

Du hast einen Zeiger auf die Daten mit Struktur Degasbild. Dann lässt Du dir von Malloc genausoviel Platz geben, Malloc weiss aber nichts, welche Struktur das haben wird. Deswegen transformierst Du den void * den Malloc Dir eigentlich gibt, explizit über den Cast auf einen Pointer auf das Bild.

Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #26 am: Mi 01.05.2013, 20:43:16 »
klasse  8)

Das macht sicher die Pflege von solcherlei Programmen leichter. Neue Anforderungen an das Bildformat oder andere Dinge  müssen lediglich in der Struktur angepasst werden.


Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.808
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #27 am: Mi 01.05.2013, 20:47:24 »
Genau und damit hast Du auch schon mit einfachem C einen Schritt Richtung Objektorientierung.
Das funktioniert natürlich auch mit allen möglichen Daten.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

rainers

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #28 am: Fr 03.05.2013, 19:26:31 »
Hallo HamSTer,

danke für Dein Code-Beispiel. Hab's mir mal geklaut und wurstel das nach Pascal um.

-R.

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #29 am: Sa 04.05.2013, 22:31:04 »
in dem ATOS C-Kurs ist ein Projektbeispiel

#ifdef __TURBOC__
#include <tos.h>
#else
#ifdef __GNUC__
#include <osbind.h>
#else
#include <tosbind.h>
#endif
#endif


typedef struct cookie_entry {
   union {
      unsigned long name_long;
      char name_array[4];
   } name;
   unsigned long value;
} CookieEntry;

int main(void)
{  CookieEntry **CookieJarPtr, *CookieJar;
   long OldStack;

   OldStack=Super(0L);
   CookieJarPtr = (CookieEntry**)0x5a0L;
   CookieJar=*CookieJarPtr;
   Super((void *)OldStack);
   return 0;
}

CookieJarPtr , ist demnach Verweis auf Verweis
Wie tief kann sowas gehen?

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #30 am: Sa 04.05.2013, 23:28:57 »

CookieJarPtr , ist demnach Verweis auf Verweis
Wie tief kann sowas gehen?

So tief man will (oder versteht). Zeiger sind die Grundbausteine für Arrays. So was geht z.B. auch:
int multi_array[8][8][8][8][8][8][8][8];

int main(int argc, char *argv[])
{
    multi_array[0][0][0][3][3][3][3][3] = 0;
}

Benutzen tut's nur der, der's braucht, mehr als drei Dimensionen sind schwer vorzustellen ;)
And remember: Beethoven wrote his first symphony in C

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.808
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #31 am: So 05.05.2013, 08:37:22 »
Übliche Programmierpraxis ist ist bei Pointern nicht tiefer als zwei Ebenen zu gehen, also maximal "Pointer auf pointer". 3 Ebenen in einem Pointer als z.B. ***p habe ich z.B. aktiv noch nicht gesehen.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #32 am: Mo 13.05.2013, 15:34:01 »
Ich stell hier einfach weiter frech fragen rein..

Bitfelder erschliessen sich mir noch nicht so ganz. Ist zB Folgendes erlaubt?

struct bla {
unsigned : 4;
unsigned kbshift: 1;
unsigned bell : 1;
unsigned repeat : 1;
unsigned click : 1;
} conterm = &0x484;

if (conterm.bell) printf("glocke ist an");


Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #33 am: Mo 13.05.2013, 17:02:49 »
Ich stell hier einfach weiter frech fragen rein..

Bitfelder erschliessen sich mir noch nicht so ganz. Ist zB Folgendes erlaubt?

struct bla {
unsigned : 4;
unsigned kbshift: 1;
unsigned bell : 1;
unsigned repeat : 1;
unsigned click : 1;
} conterm = &0x484;

if (conterm.bell) printf("glocke ist an");


Nö. Aber fast richtig.

Es gibt in C keine Funktionalität, um eine Variable an einer absoluten Adresse zu deklarieren.

Was geht, ist folgendes:

struct bla {
unsigned : 4;
unsigned kbshift: 1;
unsigned bell : 1;
unsigned repeat : 1;
unsigned click : 1;
} *conterm = (struct bla *) 0x484;

if (conterm->bell) printf("glocke ist an");


Das sollte mit den meisten Atari-Compilern funktionieren, ist aber nicht garantiert. Der C-Standard schreibt nicht vor, ob Bitfelder "von links" oder "von rechts" gezählt werden. Das bleibt dem Compilerschreiber überlassen.

Ein m68k-Compilerbauer würde sich das Leben aber unnötig schwer machen, wenn er die Bitfelder anders herum zählen würde, als der m68k-Prozessor selbst das (bei bset/bclr beispielsweise) tut.
« Letzte Änderung: Mo 13.05.2013, 17:07:12 von mfro »
And remember: Beethoven wrote his first symphony in C

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #34 am: Mo 13.05.2013, 17:47:02 »
so funktioniert es nun auch:

#include <stdio.h>
#include <tos.h>
#include <stdlib.h>

typedef struct {
unsigned frei: 4;
unsigned kbshift: 1;
unsigned bell: 1;
unsigned repeat: 1;
unsigned click: 1;
} conterm;

int main(void){
long *oldstack;
conterm *wat = (void *) 0x484;

oldstack = (long *) Super(0x0);

if (wat->bell) printf("glocke ist an");

Super((void*) oldstack);

return EXIT_SUCCESS;
}

Ich denke ich werde einfach alle Kapitel ab den Zeigern aufwärts nochmals lesen müssen  :o

EDIT: Compilat angehängt
« Letzte Änderung: So 09.06.2013, 20:07:07 von HamSTer »

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.808
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #35 am: Mo 13.05.2013, 17:53:36 »
Mit welchem Compiler gehen die Bitfelder? Bei Pure C und AHCC hätte ich schwere Zweifel, da die erst ab C99 im Standard sind, Pure C definitiv nur C90 unterstützt und sich Henk bislang nicht hat bewegen lassen, sämtliche C99 Features zu implementieren.

GCC ist kein geeigneter Kandidat für originale Atarihardware, der läuft nur sinnvoll für Systeme mit viel Speicher und CPU Upgrades. "Hello World" für reines TOS 110K, erm, disqualfiziert!
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

gstoll

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #36 am: Mo 13.05.2013, 18:02:54 »
Mit welchem Compiler gehen die Bitfelder? Bei Pure C und AHCC hätte ich schwere Zweifel,
Geht mit beiden.

In PureC habe ich das schon slebst genutzt. AHCC kommt zumindest mit der Deklaration zurecht, habe es dort noch nicht bewußt getestet.

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #37 am: Mo 13.05.2013, 18:05:20 »
ja, mit pure c funktioniet das hier.
was mich generell stört sind auch die großen compilate. aber bis ich etwas brauchbares produzier soll das erst mal zurück stehen.  ;)

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #38 am: Mo 13.05.2013, 18:44:52 »
Bitfelder gab's schon im K&R "Ur-C" und soweit ich weiß, können alle Atari-Compiler (mit Ausnahme des Alcyon-C, aber das dürfte kaum mehr einer kennen) damit umgehen. Trotzdem würde ich sie nicht verwenden. Zum einen, weil man nicht weiß, ob der Compiler "von links" oder "von rechts" zählt, zum anderen, weil die Größe eines Bitfelds immer ein Vielfaches von sizeof(int) ist.

Wenn man also - wie im Beispiel - so ein Bitfeld wie ein Stück Butterbrotpapier auf eine feste Adresse "durchpausen" will, ist man von der Breite eines ints abhängig. Bei einem Compiler, der ints 32 Bit breit gestaltet (Lattice & gcc, z.B.) landet man dann leider zwei Bytes daneben...


Übrigens ist mein kleinstmögliches "Hello world!"-Programm, mit gcc compiliert und lauffähig, genau 458 Bytes groß ;)
And remember: Beethoven wrote his first symphony in C

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #39 am: Mo 13.05.2013, 20:11:29 »
  ..
« Letzte Änderung: Mo 10.06.2013, 01:56:48 von HamSTer »