Gönderen Konu: C ve Global değişken kullanımı (cc65 ile c64 crossassemble için)  (Okunma sayısı 2392 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
cc65 üzerinde uğraştığım denememde Global değişkenlerle başım dertte.

6502 için C kullanmaya niyetlenenlere performansı arttırmak için integer yerine char değişkenler kullanmak, yerel değişkenlerden kaçınmak, fonksiyonlar arasında değer aktarmak yerine pointer kullanmak vb. öğütleniyor. Ben de tüm bu tavsiyeleri takip ederek bir şeyler karalamaya çalışıyorum.

Oyun taslağımda global olarak erişmek istediğim 4 tane company var. Bunları common.h dosyasında tanımladım.

Kod: [Seç]
//common.h

//Global Variables
struct Company {
unsigned char name[20];
unsigned long balance;
};

struct Company company1;
struct Company company2;
struct Company company3;
struct Company company4;


common.h dosyasını main.c dosyama include ettim.

Kod: [Seç]
//main.c
#include <stdio.h>
#include <conio.h>
#include <string.h>

#include "game.h"
#include "screen.h"
#include "lib.h"
#include "common.h"

main () {

        ...

clrscr();
set_rival();
...

}


main.h dosyasında çağırdığım set_rivals() fonksiyonunun rakip şirketlere rastgele isimler vermesini istiyorum. Bu fonksiyon da game.h ve game.c dosyalarında tanımlı.

Kod: [Seç]
//game.h

extern const char welcome_text[], name_prompt[];

void user_input(char *prompt, char *input_text, unsigned char max, unsigned char num_only);
void print_title_bar(char *name, unsigned short year, unsigned short month, unsigned long balance);
void escape_menu();
void set_rivals();
void print_rivals();



Kod: [Seç]
//game.c

void set_rivals() {
char *name_list[11] = {
"Hatari","GBM","General","Singular","Digital Instruments"
"Omega","MicroBros","Texas Equipments","NEX","Vestel","Arcelik","Didaktik"};

unsigned char r;

extern struct Company company2;

_randomize();
r = rand() % 11;
     
        company2.name = name_list[r];

}


Derlemek istediğimde 'company2.name = name_list[r];' ifadesinin olduğu satırda

game.c(84): Error: Struct/union has no field named `name'Error: Struct/union has no field named `name'

şeklinde hata alıyorum. Buradan set_rivals'ın içinden company2.name'e erişemediğimi çıkarıyorum. Ancak sorunu nasıl çözeceğimi bilemedim. Tavsiyelerinize açığım.

Gosub ile gidilen yerden goto ile dönen adam

Çevrimdışı Alpyre

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 106
game.c'de,
Kod: [Seç]
#include "common.h"satırını yazmayı unutmuş olamazsın değil mi?

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
ld65: Warning: Duplicate external identifier: `_company4'
ld65: Warning: Duplicate external identifier: `_company3'
ld65: Warning: Duplicate external identifier: `_company2'
ld65: Warning: Duplicate external identifier: `_company1'

game.c'nin başında common.h'ı include edersem bu sefer "duplicate external identifier" hatası alıyorum. Program derleniyor ancak set_rival()'da assign ettiğim isim main()'de tanımlı olan değişkeni etkilemiyor.
Gosub ile gidilen yerden goto ile dönen adam

Çevrimdışı Alpyre

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 106
company? değişkenlerini common.h'de extern olarak deklare etsen (ki bu gerekiyorsa),
game.c'de de global değişken olarak deklare etsen olur aslında.

Çevrimdışı nightlord

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 389
    • Night Network
Evet global değişken deklerasyonu header dosyasında yapılmaz. Yapılırsa, birden fazla yerden o header include edildiğinde duplicate problemi olur. Bunun yerine değişkeni header dosyasında forward-declare edip yalnızca bir .c dosyasında deklare etmek gerekiyor. Başka bir deyişle:

Birden fazla dosyadan erişilmesi gereken globallerle çalışmak için:

header dosyasında:

extern Company company1;


sadece bir adet .c dosyasında:

Company company1;

şeklinde deklare etmen lazım

sonra başka bir .c dosyasında company1 kullanmak istenirse orada header include edilecek (veya extern Company company1 diye tekrar forward-declare edilebilir). ve ardından da company.name'e erişebileceksin.


Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
Cevaplarınız için teşekkürler. Aşağıdaki gibi çözdüm.

Kod: [Seç]
//common.h

#ifndef GLOB_VARS
#define GLOB_VARS

//Global Variables
struct Company {
unsigned char name[20];
unsigned long balance;
};

extern struct Company company[4];
extern unsigned short year;
extern unsigned short month;

...

#endif

Kod: [Seç]
//main.c

#include <stdio.h>
#include <conio.h>
#include <string.h>

#include "game.h"
#include "screen.h"
#include "lib.h"
#include "common.h"

//Global variables
struct Company company[4];
unsigned short year;
unsigned short month;

...

Gosub ile gidilen yerden goto ile dönen adam