Newsgroup: it.comp.lang.c
Titolo: C antico

salve a tutti
ho il seguente problema: sto integrando una mia libreria (in ambiente DOS)
che gestiva file (dbf e formati proprietari) indicizzati tramite un btree
trovato su internet sui siti simtel. Sono archivi che si trovano in un
distributore automatico che monta dentro di se un vecchio 286 (che non si
può sostituire...ecco perché uso il TC per DOS) prima i circa 150.000 record
erano indicizzati con un AVL completamente caricato in memoria (fino a 50000
reggeva ... poi...); con questo btree è invece possibile caricare in memoria
dal disco solo le pagine che effettivamente servono a fare la ricerca
(....altrimenti che razza di btree sarebbe....)
E'  una "vecchia" libreria in C dal nome "bplus11.zip", l'ho analizzata per
circa 5/6 giorni e devo dire che potrebbe fare al caso mio (e anche di
altri) ... è fatta decisamente bene....l'unica pecca sono le dischiarazione
delle funzioni.
nel file bplus.c si trova na roba del genere
**********
#include "bplus.h"
...
..
int cdecl open_index (name,pix,dup)
    char *name;
    IX_DESC *pix;
    int dup;
{
......    e altre 20 funzioni dichiarate analogamente
}
*********
il file bplus.h recita :
...
..
int cdecl open_index (char *, IX_DESC *, int);
...
....    idem con patate per le altre 20 funzioni
*********
mentre il file d'esempio vtest.c :
#include "bplus.h"
...
main ()
{
....
open_index(&path, &nomeindice,1);
....
}
********
sto compilando tutto con il TC/C++ 3.0 ( ...purtroppo...) in fase di
compilazione del vtest.c tutto OK ... ma quando si va a linkare non vengono
trovate le funzioni con il seguente messaggio :
undefined simbol  _open_index(char near*, IX_DESC near*, int ) in module
"d:\tc30\btree\vtest.c"
le ho provate di tutte
1) ho messo l'#include <bplus.h> e ho registrato la directory giusta nella
configurazione dell'ide
2) ho messo l'#include "d:\tc30\btree\"
3) ho "fuso" bplus.c e bplus.h in un unico file bplus.c
4) ho creato l'obj e poi ne ho fatto una lib
booo!
il fatto è che da qualche anno sviluppo "solo" in VB e in C++Bld e non mi
ricordo granché del passaggio di funzioni extern, pascal. cdecl, ecc....
comunque anche la dischiarazione della funzione ... tipo
int cdecl open_index (name,pix,dup)
    char *name;
    IX_DESC *pix;
    int dup;
non mi piace molto e anche il compilatore me la segnala come "stile
antiquato" .... in ogni caso compila tutto .... e solo il link che ha
problemi.
Ho pure tentato di contattare ...cercandolo su internet ..... l'autore ...
ma non ne esiste traccia
se qualcuno mi sa dare una mano vi posso postare il file zip e ci lavoriamo
assieme, per chi ha bisogno di indicizzare centinaia di migliaia di chiavi è
l'ideale ... ve la consiglierei ... se funzionasse..... se poi ne conoscete
di altre ... funzionanti....  su altri siti la cosa è gradita ;-)
grazie

 "d:\tc30\btree\vtest.c"
Non conosco benissimo il C, e quindi forse sto per dire una
stupidaggine, pero' ci provo: se l'errore te lo da' in fase di linking e
non in fase di compilazione, allora significa che il .h e il .c sono ok,
o sbaglio? Di solito l'errore di linking lo da' quando non trova il
codice oggetto con i simboli che cerca; se il compilatore non
comprendesse quelle dichiarazioni, ti darebbe errore in fase di
compilazione.
Spero di non aver detto la c*****a del secolo :))
Ciao!
-- 
Fabio Costa a.k.a. Ph0ton
--------------------------------------------------------------------
  Referente AGI - Sezione di Milano   Impaginatore capo di AmiWorld 
  Membro del MusicPlanet Musicgroup       (
http://amiga.eden.it
)    
     (
games.eden.it/musicplanet
)           Musician dei Genesis     
--------------------------------------------------------------------

 
tu chiaramente linki vtest.obj ed bplus.obj ?
o al linker viene detto di 'linkare' solo vtest.obj con le librerie ?
usi un comando del tipo:
tlink vtest.obj bplus.obj ..... 
P.S. mi sembra di aver usato molto tempo fa le stesse librerie sotto TC
2.0
e c'era un noioso problema dovuto al funzionamento discutibile di una
funzione della serie mem* , forse era la memcopy che non funziona
'correttamente' su aree di memoria sovrapposte
se hai dei problemi prova a controllare dove viene usata

 wrote in message
39744A...@na.astro.it...


 TC2.0 ... come hai fatto?
non me lo rocordo e' passato troppo tempo, e forse ho addirittura
alienato i sorgenti
comunque ricapitolando hai due possibilita'
1) tramite i soli file .obj
tcc bplus.c
tcc vtest.c
tlink vtest.obj bplus.obj
ai comando tcc e tlink devi aggiungere gli switch necessari (modello ,
path degli include )
attento inoltre ai path dove si trovano i vari file, magari ti tocca
psecificarli se non sono nella directory corrente
2) tramite .lib
tcc bplus.c
tlib ( qui non ricordo la sintassi per chreare il flie .lib
tcc vtest.c
tlink vtest.obj bplus.lib
tieni conto che se bplus.c contiene TUTTE le funzioni creare la libreria
e' perfettamante inutile in quanto viene comunque incluso dal linker
completamente.