C -- struct kerdes

Andras Tantos andras_tantos at yahoo.com
Wed Nov 17 19:28:29 CET 2004


Hali!

>Kis memoriaju kontrollerekben nem szivesen generalnek egy
>pointertombot ami a strukturakra mutat, ugyan ez egyszerunek tunik.
>Az ANSI C-ben nem szukseges __modosito elvileg a const is elegendo,
>erre mar ROM-ba kellene forditani, persze lehet az adott implementacio
>igy viselkedik.
>Maga a felhasznalas linearis szerkezetu, ami viszonylag konnyen
>leirhato, de a bovitessel van problemam, szeretnem automatikusan
>kezelni uj ITEM-meket raadasul ezek mindig forditasi idoben tortennek,
>de hatasara sok minden megvaltozik az eszkozben es a bovitesek
>beszurasok is lehetnek. Sajnos ezt ASM-ben tudnam kezelni, de C-ben
>nem latom lehetoseget. Nem szeretnek tipus fuggo kodot generalni a
>programba.
>A MSStudio C/C++ pedig a nem hasznalt constans struktarakat mar
>nem is teszi be a kesz kodba, igy nem nagyon lehet ra hivatkozni :(),
>mindezt optimalizacio nelkul.
>
>  Mindenesetre eddig tapasztalatom szerint nem teljes a kompatibilitas
>
>         Udv
>                                  HG
>Nagyobb ennel a szomorusagom, vagy kecske vagy kaposzta, de
>egeszen mas kell. Szeretnem az ITEM boviteseket automatizalni, de az
>ITEM bovitesek nem a vegere kerulnek, hanem a kozepere

Aha! Most mar ertem mi a problemad :)

Meg lehet ilyesmit is csinalni, bar ezt en mar inkabb a hack-eles 
kategoriaba sorolom. Egy megoldas a ketszeres #include trukk, valahogy igy:

arr.h
======

#ifndef __ARR_H_INCLUDED__

#ifndef __SECOND_INCLUDE__
#define BEGIN_ARRAY(ElementType,ArrayName,ArraySize) __flash const 
ElementType ArrayName[ArraySize] = {
#define DECLARE_ELEMENT(ElementID,ElementValue1,ElementValue2,ElementValue3) 
{ ElementValue1,ElementValue2,ElementValue3 }
#define END_ARRAY }
#else
#define __ARR_H_INCLUDED__
#define BEGIN_ARRAY(ElementType,ArrayName,ArraySize) enum ArrayName##_IDs {
#define DECLARE_ELEMENT(ElementID,ElementValue1,ElementValue2,ElementValue3) 
ElementID
#define END_ARRAY }
#endif

#ifndef __SECOND_INCLUDE__
typedef struct  {
 unsigned char a;
 unsigned char b;
 unsigned int   d;
} ITEM;
#endif

BEGIN_ARRAY(ITEM,Items,3)
 DECLARE_ELEMENT(ItemID1, 'a', 'A', 1 ),
 DECLARE_ELEMENT(ItemID2, 'b', 'B', 2 ),
 DECLARE_ELEMENT(ItemID3, 'c', 'B', 3 )
END_ARRAY;

#ifndef __SECOND_INCLUDE__
#define __SECOND_INCLUDE__
#undef BEGIN_ARRAY
#undef DECLARE_ELEMENT
#undef END_ARRAY
#include __FILE__
#endif

#endif

arr_test.cpp
=============

#include <stdio.h>

#ifdef _MSC_VER
#define __flash
#endif

#include "arr.h"

int main() {
 printf("First element: %c %c %d, mid elemenet: %c %c %d, last element: %c 
%c %d, struct size: %d\n",
  Items[ItemID1].a,
  Items[ItemID1].b,
  Items[ItemID1].d,
  Items[ItemID2].a,
  Items[ItemID2].b,
  Items[ItemID2].d,
  Items[ItemID3].a,
  Items[ItemID3].b,
  Items[ItemID3].d,
  sizeof(ITEM)
 );
}

A trukk az, hogy az arr.h #include-olja sajat magat, de a kulonbozo 
define-ok mas erteket kapnak. Emiatt a
BEGIN_ARRAY ... END_ARRAY resz egyszer a statikus tomb deklaraciojanak, 
masodszor egy enum-nak fordul. Az enum elemei a statikus tomb indexeikent 
hasznalhatok, mint ahogy a pelda is mutatja, es leven szimbolikus nevekkel 
hivatkozol az elemekre (illetve az indexukre) ezert a megoldas erzeketlen a 
sorrendre.

Vagy ez a megoldas meg mindig nem az ami neked kell?

Udv,
Tantos Andras




More information about the Elektro mailing list