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