Software > Coding

Abfrage freier Speicher / TOS 2.06

<< < (7/10) > >>

mfro:

--- Zitat von: HamSTer am Sa 04.05.2013, 22:31:04 ---
CookieJarPtr , ist demnach Verweis auf Verweis
Wie tief kann sowas gehen?

--- Ende Zitat ---

So tief man will (oder versteht). Zeiger sind die Grundbausteine für Arrays. So was geht z.B. auch:

--- Code: ---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;
}

--- Ende Code ---

Benutzen tut's nur der, der's braucht, mehr als drei Dimensionen sind schwer vorzustellen ;)

simonsunnyboy:
Ü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.

HamSTer:
Ich stell hier einfach weiter frech fragen rein..

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


--- Code: ---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");


--- Ende Code ---

mfro:

--- Zitat von: HamSTer 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?


--- Code: ---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");


--- Ende Code ---

--- Ende Zitat ---

Nö. Aber fast richtig.

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

Was geht, ist folgendes:


--- Code: ---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");


--- Ende Code ---

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.

HamSTer:
so funktioniert es nun auch:


--- Code: ---#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;
}
--- Ende Code ---

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

EDIT: Compilat angehängt

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln