나는 c에서 scheme을 구현하는 크로스 컴파일러를 구현하려고한다. 이것을 위해 나는 단점과리스트를 사용하여 기본 스키마 구조를 구현하려고합니다. 아래에 표시된 코드는 죄수 용입니다. consed 객체가 정수이고 다른 consed 객체가 아닌 경우 엔 car에 액세스 할 수 없습니다.정수 인 경우이 코드에서 consed 오브젝트에 대해 car와 cdr을 어떻게 인쇄 할 수 있습니까?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef enum
{PAIR, NUMBER} object;
typedef struct node cons_object;
struct node {
object type;
union
{
int i;
float f;
char* string;
struct pair {
cons_object* car;
cons_object* cdr;
} pair;
} data;
};
cons_object* cons(cons_object* x, cons_object* y)
{
cons_object* obj;
obj = malloc(sizeof(cons_object*));
obj->type = PAIR;
obj->data.pair.car = x;
obj->data.pair.cdr = y;
return obj; /*returns the pointer car*/
}
cons_object* car(cons_object* list) /*takes in a consed object*/
{
cons_object* y;
y = list->data.pair.car;
return y; /* returns the pointer of another consed object */
}
cons_object* cdr(cons_object* list)
{
cons_object* z;
z = list->data.pair.cdr;
return z; /* returns the pointer of another consed object */
}
void eval_cons(cons_object* pair)
{
cons_object* first;
cons_object* second;
int *a; /* An integer type pointer to dereference the values returned by car and cdr pointers */
first = car(pair);
second = cdr(pair);
{
if(first->type == PAIR){
eval_cons(first); // If car is a cons-ed object, it is again sent to the eval function
}
else
{
a = (int *)&first; /* tried type casting too */
printf("%d",*a);
}
}
if(second->type == PAIR)
eval_cons(second); // If cdr is a cons-ed object, it is again sent to the eval function
else
{
a = (int *)&second;
printf("%d",*a); // prints the dereferenced value
}
}
// If eval starts working then we could test it from the following sample code:
int main()
{
eval_cons(cons(3,4)); /* cant find a way to access 3 and 4 */
getchar();
return 0;
}
또한
해야한다. 당신이해야 할 일은 정수를 cons 객체로 바꾸는 cons 함수를 만든 다음 cons (cons_object * x/y)를 호출하는 것입니다. 이 두 정수 (3과 4)를 사용하면 cons 객체를 malloc (계속 유지) 한 다음 3,4 쌍을 cons 객체로 변환해야합니다. cons_object * cons (int x, int y) – Magn3s1um
비록 3과 4 consed 객체를 만들지 만, 정수에 접근 할 방법이 없기 때문에 접근 할 수 없습니다.이 경우에는 – user2585933
sizeof (cons_object *)가 잘못되었습니다. 포인터의 크기를 malloc하면 4 또는 8 바이트 (32/64 비트 종속) 만 리턴합니다. 모든 포인터는 주소를 담을 충분한 공간 만 있으면됩니다. 귀하의 구조체 귀하의 구조체의 크기로 malloc'd해야하고, malloc (sizeof (struct cons_object))해야합니다; 그런 다음 포인터 내부에 액세스하면 malloc도 필요합니다. char * 문자열에 값을 넣으려면 충분한 공간을 malloc하고이 주소를 문자열로 반환 한 다음 원하는 위치로 memcpy를 반환해야합니다. cons 포인터와 동일합니다. – Magn3s1um