Forum: Compiler & IDEs Leere #define


von ritzeratze (Gast)


Lesenswert?

Hallo und guten Morgen,
kann mir bitte jemand den Kopf von der Angehängten Funktion erklären.
Was bedeutet die leere define mit idata?
Was macht das für einen Sinn?

Danke
Schönes Wochenende!
1
#define uchar unsigned char
2
#define uint unsigned int
3
#define bit uchar
4
#define idata
5
#define code
6
7
8
uchar w1_rom_search( uchar diff, uchar idata *id )
9
{
10
  uchar i, j, next_diff;
11
  bit b;
12
13
  if( w1_reset() )
14
    return PRESENCE_ERR;      // error, no device found
15
  w1_byte_wr( SEARCH_ROM );      // ROM search command
16
  next_diff = LAST_DEVICE;      // unchanged on last device
17
  i = 8 * 8;          // 8 bytes
18
  do{
19
    j = 8;          // 8 bits
20
    do{
21
      b = w1_bit_io( 1 );      // read bit
22
      if( w1_bit_io( 1 ) ){      // read complement bit
23
  if( b )          // 11
24
    return DATA_ERR;      // data error
25
      }else{
26
  if( !b ){        // 00 = 2 devices
27
    if( diff > i ||
28
      ((*id & 1) && diff != i) ){
29
      b = 1;        // now 1
30
      next_diff = i;      // next pass 0
31
    }
32
  }
33
      }
34
      w1_bit_io( b );           // write bit
35
      *id >>= 1;
36
      if( b )          // store bit
37
  *id |= 0x80;
38
      i--;
39
    }while( --j );
40
    id++;          // next byte
41
  }while( i );
42
  return next_diff;        // to continue search
43
}

von PittyJ (Gast)


Lesenswert?

idata wird durch 'nichts' ersetzt. Der Kopf wird also zu

uchar w1_rom_search( uchar diff, uchar  *id )

und durch die uchar ersetzung zu

unsigned char w1_rom_search( unsigned char diff, unsigned char  *id )


Schlechter Stil ist das allemal. Defines schreibt man meistens groß, 
also
#define UCHAR unsigned char

Und die meisten defines sind überflüssig. Besser typedef benutzen.

von Oliver S. (oliverso)


Lesenswert?

Schreib dir halt einfach mal auf, was die Textersetzung aus dem Code 
macht.

Vermutlich ist das Code, der für Unterschiedliche Plattformen kompiliert 
werden kann, und manche davon benötigen halt noch spezielle qualifier.

Oliver

von ritzeratze (Gast)


Lesenswert?

Ach jetzt Blick ich durch!
DAnke

von Peter D. (peda)


Lesenswert?

Oliver S. schrieb:
> Vermutlich ist das Code, der für Unterschiedliche Plattformen kompiliert
> werden kann, und manche davon benötigen halt noch spezielle qualifier.

Genau so ist es.
Der Code ist original für den Keil C51 und der kennt z.B. auch 
Bitvariablen.
Ich hab viel Code auf 8051 und auf AVR laufen und da wäre es dumm, den 
gesamten Code umzuschreiben.

von Masl (Gast)


Lesenswert?

Keine Ahnung wieso, aber als ich den Code sah dachte ich mir spontan: 
"Der kommt bestimmt von PeDa" ;-)

von Mark B. (markbrandis)


Lesenswert?

Peter Dannegger schrieb:
> Der Code ist original für den Keil C51 und der kennt z.B. auch
> Bitvariablen.
> Ich hab viel Code auf 8051 und auf AVR laufen

Gibt's da kein stdint.h?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> Gibt's da kein stdint.h?

Was hülfe dir das bezüglich „bit“, „idata“ und „code“?

von Mark B. (markbrandis)


Lesenswert?

Jörg Wunsch schrieb:
> Was hülfe dir das bezüglich „bit“, „idata“ und „code“?

Es würde bezüglich uint und uchar helfen, und indirekt dann auch bei bit 
weil dieses ja auch über uchar definiert ist.

Drei von fünf ist doch nicht schlecht :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> Drei von fünf ist doch nicht schlecht :)

Zwei von fünf, denn "bit" ist nur hier so definiert, während das
(daher Peters Bezugnahme) woanders tatsächlich einen eigenständigen
Typ darstellt.  Da hilft dir <stdint.h> gar nicht (und existiert
möglicherweise auf dem alten 8051-Compiler nicht einmal).

Da sich die Frage jedoch auf die leeren #defines bezog, geht dein
Einwand zu 100 % am Thema vorbei.

von Mark B. (markbrandis)


Lesenswert?

Na dann eben zwei von fünf.

Mag auch sein, dass der hier gepostete Code sogar vor C99 entstanden 
ist. Code, zumal C-Code, ist verdammt langlebig. Sehe ich auf der Arbeit 
immer wieder. Und nicht immer zu meiner Freude ;-)

von Bernd N (Gast)


Lesenswert?

Google mal nach Speichermodel 8051.

The idata memory type may be used to declare variables only. You may not 
declare idata functions. This memory is indirectly accessed using 8-bit 
addresses and is the on-chip RAM of the 8051. The amount of idata is 
limited in size (to 256 bytes or less). The lower addresses of idata 
overlap the corresponding addresses of data memory.

Variables declared idata are located in the IDATA memory class.

von Peter D. (peda)


Lesenswert?

Mark Brandis schrieb:
> Mag auch sein, dass der hier gepostete Code sogar vor C99 entstanden
> ist.

Meine Keil C51 Version ist von 1995.
Läuft nur noch in der DOSBox.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.