From: Barnard@forge.franken.de (Henning Schmiedehausen)
Newsgroups: de.comp.sys.amiga.misc
Subject: Re: SAS/C Compiler,  Stacksize errechnen
Date: Fri, 08 Jan 1993 01:31:46 GMT
Organization: Barnard's Software Forge (ECG038)
X-Newsreader: Arn V1.00

In article <KqOfs*P05@zikzak.in-berlin.de>, Andreas M. Kirchwitz writes:

> In article <nUNfs*K05@zikzak.in-berlin.de>, Andreas M. Kirchwitz writes:
> 
> > Ich habe mich ja nun daran gewoehnt, dass man bei SAS/C (im Gegensatz
> > zu M2Amiga) BPTR explizit wandeln muss in APTR.  Aber was ist denn nun
> > an "task->tc_SPUpper-task->tc_SPLower" (zwei APTR) wieder so fatal?
>
> Mit "(long)task->tc_SPUpper-(long)task->tc_SPLower" geht's.  Warum?

Pointer Arithmetik.

task->tc_SPUpper - task->tc_SPLower ist ein

APTR - APTR

oder auch ein

(void *) - (void *)

also  ist  die Differenz die Anzahl der void Elemente zwischen tc_SPUpper und
tc_SPLower.

Also habe ich mal ein kleines Test-Programm geschrieben:

- snip -

#include <stdio.h>

#include <exec/types.h>

TYPE  *foo,*bar;

long test[4];

main()
	{
	foo = (TYPE *)&test[0];
	bar = (TYPE *)&test[2];

	printf("bar       -       foo= %d\n", bar - foo);
	printf("(LONG)bar - (LONG)foo= %d\n", (LONG)bar - (LONG)foo);

	}

- snap -

                                 | pointer | LONG |
---------------------------------+---------+------+-
sc LINK DEFINE TYPE=void  test.c |    4    |  8   |
sc LINK DEFINE TYPE=char  test.c |    8    |  8   |
sc LINK DEFINE TYPE=int   test.c |    2    |  8   |
sc LING DEFINE TYPE=long  test.c |    2    |  8   |
sc LINK DEFINE TYPE=short test.c |    4    |  8   |

(Die Adre-Differenz zwischen zwei Langwrtern ist nunmal acht.

An sich sollte ja gelten:

( pnt2 - pnt1 ) * sizeof (typ auf den pnt1/pnt2 zeigen) = (ULONG)pnt1 - (ULONG)pnt2

Das ist auch richtig fr

( pnt2 - pnt1 ) * sizeof (char / int / long / short) =

(char  * - char  * ) * 1 = 8 -> stimmt
(int   * - int   * ) * 4 = 8 -> stimmt
(long  * - long  * ) * 4 = 8 -> stimmt
(short * - short * ) * 2 = 8 -> stimmt
(void  * - void  * ) * 0 = ????

(sizeof(void) ist 0!)

Laut K&R, 2nd Edition gilt:

Wenn  zwei  Zeiger  auf  Objekte vom gleichen Typ subtrahiert werden, ist das
Resultat  ein  Integer-Wert  mit  Vorzeichen,  der  den  Abstand zwischen den
Objekten   reprsentiert,   auf   die   die   Zeiger   zeigen;   Zeiger   auf
aufeinanderfolgende  Objekte  unterscheiden  sich  um 1.  Der Resultattyp ist
implementierungsabhngig,  aber  er ist als ptrdiff_t in der Definitionsdatei
<stddef.h> (long int bei SAS 6.1) vereinbart.

Hmmm..   also  ich  wei  nicht, wie ich die Differenz zweier Zeiger auf void
Objekte  betrachten  soll.   Ich  habe zwar im K&R nichts gefunden, aber IMHO
sollte man mit (void *) Subtraktionen vorsichtig sein.

Demnach wrde ich fr Dich:

(UBYTE *)task->tc_SPUpper - (UBYTE *)task->tc_SPLower

vorschlagen, dabei sollte das richtige Ergebnis rauskommen.

Ansonsten  poste  ich jetzt was nach adsp.sas und frage nach dem Ergebnis bei
(void *) - (void *)

Mach'  Dir  nix  draus.   Du bist nicht der erste, der mit Pointer-Arithmetik
reingefallen ist, und wirst nicht der letzte sein.  Ich erinnere mich an AKBP
II,  das  ist unser Kernal Hacking Kurs, als wir mit den Betriebssystem Gurus
fast zwei Tage lang einen Fehler suchten und er sich letztlich in sowas fand:

struct foo
{
	char *daten;
};

struct foo *pointer;

	pointer = (struct foo *) malloc( sizeof(struct foo) + datenbereich);
	pointer->daten = pointer + sizeof(struct foo);

Jetzt darf jeder mal raten, die Lsung kommt nach dem ^L

	pointer->daten = pointer + 1;


( Ja, hartmut.  C ist halt eine Hackersprache.  Alle, die das nicht abknnen,
oder  solche  Fehler nicht auf Anhieb sehen, sollen Oberon oder Modula (wrg)
verwenden.   Und  solche  Fehler  finde  ich inzwischen auch, wenn Du mich um
10:00 in der Nacht weckst und an den Rechner setzt...  ;)



	Alloooooooha!
		Henning


--
  \\ _ Henning Schmiedehausen - barnard@forge.franken.de _ // Amiga -
   \X/ --- Home of Barnard's Software Forge - ECG038 --- \X/  Learning to Fly

Hole  Dir  die  Super Pluckyo Bros.  fuer Deinen Debilo Spielcomputer!  Nerve
Deine  Eltern  solange,  bis  sie Dir das Zeugs kaufen.  Fuer nur 879$ und 99
cents.   Batterie,  Spielanleitung  und  Joystick  kosten extra!
                                       - The Super Pluckyo Bros.  - K-ACME TV